ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MDZiZDMKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNSBAQAorKi5qYXIKKyouY2xhc3MKKy9iaW4vYW0yai5wbGoKKy9iaW4vcGwyYW0ucGxqCisvZG9jL2phdmFkb2MKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNkZTFkNwotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsMTE1IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE1ha2VmaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFBST0xPRyAtIHRoZSBjb21tYW5kIG9mIFByb2xvZyBzeXN0ZW0gCisjICAgICAgICA6Oj0gc2ljc3R1cyB8IHN3aXBsIHwgcGwgfCBwcm9sb2cgfCAuLi4KKyMgUFNZU1RFTS0gdGhlIHR5cGUgb2YgUHJvbG9nIHN5c3RlbSAKKyMgICAgICAgIDo6PSAnU0lDU3R1cycgfCAnU1dJLVByb2xvZycgfCAnT3RoZXJzJworCitQUk9MT0cgID0gc2ljc3R1cworUFNZU1RFTSA9ICdTSUNTdHVzJworIyBQUk9MT0cgID0gc3dpcGwKKyMgUFNZU1RFTSA9ICdTV0ktUHJvbG9nJworIyBQUk9MT0cgID0gcHJvbG9nCisjIFBTWVNURU0gPSAnT3RoZXJzJworCitKQVZBICAgICAgPSBqYXZhCitKQVZBQyAgICAgPSBqYXZhYworSkFWQUNPUFRTID0gLWQgLiAtSi1YbXgxMDBtCitKQVIgICAgICAgPSBqYXIKK0pBUk9QVFMgICA9IGNmCisKK1BXRCA6PSAkKHNoZWxsIHB3ZCkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2FsbDogcGxjIGxhbmcgYnVpbHRpbiBjb21waWxlciBwbGNhZmUgcGxqCisKK3BsYzoKKwkoY2Qgc3JjL2NvbXBpbGVyOyAkKE1BS0UpIHBsYyBcCisJUFJPTE9HPSckKFBST0xPRyknIFBTWVNURU09JyQoUFNZU1RFTSknKQorCWNwIHNyYy9jb21waWxlci9wbDJhbS5wbGMgYmluLworCWNwIHNyYy9jb21waWxlci9hbTJqLnBsYyBiaW4vCisKK2xhbmc6CisJKGNkIHNyYy9sYW5nOyAkKE1BS0UpIGxhbmcgXAorCUpBVkFDPSckKEpBVkFDKScgSkFWQUNPUFRTPSckKEpBVkFDT1BUUyknIFwKKwlKQVI9JyQoSkFSKScgSkFST1BUUz0nJChKQVJPUFRTKScpCisJY3Agc3JjL2xhbmcvbGFuZy5qYXIgLgorCitidWlsdGluOgorCShjZCBzcmMvYnVpbHRpbjsgJChNQUtFKSBidWlsdGluIFwKKwlKQVZBQz0nJChKQVZBQyknIEpBVkFDT1BUUz0nJChKQVZBQ09QVFMpIC1jbGFzc3BhdGggJChQV0QpL2xhbmcuamFyJyBcCisJSkFSPSckKEpBUiknIEpBUk9QVFM9JyQoSkFST1BUUyknKQorCWNwIHNyYy9idWlsdGluL2J1aWx0aW4uamFyIC4KKworY29tcGlsZXI6CisJKGNkIHNyYy9jb21waWxlcjsgJChNQUtFKSBjb21waWxlciBcCisJSkFWQUM9JyQoSkFWQUMpJyBcCisJSkFWQUNPUFRTPSckKEpBVkFDT1BUUykgLWNsYXNzcGF0aCAkKFBXRCkvbGFuZy5qYXI6JChQV0QpL2J1aWx0aW4uamFyJyBcCisJSkFSPSckKEpBUiknIEpBUk9QVFM9JyQoSkFST1BUUyknKQorCWNwIHNyYy9jb21waWxlci9jb21waWxlci5qYXIgLgorCitwbGNhZmU6CisJJChKQVZBQykgJChKQVZBQ09QVFMpIHNyYy9sYW5nLyouamF2YSBzcmMvYnVpbHRpbi8qLyouamF2YSBcCisJc3JjL2NvbXBpbGVyL3BsMmFtLyouamF2YSBzcmMvY29tcGlsZXIvYW0yai8qLmphdmEgc3JjL2NvbXBpbGVyL0NvbXBpbGVyLmphdmEKKwkkKEpBUikgJChKQVJPUFRTKSBwbGNhZmUuamFyIGpwL2FjL2tvYmVfdS9jcy9wcm9sb2cKKworcGxqOgorCShjZCBzcmMvY29tcGlsZXI7ICQoTUFLRSkgcGxqIFBST0xPRz0nJChKQVZBKScpCisJY3Agc3JjL2NvbXBpbGVyL3BsMmFtLnBsaiBiaW4vCisJY3Agc3JjL2NvbXBpbGVyL2FtMmoucGxqIGJpbi8KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2NsZWFuOgorCShjZCBzcmMvYnVpbHRpbjsgJChNQUtFKSBjbGVhbikKKwkoY2Qgc3JjL2xhbmc7ICQoTUFLRSkgY2xlYW4pCisJKGNkIHNyYy9jb21waWxlcjsgJChNQUtFKSBjbGVhbikKKwktcm0gLWYgYmluL3BsMmFtLnBsYworCS1ybSAtZiBiaW4vYW0yai5wbGMKKwktcm0gLWYgLXIganAKKwktcm0gLWYgY29yZSAqfgorCityZWFsY2xlYW46IGNsZWFuCisJKGNkIHNyYy9idWlsdGluOyAkKE1BS0UpIHJlYWxjbGVhbikKKwkoY2Qgc3JjL2xhbmc7ICQoTUFLRSkgcmVhbGNsZWFuKQorCShjZCBzcmMvY29tcGlsZXI7ICQoTUFLRSkgcmVhbGNsZWFuKQorCS1ybSAtZiAtciBkb2MvamF2YWRvYworCS1ybSAtZiBiaW4vcGwyYW0ucGxqCisJLXJtIC1mIGJpbi9hbTJqLnBsagorCS1ybSAtZiBwbGNhZmUuamFyCisJLXJtIC1mIGNvbXBpbGVyLmphcgorCS1ybSAtZiBidWlsdGluLmphcgorCS1ybSAtZiBsYW5nLmphcgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZXg6CisJKGNkIGV4YW1wbGVzOyAgJChNQUtFKSBhbGwpCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitKQVZBRE9DICAgICAgPSBqYXZhZG9jCitKQVZBRE9DT1BUUyAgPSAtSi1YbXgxMDBtIFwKKwkgICAgICAgLWxvY2FsZSBlbl9VUyAtZCBkb2MvamF2YWRvYyAtYnJlYWtpdGVyYXRvciBcCisgICAgICAgICAgICAgICAtd2luZG93dGl0bGUgJChXSU5ET1dUSVRMRSkgLWRvY3RpdGxlICQoRE9DVElUTEUpIFwKKyAgICAgICAgICAgICAgIC1oZWFkZXIgJChIRUFERVIpIC1ib3R0b20gJChCT1RUT00pCisKK1dJTkRPV1RJVExFICA9ICdQcm9sb2cgQ2FmZSB2MS4yIEFQSSBTcGVjaWZpY2F0aW9uJworRE9DVElUTEUgICAgID0gJ1Byb2xvZyBDYWZlIHYxLjIgQVBJIFNwZWNpZmljYXRpb24nCitIRUFERVIgICAgICAgPSAnPGI+PGZvbnQgY29sb3I9InJlZCI+UHJvbG9nIENhZmUgdjEuMjwvZm9udD48L2I+PGJyPicKK0JPVFRPTSAgICAgICA9ICc8Zm9udCBzaXplPSItMSI+IFwKKyAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDkgXAorICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8va2FtaW5hcmkuaXN0Yy5rb2JlLXUuYWMuanAvYmFuYmFyYS5odG1sIj5NLkJBTkJBUkE8L2E+IGFuZCBcCisgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9iYWNoLmlzdGMua29iZS11LmFjLmpwL3RhbXVyYS5odG1sIj5OLlRBTVVSQTwvYT4gXAorICAgICAgICAgICAgICAgPC9mb250PicKKworamF2YWRvYzogCisJJChKQVZBRE9DKSAkKEpBVkFET0NPUFRTKSBzcmMvbGFuZy8qLmphdmEgXAorCXNyYy9jb21waWxlci9Db21waWxlci5qYXZhCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitWRVIgPSAxLjIuNQorRElSID0gUHJvbG9nQ2FmZSQoVkVSKQorVEdaID0gUHJvbG9nQ2FmZSQoVkVSKS50Z3oKK1pJUCA9IFByb2xvZ0NhZmUkKFZFUikuemlwCisKK3RhcjogY2xlYW4KKwkoY2QgLi47IHRhciBjZnogJChESVIpLyQoVEdaKSAkKERJUikvKikKKworemlwOiBjbGVhbgorCShjZCAuLjsgemlwIC1yICQoRElSKS8kKFpJUCkgJChESVIpLyopCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEVORApkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZmRjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUKQEAgLTAsMCArMSwxOSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICBSRUFETUUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworKiBQcm9sb2cgQ2FmZSBXZWIgUGFnZQorICBodHRwOi8va2FtaW5hcmkuaXN0Yy5rb2JlLXUuYWMuanAvUHJvbG9nQ2FmZS8KKworKiBJbnN0YWxsCisgIGh0dHA6Ly9rYW1pbmFyaS5pc3RjLmtvYmUtdS5hYy5qcC9Qcm9sb2dDYWZlL2luc3RhbGxfZW4uaHRtbAorCisqIFByb2xvZyBDYWZlIFVzZXIgTWFudWFsCisgIGh0dHA6Ly9rYW1pbmFyaS5pc3RjLmtvYmUtdS5hYy5qcC9Qcm9sb2dDYWZlL21hbnVhbF9lbi5odG1sCisKKyogUHJvbG9nIENhZmUgQVBJIFNwZWNpZmljYXRpb24KKyAgLi9kb2MvamF2YWRvYy9pbmRleC5odG1sCisKKy0tCitNdXRzdW5vcmkgQkFOQkFSQQorCmRpZmYgLS1naXQgYS9iaW4vcGxjYWZlIGIvYmluL3BsY2FmZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YTE5YmExCi0tLSAvZGV2L251bGwKKysrIGIvYmluL3BsY2FmZQpAQCAtMCwwICsxLDk5IEBACisjISAvdXNyL2Jpbi9wZXJsIAorcmVxdWlyZSAnZ2V0b3B0cy5wbCc7Cit1c2UgR2V0b3B0OjpMb25nOwordXNlIHN0cmljdDsKKworbXkgQG9wdGxpc3QgPSAoImh8aGVscCEiLCJ2fHZlcmJvc2UhIiwiY3B8Y2xhc3NwYXRoPXMiLCJKPXMiLCAidHx0b3BsZXZlbD1zIiwgInJ0fHJ1bnRpbWUhIik7CitteSAkcmVzdWx0ID0gR2V0T3B0aW9ucyBAb3B0bGlzdDsKK291ciAoJG9wdF9oLCAkb3B0X3YsICRvcHRfY3AsICRvcHRfSiwgJG9wdF90LCAkb3B0X3J0KTsKKworIyAtaCBvcHRpb24gCitpZiAoJG9wdF9oKSB7IAorICAgIHVzYWdlKCk7ICAKKyAgICBleGl0IDE7Cit9CisKKyMgbG9jYWwgdmFyaWFibGVzCitteSAkamF2YSA9ICJqYXZhIjsKK215ICRjbGFzc3BhdGg7CitteSAkb3B0czsKK215ICRjbGFzczsKK215IEBhcmdzOworCisjIHNldCAkY2xhc3MgYW5kIEBhcmdzCitpZiAoJG9wdF90KSB7CisgICAgaWYgKEBBUkdWID4gMCkgeworCXVzYWdlKCk7ICAKKwlleGl0IDE7CisgICAgfSBlbHNlIHsgIyAkb3B0X3QgJiYgQEFSR1YgPD0gMAorCSRjbGFzcyA9ICJqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuUHJvbG9nTWFpbiI7CisJQGFyZ3MgID0gKCRvcHRfdCk7CisgICAgfQorfSBlbHNpZiAoQEFSR1YgPiAwKSB7ICMgISRvcHRfdCAmJiBAQVJHViA+IDAKKyAgICAoJGNsYXNzLCBAYXJncykgPSBAQVJHVjsKK30gZWxzZSB7ICMgISRvcHRfdCAmJiBAQVJHViA8PSAwCisgICAgJGNsYXNzID0gImpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy5Qcm9sb2dNYWluIjsKKyAgICBAYXJncyAgPSAianAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOmNhZmV0ZXJpYSI7Cit9CisKKyMgc2V0ICRjbGFzc3BhdGgKKyRjbGFzc3BhdGggPSAiXCRQTENBRkVESVIvcGxjYWZlLmphciI7CitpZiAoJG9wdF9ydCkgeworICAgICRjbGFzc3BhdGggPSAiXCRQTENBRkVESVIvbGFuZy5qYXI6XCRQTENBRkVESVIvYnVpbHRpbi5qYXIiOworfSAKKyRjbGFzc3BhdGggLj0gIjpcJENMQVNTUEFUSCI7CitpZiAoJG9wdF9jcCkgeyAjIC1jcCBvcHRpb24KKyAgICAkY2xhc3NwYXRoID0gIiRvcHRfY3A6JGNsYXNzcGF0aCI7Cit9IAorIyRjbGFzc3BhdGggPSAiLjokY2xhc3NwYXRoIjsKKworIyBzZXQgJG9wdHMKK2lmICgkb3B0X0opIHsgIyAtSiBvcHRpb24KKyAgICBpZiAoJG9wdF9KID1+IC8oLWNwfC1jbGFzc3BhdGgpXHMrLykgeworCSZlcnJvcigiY2FuIG5vdCB1c2UgJDEgaW4gLUogb3B0aW9uIik7CisgICAgfQorICAgICRvcHRzIC49ICRvcHRfSjsKK30KKworbXkgJGNtZCA9ICIkamF2YSAkb3B0cyAtY3AgJGNsYXNzcGF0aCAkY2xhc3MgQGFyZ3MiOworJm1lc3NhZ2UoIntFbmpveSBQcm9sb2cgQ2FmZSF9Iik7CismbWVzc2FnZSgkY21kKTsKK3N5c3RlbSgkY21kKSAmJiBlcnJvcigibGF1bmNoaW5nIGZhaWxzIik7CismbWVzc2FnZSgie1RoYW5rIHlvdSBmb3IgdXNpbmcgUHJvbG9nIENhZmUhfVxuIik7CisKK2V4aXQgMDsKKworc3ViIHVzYWdlIHsKKyAgICBwcmludCAiXG5Vc2FnZTogJDAgWy1vcHRpb25zXSBbY2xhc3NdIFthcmdzLi4uXVxuIjsKKyAgICBwcmludCAiXG4iOworICAgIHByaW50ICJ3aGVyZSBvcHRpb25zIHN1cHBvcnQ6XG5cbiI7CisgICAgcHJpbnQgIlx0LWggLWhlbHAgICAgICAgICA6IHByaW50IHRoaXMgaGVscFxuIjsKKyAgICBwcmludCAiXHQtdiAtdmVyYm9zZSAgICAgIDogZW5hYmxlIHZlcmJvc2Ugb3V0cHV0XG4iOworICAgIHByaW50ICJcdC1jcCAtY2xhc3NwYXRoIDxjbGFzcyBzZWFyY2ggcGF0aCBvZiBkaXJlY3RvcmllcyBhbmQgemlwL2phciBmaWxlcz5cbiI7CisgICAgcHJpbnQgIlx0ICAgICAgICAgICAgICAgICA6IEEgOiBzZXBhcmF0ZWQgbGlzdCBvZiBkaXJlY3RvcmllcyBhbmQgemlwL2phciBmaWxlcy5cbiI7CisgICAgcHJpbnQgIlx0LXJ0IC1ydW50aW1lICAgICA6IGJvb3QgYSBydW50aW1lIGVudmlyb25tZW50LFxuIjsKKyAgICBwcmludCAiXHQgICAgICAgICAgICAgICAgIDogbm90IGluY2x1ZGluZyBjb21waWxlciBzeXN0ZW1cbiI7CisgICAgcHJpbnQgIlx0LXQgLXRvcGxldmVsIDxwcmVkaWNhdGUgbmFtZSBwb3NzaWJseSB3aXRoIHBhY2thZ2UgbmFtZT5cbiI7CisgICAgcHJpbnQgIlx0ICAgICAgICAgICAgICAgICA6IHNldCB0b3BsZXZlbCBnb2FsIGxpbWl0ZWQgdG8gYXRvbVxuIjsKKyAgICBwcmludCAiXHQgICAgICAgICAgICAgICAgIDogKGV4LiAtdCBtYWluKVxuIjsKKyAgICBwcmludCAiXHQgICAgICAgICAgICAgICAgIDogKGV4LiAtdCBwYWNrYWdlOm1haW4pXG4iOworICAgIHByaW50ICJcdCAgICAgICAgICAgICAgICAgOiBOb3RlIHRoYXQgY2xhc3MgYW5kIGFyZ3MgbXVzdCBiZSBlbXB0eS5cbiI7CisgICAgcHJpbnQgIlx0LUogb3B0aW9uICAgICAgICA6IG9wdGlvbiBtdXN0IGJlIGVuY2xvc2VkIGJ5ICcuXG4iOworICAgIHByaW50ICJcdCAgICAgICAgICAgICAgICAgOiBwYXNzIG9wdGlvbiB0byB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmVcbiI7CisgICAgcHJpbnQgIlx0ICAgICAgICAgICAgICAgICA6IChleC4gLUogJy1YbXgxMDBtIC12ZXJib3NlOmdjJylcbiI7CisgICAgcHJpbnQgIlxuIjsKK30KKworc3ViIG1lc3NhZ2UgeworICAgIG15ICgkeCkgPSBAXzsKKyAgICBpZiAoJG9wdF92KSB7ICMgY2hlY2sgLXYgb3B0aW9uCisJcHJpbnQgIlwlICR4XG4iOworICAgIH0KK30KKworc3ViIGVycm9yIHsKKyAgICBteSAoJHgpID0gQF87CisgICAgcHJpbnQgIlwlIEVSUk9SOiAkeDogJDBcbiI7CisgICAgZXhpdCgxKTsKK30KKwpkaWZmIC0tZ2l0IGEvYmluL3BsY29tcCBiL2Jpbi9wbGNvbXAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjVkNzY5YwotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9wbGNvbXAKQEAgLTAsMCArMSw5MyBAQAorIyEgL3Vzci9iaW4vcGVybAorcmVxdWlyZSAnZ2V0b3B0cy5wbCc7Cit1c2Ugc3RyaWN0OwordXNlIEdldG9wdDo6TG9uZzsKKworIyBvcHRpb25zCitteSBAb3B0bGlzdCA9ICgiaHxoZWxwISIsInZ8dmVyYm9zZSEiLCJkPXMiLCJKPXMiLCJjcHxjbGFzc3BhdGg9cyIsIkM9cyIpOworbXkgJHJlc3VsdCA9IEdldE9wdGlvbnMgQG9wdGxpc3Q7CitvdXIgKCRvcHRfaCwgJG9wdF92LCAkb3B0X2QsICRvcHRfSiwkb3B0X2NwLCAkb3B0X0MpOworCisjIC1oIG9wdGlvbiB8fCBjaGVjayB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cworaWYgKCRvcHRfaCB8fCBAQVJHViA8IDEgKSB7CisgICAgdXNhZ2UoKTsKKyAgICBleGl0IDE7Cit9CisKKyMgdmFyaWFibGVzIAorbXkgJHBsamF2YSAgICAgICA9ICJwbGphdmEiOworbXkgJHBsamF2YV9vcHRzICA9ICIiOworbXkgJHBsamF2YWMgICAgICA9ICJwbGphdmFjIjsKK215ICRwbGphdmFjX29wdHMgPSAiIjsKK215ICRqYXZhX2Rlc3QgICAgPSAiLiI7CisKK2lmICgkb3B0X3YpIHsgIyAtdiBvcHRpb24KKyAgICAkcGxqYXZhX29wdHMgIC49ICIgLXYiOworICAgICRwbGphdmFjX29wdHMgLj0gIiAtdiI7Cit9CisKK2lmICgkb3B0X2QpIHsgIyAtZCBvcHRpb24KKyAgICBpZiAoISAtZCAkb3B0X2QpIHsgCisJJm1lc3NhZ2UoIm1rZGlyICRvcHRfZCwgMDc3NyIpOworCW1rZGlyICRvcHRfZCwgMDc3NyB8fCAmZXJyb3IoImNhbiBub3QgbWtkaXIgJG9wdF9kIik7CisgICAgfQorICAgICRqYXZhX2Rlc3QgPSAkb3B0X2Q7Cit9CisKK2lmICgkb3B0X0opIHsgIyAtSiBvcHRpb24KKyAgICAkcGxqYXZhX29wdHMgLj0gIiAtSiAnJG9wdF9KJyI7Cit9CisKK2lmICgkb3B0X2NwKSB7ICMgLWNwIG9wdGlvbgorICAgICRwbGphdmFjX29wdHMgLj0gIiAtY3AgJyRvcHRfY3AnIjsKK30gCisKK2lmICgkb3B0X0MpIHsgIyAtQyBvcHRpb24KKyAgICAkcGxqYXZhY19vcHRzIC49ICIgLUMgJyRvcHRfQyciOworfQorCisjIFByb2xvZyAtLT4gSmF2YQorZm9yZWFjaCBteSAkZmlsZSAoQEFSR1YpIHsKKyAgICBteSAkY21kMSA9ICIkcGxqYXZhICRwbGphdmFfb3B0cyAtZCAkamF2YV9kZXN0ICRmaWxlIjsKKyAgICAmbWVzc2FnZSgkY21kMSk7CisgICAgc3lzdGVtKCRjbWQxKSAmJiBlcnJvcigiJGNtZDEgZmFpbHMiKTsKK30KKworIyBKYXZhIC0tPiBDbGFzcworbXkgJGNtZDIgPSAiJHBsamF2YWMgJHBsamF2YWNfb3B0cyAkamF2YV9kZXN0LyouamF2YSI7CismbWVzc2FnZSgkY21kMik7CitzeXN0ZW0oJGNtZDIpICYmIGVycm9yKCIkY21kMiBmYWlscyIpOworCitleGl0IDA7CisKKyMgc3ViCitzdWIgdXNhZ2UgeworICAgIHByaW50ICJcblVzYWdlOiAkMCBbLW9wdGlvbnNdIHByb2xvZy1maWxlIFtwcm9sb2ctZmlsZXNdXG4iOworICAgIHByaW50ICJcbiB3aGVyZSBvcHRpb25zIGluY2x1ZGU6XG4iOworICAgIHByaW50ICJcdC1oIC1oZWxwICAgICAgICAgOiBwcmludCB0aGlzIGhlbHAgbWVzc2FnZVxuIjsKKyAgICBwcmludCAiXHQtdiAtdmVyYm9zZSAgICAgIDogZW5hYmxlIHZlcmJvc2Ugb3V0cHV0XG4iOworICAgIHByaW50ICJcdC1kIGRpcmVjdG9yeSAgICAgOiBzZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBmb3IgamF2YSBmaWxlcy5cbiI7CisgICAgcHJpbnQgIlx0ICAgICAgICAgICAgICAgICA6IG1ha2UgaXQgaWYgbm90IGV4aXN0XG4iOworICAgIHByaW50ICJcdC1KIG9wdGlvbiAgICAgICAgOiBvcHRpb24gbXVzdCBiZSBlbmNsb3NlZCBieSAnLlxuIjsKKyAgICBwcmludCAiXHQgICAgICAgICAgICAgICAgIDogcGFzcyBvcHRpb24gdG8gdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lXG4iOworICAgIHByaW50ICJcdCAgICAgICAgICAgICAgICAgOiAoZXguIC1KICctWG14MTAwbSAtdmVyYm9zZTpnYycpXG4iOworICAgIHByaW50ICJcdC1jcCAtY2xhc3NwYXRoIDxjbGFzcyBzZWFyY2ggcGF0aCBvZiBkaXJlY3RvcmllcyBhbmQgemlwL2phciBmaWxlcz5cbiI7CisgICAgcHJpbnQgIlx0ICAgICAgICAgICAgICAgICA6IEEgOiBzZXBhcmF0ZWQgbGlzdCBvZiBkaXJlY3RvcmllcyBhbmQgemlwL2phciBmaWxlcy5cbiI7CisgICAgcHJpbnQgIlx0LUMgb3B0aW9uICAgICAgICA6IG9wdGlvbiBtdXN0IGJlIGVuY2xvc2VkIGJ5ICcuXG4iOworICAgIHByaW50ICJcdCAgICAgICAgICAgICAgICAgOiBwYXNzIG9wdGlvbiB0byB0aGUgSmF2YSBDb21waWxlclxuIjsKKyAgICBwcmludCAiXHQgICAgICAgICAgICAgICAgIDogKGV4LiAtQyAnLWRlcHJlY2F0aW9uJylcbiI7CisgICAgcHJpbnQgIlxuIjsKK30KKworc3ViIG1lc3NhZ2UgeworICAgIG15ICgkeCkgPSBAXzsKKyAgICBpZiAoJG9wdF92KSB7ICMgY2hlY2sgLXYgb3B0aW9uCisJcHJpbnQgIlwlICR4XG4iOworICAgIH0KK30KKworc3ViIGVycm9yIHsKKyAgICBteSAoJHgpID0gQF87CisgICAgcHJpbnQgIlwlIEVSUk9SOiAkeDogJDBcbiI7CisgICAgZXhpdCgxKTsKK30KZGlmZiAtLWdpdCBhL2Jpbi9wbGphciBiL2Jpbi9wbGphcgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYTQ3NGNkCi0tLSAvZGV2L251bGwKKysrIGIvYmluL3BsamFyCkBAIC0wLDAgKzEsMTAyIEBACisjISAvdXNyL2Jpbi9wZXJsCityZXF1aXJlICdnZXRvcHRzLnBsJzsKK3VzZSBzdHJpY3Q7Cit1c2UgR2V0b3B0OjpMb25nOwordXNlIEZpbGU6OkJhc2VuYW1lOworCisjIG9wdGlvbnMKK215IEBvcHRsaXN0ID0gKCJofGhlbHAhIiwidnx2ZXJib3NlISIsIko9cyIsImNwfGNsYXNzcGF0aD1zIiwiQz1zIik7CitteSAkcmVzdWx0ID0gR2V0T3B0aW9ucyBAb3B0bGlzdDsKK291ciAoJG9wdF9oLCAkb3B0X3YsICRvcHRfSiwgJG9wdF9jcCwgJG9wdF9DKTsKKworIyAtaCBvcHRpb24gfHwgY2hlY2sgdGhlIG51bWJlciBvZiBhcmd1bWVudHMKK2lmICgkb3B0X2ggfHwgQEFSR1YgPCAyICkgeworICAgIHVzYWdlKCk7CisgICAgZXhpdCAxOworfQorCisjIHZhcmlhYmxlcyAKK215ICgkZmlsZSwgQGFyZ3MpID0gQEFSR1Y7CitteSAoJGphcl9maWxlLCAkamFyX3BhdGgsICRqYXJfc3VmZml4KSA9IGZpbGVwYXJzZSgkZmlsZSwgKCIuamFyIikpOworbXkgJHBsY29tcCAgICAgICA9ICJwbGNvbXAiOworbXkgJHBsY29tcF9vcHRzICA9ICIiOworbXkgJGphdmFfZGVzdCAgICA9ICIkamFyX2ZpbGUiOworbXkgJGNsYXNzX2Rlc3QgICA9ICIkamF2YV9kZXN0L2NsYXNzZXMiOworbXkgJGphciAgICAgICAgICA9ICJqYXIiOworbXkgJGphcl9vcHRzICAgICA9ICJjZiAkZmlsZSI7CisKKyMgY2hlY2sgYXJndW1lbnRzCitpZiAoLWQgJGphdmFfZGVzdCkgeworICAgICZlcnJvcigiZGlyZWN0b3J5ICRqYXZhX2Rlc3QgaXMgYWxyZWFkeSBleGlzdC4iKTsKK30KKworaWYgKCRqYXJfc3VmZml4IG5lICIuamFyIikgeworICAgICZlcnJvcigiJGZpbGUgaXMgbm90IHN1ZmZpeGVkIGJ5IC5qYXIiKTsKK30KKworaWYgKCRvcHRfdikgeyAjIC12IG9wdGlvbgorICAgICRwbGNvbXBfb3B0cyAuPSAiIC12IjsKK30KKworaWYgKCRvcHRfSikgeyAjIC1KIG9wdGlvbgorICAgICRwbGNvbXBfb3B0cyAuPSAiIC1KICckb3B0X0onIjsKKyAgICAkamFyX29wdHMgLj0gIiAtSickb3B0X0onIjsKK30KKworaWYgKCRvcHRfY3ApIHsgIyAtY3Agb3B0aW9uCisgICAgJHBsY29tcF9vcHRzIC49ICIgLWNwICckb3B0X2NwJyI7Cit9IAorCitpZiAoJG9wdF9DKSB7ICMgLUMgb3B0aW9uCisgICAgaWYgKCRvcHRfQyA9fiAvLWRccysvKSB7CisJJmVycm9yKCJjYW4gbm90IHVzZSAtZCBpbiAtQyBvcHRpb24iKTsKKyAgICB9CisgICAgJHBsY29tcF9vcHRzIC49ICIgLUMgJy1kICRjbGFzc19kZXN0ICRvcHRfQyciOworfSBlbHNlIHsKKyAgICAkcGxjb21wX29wdHMgLj0gIiAtQyAnLWQgJGNsYXNzX2Rlc3QnIjsKK30KKworJm1lc3NhZ2UoIm1rZGlyICRqYXZhX2Rlc3QsIDA3NzciKTsKK21rZGlyICRqYXZhX2Rlc3QsIDA3NzcgfHwgJmVycm9yKCJjYW4gbm90IG1rZGlyICRqYXZhX2Rlc3QiKTsKKyZtZXNzYWdlKCJta2RpciAkY2xhc3NfZGVzdCwgMDc3NyIpOworbWtkaXIgJGNsYXNzX2Rlc3QsIDA3NzcgfHwgJmVycm9yKCJjYW4gbm90IG1rZGlyICRjbGFzc19kZXN0Iik7CisKK215ICRjbWQxID0gIiRwbGNvbXAgJHBsY29tcF9vcHRzIC1kICRqYXZhX2Rlc3QgQGFyZ3MiOworJm1lc3NhZ2UoJGNtZDEpOworc3lzdGVtKCRjbWQxKSAmJiAmZXJyb3IoIiRjbWQxIGZhaWxzIik7CisKK215ICRjbWQyID0gIiRqYXIgJGphcl9vcHRzIC1DICRjbGFzc19kZXN0IC4iOworJm1lc3NhZ2UoJGNtZDIpOworc3lzdGVtKCRjbWQyKSAmJiAmZXJyb3IoIiRjbWQyIGZhaWxzIik7CisKK2V4aXQgMDsKKworIyBzdWIKK3N1YiB1c2FnZSB7CisgICAgcHJpbnQgIlxuVXNhZ2U6ICQwIFstb3B0aW9uc10gamFyLWZpbGUgcHJvbG9nLWZpbGUgW3Byb2xvZy1maWxlc11cbiI7CisgICAgcHJpbnQgIlxuIHdoZXJlIG9wdGlvbnMgaW5jbHVkZTpcbiI7CisgICAgcHJpbnQgIlx0LWggLWhlbHAgICAgICAgICA6IHByaW50IHRoaXMgaGVscCBtZXNzYWdlXG4iOworICAgIHByaW50ICJcdC12IC12ZXJib3NlICAgICAgOiBlbmFibGUgdmVyYm9zZSBvdXRwdXRcbiI7CisgICAgcHJpbnQgIlx0LUogb3B0aW9uICAgICAgICA6IG9wdGlvbiBtdXN0IGJlIGVuY2xvc2VkIGJ5ICcuXG4iOworICAgIHByaW50ICJcdCAgICAgICAgICAgICAgICAgOiBwYXNzIG9wdGlvbiB0byB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmVcbiI7CisgICAgcHJpbnQgIlx0ICAgICAgICAgICAgICAgICA6IChleC4gLUogJy1YbXgxMDBtIC12ZXJib3NlOmdjJylcbiI7CisgICAgcHJpbnQgIlx0LWNwIC1jbGFzc3BhdGggPGNsYXNzIHNlYXJjaCBwYXRoIG9mIGRpcmVjdG9yaWVzIGFuZCB6aXAvamFyIGZpbGVzPlxuIjsKKyAgICBwcmludCAiXHQgICAgICAgICAgICAgICAgIDogQSA6IHNlcGFyYXRlZCBsaXN0IG9mIGRpcmVjdG9yaWVzIGFuZCB6aXAvamFyIGZpbGVzLlxuIjsKKyAgICBwcmludCAiXHQtQyBvcHRpb24gICAgICAgIDogb3B0aW9uIG11c3QgYmUgZW5jbG9zZWQgYnkgJy5cbiI7CisgICAgcHJpbnQgIlx0ICAgICAgICAgICAgICAgICA6IHBhc3Mgb3B0aW9uIHRvIHRoZSBKYXZhIENvbXBpbGVyXG4iOworICAgIHByaW50ICJcdCAgICAgICAgICAgICAgICAgOiAoZXguIC1DICctZGVwcmVjYXRpb24nKVxuIjsKKyAgICBwcmludCAiXG4iOworfQorCitzdWIgbWVzc2FnZSB7CisgICAgbXkgKCR4KSA9IEBfOworICAgIGlmICgkb3B0X3YpIHsgIyBjaGVjayAtdiBvcHRpb24KKwlwcmludCAiXCUgJHhcbiI7CisgICAgfQorfQorCitzdWIgZXJyb3IgeworICAgIG15ICgkeCkgPSBAXzsKKyAgICBwcmludCAiXCUgRVJST1I6ICR4OiAkMFxuIjsKKyAgICBleGl0KDEpOworfQpkaWZmIC0tZ2l0IGEvYmluL3BsamF2YSBiL2Jpbi9wbGphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjFmZTExZgotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9wbGphdmEKQEAgLTAsMCArMSwxMDUgQEAKKyMhIC91c3IvYmluL3BlcmwKK3JlcXVpcmUgJ2dldG9wdHMucGwnOwordXNlIHN0cmljdDsKK3VzZSBHZXRvcHQ6Okxvbmc7Cit1c2UgRmlsZTo6Q29weTsKKworIyBvcHRpb25zCitteSBAb3B0bGlzdCA9ICgiaHxoZWxwISIsInZ8dmVyYm9zZSEiLCJTISIsImQ9cyIsIko9cyIpOworbXkgJHJlc3VsdCA9IEdldE9wdGlvbnMgQG9wdGxpc3Q7CitvdXIgKCRvcHRfaCwgJG9wdF92LCAkb3B0X1MsICRvcHRfZCwgJG9wdF9KKTsKKworIyAtaCBvcHRpb24gfHwgY2hlY2sgdGhlIG51bWJlciBvZiBhcmd1bWVudHMKK2lmICgkb3B0X2ggfHwgQEFSR1YgPCAxICkgeworICAgIHVzYWdlKCk7CisgICAgZXhpdCAxOworfQorCisjIGxvY2FsIHZhcmlhYmxlcworbXkgJHBsMmFtICAgICAgPSAicGwyYW0ucGxqIjsKK215ICRwbDJhbV9vcHRzID0gIi1PIjsKK215ICRhbV9kZXN0ICAgID0gIi90bXAiOworbXkgJGFtMmogICAgICAgPSAiYW0yai5wbGoiOworbXkgJGFtMmpfb3B0cyAgPSAiIjsKK215ICRqYXZhX2Rlc3QgID0gIi4iOworCisjIC12IG9wdGlvbgoraWYgKCRvcHRfdikgeworICAgICRwbDJhbV9vcHRzIC49ICIgLXYiOworICAgICRhbTJqX29wdHMgIC49ICIgLXYiOworfQorCisjIC1kIG9wdGlvbgoraWYgKCRvcHRfZCkgeworICAgIGlmICghIC1kICRvcHRfZCkgeworCSZlcnJvcigiZGlyZWN0b3J5ICRvcHRfZCBkb2VzIG5vdCBleGlzdC4iKTsKKyAgICB9IGVsc2UgeworCSRqYXZhX2Rlc3QgPSAkb3B0X2Q7CisgICAgfQorfQorCisjIC1KIG9wdGlvbgoraWYgKCRvcHRfSikgeworICAgICRwbDJhbV9vcHRzIC49ICIgLUogJyRvcHRfSiciOworICAgICRhbTJqX29wdHMgIC49ICIgLUogJyRvcHRfSiciOworfQorCitmb3JlYWNoIG15ICRmaWxlIChAQVJHVikgeworICAgIG15ICRmID0gJGZpbGU7CisgICAgJGYgPX4gcy8ucGwkLy9nOworICAgICRmID0gJnVybF9lbmNvZGUoJGYpOworICAgIG15ICRhbV9maWxlID0gIiRhbV9kZXN0LyRmLmFtIjsKKyAgICBteSAkY21kMSA9ICIkcGwyYW0gJHBsMmFtX29wdHMgJGZpbGUgJGFtX2ZpbGUiOworICAgIG15ICRjbWQyID0gIiRhbTJqICRhbTJqX29wdHMgLWQgJGphdmFfZGVzdCAkYW1fZmlsZSI7CisgICAgJm1lc3NhZ2UoIntTVEFSVCB0cmFuc2xhdGluZyAkZmlsZSAtLT4gamF2YX0iKTsKKyAgICAmbWVzc2FnZSgkY21kMSk7CisgICAgc3lzdGVtKCRjbWQxKSAmJiBlcnJvcigiJGNtZDEgZmFpbHMiKTsKKyAgICAmbWVzc2FnZSgkY21kMik7CisgICAgc3lzdGVtKCRjbWQyKSAmJiBlcnJvcigiJGNtZDIgZmFpbHMiKTsKKyAgICBpZiAoJG9wdF9TKSB7CisJJm1lc3NhZ2UoImNvcHkgJGFtX2ZpbGUgdG8gJGphdmFfZGVzdCIpOworCWNvcHkoJGFtX2ZpbGUsICRqYXZhX2Rlc3QpIHx8ICZlcnJvcigiY2FuIG5vdCBjb3B5ICRhbV9maWxlIHRvICRqYXZhX2Rlc3QiKTsKKyAgICB9IGVsc2UgeworCSZtZXNzYWdlKCJ1bmxpbmsgJGFtX2ZpbGUiKTsKKwl1bmxpbmsgJGFtX2ZpbGU7CisgICAgfQorICAgICZtZXNzYWdlKCJ7RU5EIHRyYW5zbGF0aW5nICRmaWxlIC0tPiBqYXZhfVxuIik7Cit9ICAgIAorCitleGl0IDA7CisKKyMgc3ViCitzdWIgdXNhZ2UgeworICAgIHByaW50ICJcblVzYWdlOiAkMCBbLW9wdGlvbnNdIHByb2xvZy1maWxlIFtwcm9sb2ctZmlsZXNdXG4iOworICAgIHByaW50ICJcbiB3aGVyZSBvcHRpb25zIGluY2x1ZGU6XG4iOworICAgIHByaW50ICJcdC1oIC1oZWxwICAgICAgICAgOiBwcmludCB0aGlzIGhlbHAgbWVzc2FnZVxuIjsKKyAgICBwcmludCAiXHQtdiAtdmVyYm9zZSAgICAgIDogZW5hYmxlIHZlcmJvc2Ugb3V0cHV0XG4iOworICAgIHByaW50ICJcdC1TICAgICAgICAgICAgICAgOiBvdXRwdXQgV0FNLWxpa2UgYWJzdHJhY3QgbWFjaGluZSBjb2Rlc1xuIjsKKyAgICBwcmludCAiXHQgICAgICAgICAgICAgICAgIDogdGhlIGZpbGVzIHN1ZmZpZWQgYnkgXCIuYW1cIiBpcyBjcmVhdGVkLlxuIjsKKyAgICBwcmludCAiXHQtZCBkaXJlY3RvcnkgICAgIDogc2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZm9yIGphdmEgZmlsZXMuXG4iOworICAgIHByaW50ICJcdCAgICAgICAgICAgICAgICAgOiBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IG11c3QgYWxyZWFkeSBleGlzdFxuIjsKKyAgICBwcmludCAiXHQtSiBvcHRpb24gICAgICAgIDogb3B0aW9uIG11c3QgYmUgZW5jbG9zZWQgYnkgJy5cbiI7CisgICAgcHJpbnQgIlx0ICAgICAgICAgICAgICAgICA6IHBhc3Mgb3B0aW9uIHRvIHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZVxuIjsKKyAgICBwcmludCAiXHQgICAgICAgICAgICAgICAgIDogKGV4LiAtSiAnLVhteDEwMG0gLXZlcmJvc2U6Z2MnKVxuIjsKKyAgICBwcmludCAiXG4iOworfQorCitzdWIgbWVzc2FnZSB7CisgICAgbXkgKCR4KSA9IEBfOworICAgIGlmICgkb3B0X3YpIHsgIyBjaGVjayAtdiBvcHRpb24KKwlwcmludCAiXCUgJHhcbiI7CisgICAgfQorfQorCitzdWIgZXJyb3IgeworICAgIG15ICgkeCkgPSBAXzsKKyAgICBwcmludCAiXCUgRVJST1I6ICR4OiAkMFxuIjsKKyAgICBleGl0KDEpOworfQorCitzdWIgdXJsX2VuY29kZXsKKyAgICBteSAkeCA9IHNoaWZ0OworICAgICR4ID1+IHMvKFteMC05QS1aYS16XyBdKS8nJScudW5wYWNrKCdIMicsJDEpL2dlOworICAgICR4ID1+IHMvXHMvKy9nOworICAgIHJldHVybiAkeDsKK30KZGlmZiAtLWdpdCBhL2Jpbi9wbGphdmFjIGIvYmluL3BsamF2YWMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWNkZDE2MgotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9wbGphdmFjCkBAIC0wLDAgKzEsNzIgQEAKKyMhIC91c3IvYmluL3BlcmwgCityZXF1aXJlICdnZXRvcHRzLnBsJzsKK3VzZSBHZXRvcHQ6Okxvbmc7Cit1c2Ugc3RyaWN0OworCitteSBAb3B0bGlzdCA9ICgiaHxoZWxwISIsInZ8dmVyYm9zZSEiLCJjcHxjbGFzc3BhdGg9cyIsIkM9cyIpOworbXkgJHJlc3VsdCA9IEdldE9wdGlvbnMgQG9wdGxpc3Q7CitvdXIgKCRvcHRfaCwgJG9wdF92LCAkb3B0X2NwLCAkb3B0X0MpOworCisjIC1oIG9wdGlvbiB8fCBjaGVjayB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cworaWYgKCRvcHRfaCB8fCBAQVJHViA8IDEgKSB7CisgICAgdXNhZ2UoKTsKKyAgICBleGl0IDE7Cit9CisKKyMgbG9jYWwgdmFyaWFibGVzCitteSAkamF2YWMgPSAiamF2YWMiOworbXkgJGNsYXNzcGF0aDsKK215ICRvcHRzOworbXkgJGZpbGVzOworCisjIHNldCAkY2xhc3NwYXRoCiskY2xhc3NwYXRoID0gIlwkUExDQUZFRElSL3BsY2FmZS5qYXI6XCRDTEFTU1BBVEgiOworIyRjbGFzc3BhdGggPSAiXCRQTENBRkVESVIvbGFuZy5qYXI6XCRQTENBRkVESVIvYnVpbHRpbi5qYXI6XCRQTENBRkVESVIvY29tcGlsZXIuamFyOlwkQ0xBU1NQQVRIIjsKK2lmICgkb3B0X2NwKSB7ICMgLWNwIG9wdGlvbgorICAgICRjbGFzc3BhdGggPSAiLjokb3B0X2NwOiRjbGFzc3BhdGgiOworfSAKKworIyBzZXQgJG9wdHMKK2lmICgkb3B0X0MpIHsgIyAtQyBvcHRpb24KKyAgICBpZiAoJG9wdF9DID1+IC8oLWNwfC1jbGFzc3BhdGgpXHMrLykgeworCSZlcnJvcigiY2FuIG5vdCB1c2UgJDEgaW4gLUMgb3B0aW9uIik7CisgICAgfQorICAgICRvcHRzIC49ICRvcHRfQzsKK30KKworIyBzZXQgJGZpbGVzCiskZmlsZXMgPSAiQEFSR1YiOworJGZpbGVzID1+IHMvKFwkKS9cXCQxL2c7CisKK215ICRjbWQgPSAiJGphdmFjICRvcHRzIC1jbGFzc3BhdGggJGNsYXNzcGF0aCAkZmlsZXMiOworJm1lc3NhZ2UoJGNtZCk7CitzeXN0ZW0oJGNtZCkgJiYgZXJyb3IoIiRjbWQgZmFpbHMiKTsKKworZXhpdCAwOworCitzdWIgdXNhZ2UgeworICAgIHByaW50ICJcblVzYWdlOiAkMCBbLW9wdGlvbnNdIFtzb3VyY2UgZmlsZXNdXG4iOworICAgIHByaW50ICJcbiI7CisgICAgcHJpbnQgIndoZXJlIG9wdGlvbnMgc3VwcG9ydDpcblxuIjsKKyAgICBwcmludCAiXHQtaCAtaGVscCAgICAgICAgIDogcHJpbnQgdGhpcyBoZWxwXG4iOworICAgIHByaW50ICJcdC12IC12ZXJib3NlICAgICAgOiBlbmFibGUgdmVyYm9zZSBvdXRwdXRcbiI7CisgICAgcHJpbnQgIlx0LWNwIC1jbGFzc3BhdGggPGNsYXNzIHNlYXJjaCBwYXRoIG9mIGRpcmVjdG9yaWVzIGFuZCB6aXAvamFyIGZpbGVzPlxuIjsKKyAgICBwcmludCAiXHQgICAgICAgICAgICAgICAgIDogQSA6IHNlcGFyYXRlZCBsaXN0IG9mIGRpcmVjdG9yaWVzIGFuZCB6aXAvamFyIGZpbGVzLlxuIjsKKyAgICBwcmludCAiXHQtQyBvcHRpb24gICAgICAgIDogb3B0aW9uIG11c3QgYmUgZW5jbG9zZWQgYnkgJy5cbiI7CisgICAgcHJpbnQgIlx0ICAgICAgICAgICAgICAgICA6IHBhc3Mgb3B0aW9uIHRvIHRoZSBKYXZhIENvbXBpbGVyXG4iOworICAgIHByaW50ICJcdCAgICAgICAgICAgICAgICAgOiAoZXguIC1DICctZGVwcmVjYXRpb24nKVxuIjsKKyAgICBwcmludCAiXG4iOworfQorCitzdWIgbWVzc2FnZSB7CisgICAgbXkgKCR4KSA9IEBfOworICAgIGlmICgkb3B0X3YpIHsgIyBjaGVjayAtdiBvcHRpb24KKwlwcmludCAiXCUgJHhcbiI7CisgICAgfQorfQorCitzdWIgZXJyb3IgeworICAgIG15ICgkeCkgPSBAXzsKKyAgICBwcmludCAiXCUgRVJST1I6ICR4OiAkMFxuIjsKKyAgICBleGl0KDEpOworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvTWFrZWZpbGUgYi9leGFtcGxlcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTQ5NzBjCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvTWFrZWZpbGUKQEAgLTAsMCArMSwyMyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIwlNYWtlZmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworYWxsOgorIwkoY2QgYmVuY2htYXJrczsgJChNQUtFKSBhbGwpCisJKGNkIGphdmE7ICQoTUFLRSkgYWxsKQorCShjZCBwbGNhZmU7ICQoTUFLRSkgYWxsKQorCShjZCBwcm9sb2c7ICQoTUFLRSkgYWxsKQorCitjbGVhbjoKKwktcm0gLWYgY29yZSAqfgorIwkoY2QgYmVuY2htYXJrczsgJChNQUtFKSBjbGVhbikKKwkoY2QgamF2YTsgJChNQUtFKSBjbGVhbikKKwkoY2QgcGxjYWZlOyAkKE1BS0UpIGNsZWFuKQorCShjZCBwcm9sb2c7ICQoTUFLRSkgY2xlYW4pCisKK3JlYWxjbGVhbjoKKwktcm0gLWYgY29yZSAqfgorIwkoY2QgYmVuY2htYXJrczsgJChNQUtFKSByZWFsY2xlYW4pCisJKGNkIGphdmE7ICQoTUFLRSkgcmVhbGNsZWFuKQorCShjZCBwbGNhZmU7ICQoTUFLRSkgcmVhbGNsZWFuKQorCShjZCBwcm9sb2c7ICQoTUFLRSkgcmVhbGNsZWFuKQorCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzLy5naXRpZ25vcmUgYi9leGFtcGxlcy9iZW5jaG1hcmtzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdlNzRiMAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIgQEAKKy8qL291dAorL3NyYy8qLnRnegpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9NYWtlZmlsZSBiL2V4YW1wbGVzL2JlbmNobWFya3MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYzYjcwZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvTWFrZWZpbGUKQEAgLTAsMCArMSwxNTEgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMJTWFrZWZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK1BMQ0FGRSAgICAgICA9IHBsY2FmZQorUExDQUZFT1BUUyAgID0gLUogJy1YbXgxMDBtJworUExKQVIgICAgICAgID0gcGxqYXIKK1BMSkFST1BUUyAgICA9IC12IC1KICctWG14MTAwbScgLUMgJy1KLVhteDMwMG0nCisKK1NJQ1NUVVMgICAgICA9IC91c3IvbG9jYWwvYmluL3NpY3N0dXMKK1NJQ1NUVVNPUFRTICA9IAorCitTV0kgICAgICAgICAgPSAvb3B0L2xvY2FsL2Jpbi9zd2lwbAorU1dJT1BUUyAgICAgID0gLUwxMDBtCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitwbGNhZmU6CisJKGNkIGJyYWhtZTsgJChNQUtFKSBwbGNhZmUgXAorCVBMQ0FGRT0nJChQTENBRkUpJyAgIFBMQ0FGRU9QVFM9JyQoUExDQUZFT1BUUyknIFwKKwlQTEpBUj0nJChQTEpBUiknICAgICBQTEpBUk9QVFM9JyQoUExKQVJPUFRTKScgXAorCVNJQ1NUVVM9JyQoU0lDU1RVUyknIFNJQ1NUVVNPUFRTPSckKFNJQ1NUVVNPUFRTKScgXAorCVNXST0nJChTV0kpJyBTV0lPUFRTPSckKFNXSU9QVFMpJykKKworCShjZCBkb2JyeTsgJChNQUtFKSBwbGNhZmUgXAorCVBMQ0FGRT0nJChQTENBRkUpJyBQTENBRkVPUFRTPSckKFBMQ0FGRU9QVFMpJyBcCisJUExKQVI9JyQoUExKQVIpJyBQTEpBUk9QVFM9JyQoUExKQVJPUFRTKScgXAorCVNJQ1NUVVM9JyQoU0lDU1RVUyknIFNJQ1NUVVNPUFRTPSckKFNJQ1NUVVNPUFRTKScgXAorCVNXST0nJChTV0kpJyBTV0lPUFRTPSckKFNXSU9QVFMpJykKKworCShjZCBlY3JjOyAkKE1BS0UpIHBsY2FmZSBcCisJUExDQUZFPSckKFBMQ0FGRSknIFBMQ0FGRU9QVFM9JyQoUExDQUZFT1BUUyknIFwKKwlQTEpBUj0nJChQTEpBUiknIFBMSkFST1BUUz0nJChQTEpBUk9QVFMpJyBcCisJU0lDU1RVUz0nJChTSUNTVFVTKScgU0lDU1RVU09QVFM9JyQoU0lDU1RVU09QVFMpJyBcCisJU1dJPSckKFNXSSknIFNXSU9QVFM9JyQoU1dJT1BUUyknKQorCisJKGNkIGhvbG1lcjsgJChNQUtFKSBwbGNhZmUgXAorCVBMQ0FGRT0nJChQTENBRkUpJyBQTENBRkVPUFRTPSckKFBMQ0FGRU9QVFMpJyBcCisJUExKQVI9JyQoUExKQVIpJyBQTEpBUk9QVFM9JyQoUExKQVJPUFRTKScgXAorCVNJQ1NUVVM9JyQoU0lDU1RVUyknIFNJQ1NUVVNPUFRTPSckKFNJQ1NUVVNPUFRTKScgXAorCVNXST0nJChTV0kpJyBTV0lPUFRTPSckKFNXSU9QVFMpJykKKworCShjZCBtaW5lcnZhOyAkKE1BS0UpIHBsY2FmZSBcCisJUExDQUZFPSckKFBMQ0FGRSknIFBMQ0FGRU9QVFM9JyQoUExDQUZFT1BUUyknIFwKKwlQTEpBUj0nJChQTEpBUiknIFBMSkFST1BUUz0nJChQTEpBUk9QVFMpJyBcCisJU0lDU1RVUz0nJChTSUNTVFVTKScgU0lDU1RVU09QVFM9JyQoU0lDU1RVU09QVFMpJyBcCisJU1dJPSckKFNXSSknIFNXSU9QVFM9JyQoU1dJT1BUUyknKQorCisJKGNkIHBlcmVpcmE7ICQoTUFLRSkgcGxjYWZlIFwKKwlQTENBRkU9JyQoUExDQUZFKScgUExDQUZFT1BUUz0nJChQTENBRkVPUFRTKScgXAorCVBMSkFSPSckKFBMSkFSKScgUExKQVJPUFRTPSckKFBMSkFST1BUUyknIFwKKwlTSUNTVFVTPSckKFNJQ1NUVVMpJyBTSUNTVFVTT1BUUz0nJChTSUNTVFVTT1BUUyknIFwKKwlTV0k9JyQoU1dJKScgU1dJT1BUUz0nJChTV0lPUFRTKScpCisKKwkoY2QgcG9ydGxhbmQ7ICQoTUFLRSkgcGxjYWZlIFwKKwlQTENBRkU9JyQoUExDQUZFKScgUExDQUZFT1BUUz0nJChQTENBRkVPUFRTKScgXAorCVBMSkFSPSckKFBMSkFSKScgUExKQVJPUFRTPSckKFBMSkFST1BUUyknIFwKKwlTSUNTVFVTPSckKFNJQ1NUVVMpJyBTSUNTVFVTT1BUUz0nJChTSUNTVFVTT1BUUyknIFwKKwlTV0k9JyQoU1dJKScgU1dJT1BUUz0nJChTV0lPUFRTKScpCisKKwkoY2QgcXVpbnR1czsgJChNQUtFKSBwbGNhZmUgXAorCVBMQ0FGRT0nJChQTENBRkUpJyBQTENBRkVPUFRTPSckKFBMQ0FGRU9QVFMpJyBcCisJUExKQVI9JyQoUExKQVIpJyBQTEpBUk9QVFM9JyQoUExKQVJPUFRTKScgXAorCVNJQ1NUVVM9JyQoU0lDU1RVUyknIFNJQ1NUVVNPUFRTPSckKFNJQ1NUVVNPUFRTKScgXAorCVNXST0nJChTV0kpJyBTV0lPUFRTPSckKFNXSU9QVFMpJykKKworCShjZCB4cHJvbG9nOyAkKE1BS0UpIHBsY2FmZSBcCisJUExDQUZFPSckKFBMQ0FGRSknIFBMQ0FGRU9QVFM9JyQoUExDQUZFT1BUUyknIFwKKwlQTEpBUj0nJChQTEpBUiknIFBMSkFST1BUUz0nJChQTEpBUk9QVFMpJyBcCisJU0lDU1RVUz0nJChTSUNTVFVTKScgU0lDU1RVU09QVFM9JyQoU0lDU1RVU09QVFMpJyBcCisJU1dJPSckKFNXSSknIFNXSU9QVFM9JyQoU1dJT1BUUyknKQorCithbGw6CisJKGNkIGJyYWhtZTsgJChNQUtFKSBhbGwgXAorCVBMQ0FGRT0nJChQTENBRkUpJyAgIFBMQ0FGRU9QVFM9JyQoUExDQUZFT1BUUyknIFwKKwlQTEpBUj0nJChQTEpBUiknICAgICBQTEpBUk9QVFM9JyQoUExKQVJPUFRTKScgXAorCVNJQ1NUVVM9JyQoU0lDU1RVUyknIFNJQ1NUVVNPUFRTPSckKFNJQ1NUVVNPUFRTKScgXAorCVNXST0nJChTV0kpJyBTV0lPUFRTPSckKFNXSU9QVFMpJykKKworCShjZCBkb2JyeTsgJChNQUtFKSBhbGwgXAorCVBMQ0FGRT0nJChQTENBRkUpJyBQTENBRkVPUFRTPSckKFBMQ0FGRU9QVFMpJyBcCisJUExKQVI9JyQoUExKQVIpJyBQTEpBUk9QVFM9JyQoUExKQVJPUFRTKScgXAorCVNJQ1NUVVM9JyQoU0lDU1RVUyknIFNJQ1NUVVNPUFRTPSckKFNJQ1NUVVNPUFRTKScgXAorCVNXST0nJChTV0kpJyBTV0lPUFRTPSckKFNXSU9QVFMpJykKKworCShjZCBlY3JjOyAkKE1BS0UpIGFsbCBcCisJUExDQUZFPSckKFBMQ0FGRSknIFBMQ0FGRU9QVFM9JyQoUExDQUZFT1BUUyknIFwKKwlQTEpBUj0nJChQTEpBUiknIFBMSkFST1BUUz0nJChQTEpBUk9QVFMpJyBcCisJU0lDU1RVUz0nJChTSUNTVFVTKScgU0lDU1RVU09QVFM9JyQoU0lDU1RVU09QVFMpJyBcCisJU1dJPSckKFNXSSknIFNXSU9QVFM9JyQoU1dJT1BUUyknKQorCisJKGNkIGhvbG1lcjsgJChNQUtFKSBhbGwgXAorCVBMQ0FGRT0nJChQTENBRkUpJyBQTENBRkVPUFRTPSckKFBMQ0FGRU9QVFMpJyBcCisJUExKQVI9JyQoUExKQVIpJyBQTEpBUk9QVFM9JyQoUExKQVJPUFRTKScgXAorCVNJQ1NUVVM9JyQoU0lDU1RVUyknIFNJQ1NUVVNPUFRTPSckKFNJQ1NUVVNPUFRTKScgXAorCVNXST0nJChTV0kpJyBTV0lPUFRTPSckKFNXSU9QVFMpJykKKworCShjZCBtaW5lcnZhOyAkKE1BS0UpIGFsbCBcCisJUExDQUZFPSckKFBMQ0FGRSknIFBMQ0FGRU9QVFM9JyQoUExDQUZFT1BUUyknIFwKKwlQTEpBUj0nJChQTEpBUiknIFBMSkFST1BUUz0nJChQTEpBUk9QVFMpJyBcCisJU0lDU1RVUz0nJChTSUNTVFVTKScgU0lDU1RVU09QVFM9JyQoU0lDU1RVU09QVFMpJyBcCisJU1dJPSckKFNXSSknIFNXSU9QVFM9JyQoU1dJT1BUUyknKQorCisJKGNkIHBlcmVpcmE7ICQoTUFLRSkgYWxsIFwKKwlQTENBRkU9JyQoUExDQUZFKScgUExDQUZFT1BUUz0nJChQTENBRkVPUFRTKScgXAorCVBMSkFSPSckKFBMSkFSKScgUExKQVJPUFRTPSckKFBMSkFST1BUUyknIFwKKwlTSUNTVFVTPSckKFNJQ1NUVVMpJyBTSUNTVFVTT1BUUz0nJChTSUNTVFVTT1BUUyknIFwKKwlTV0k9JyQoU1dJKScgU1dJT1BUUz0nJChTV0lPUFRTKScpCisKKwkoY2QgcG9ydGxhbmQ7ICQoTUFLRSkgYWxsIFwKKwlQTENBRkU9JyQoUExDQUZFKScgUExDQUZFT1BUUz0nJChQTENBRkVPUFRTKScgXAorCVBMSkFSPSckKFBMSkFSKScgUExKQVJPUFRTPSckKFBMSkFST1BUUyknIFwKKwlTSUNTVFVTPSckKFNJQ1NUVVMpJyBTSUNTVFVTT1BUUz0nJChTSUNTVFVTT1BUUyknIFwKKwlTV0k9JyQoU1dJKScgU1dJT1BUUz0nJChTV0lPUFRTKScpCisKKwkoY2QgcXVpbnR1czsgJChNQUtFKSBhbGwgXAorCVBMQ0FGRT0nJChQTENBRkUpJyBQTENBRkVPUFRTPSckKFBMQ0FGRU9QVFMpJyBcCisJUExKQVI9JyQoUExKQVIpJyBQTEpBUk9QVFM9JyQoUExKQVJPUFRTKScgXAorCVNJQ1NUVVM9JyQoU0lDU1RVUyknIFNJQ1NUVVNPUFRTPSckKFNJQ1NUVVNPUFRTKScgXAorCVNXST0nJChTV0kpJyBTV0lPUFRTPSckKFNXSU9QVFMpJykKKworCShjZCB4cHJvbG9nOyAkKE1BS0UpIGFsbCBcCisJUExDQUZFPSckKFBMQ0FGRSknIFBMQ0FGRU9QVFM9JyQoUExDQUZFT1BUUyknIFwKKwlQTEpBUj0nJChQTEpBUiknIFBMSkFST1BUUz0nJChQTEpBUk9QVFMpJyBcCisJU0lDU1RVUz0nJChTSUNTVFVTKScgU0lDU1RVU09QVFM9JyQoU0lDU1RVU09QVFMpJyBcCisJU1dJPSckKFNXSSknIFNXSU9QVFM9JyQoU1dJT1BUUyknKQorCitjbGVhbjoKKwktcm0gLWYgY29yZSAqfgorCShjZCBicmFobWU7ICQoTUFLRSkgY2xlYW4pCisJKGNkIGRvYnJ5OyAgJChNQUtFKSBjbGVhbikKKwkoY2QgZWNyYzsgICAkKE1BS0UpIGNsZWFuKQorCShjZCBob2xtZXI7ICQoTUFLRSkgY2xlYW4pCisJKGNkIG1pbmVydmE7ICQoTUFLRSkgY2xlYW4pCisJKGNkIHBlcmVpcmE7ICQoTUFLRSkgY2xlYW4pCisJKGNkIHBvcnRsYW5kOyAkKE1BS0UpIGNsZWFuKQorCShjZCBxdWludHVzOyAkKE1BS0UpIGNsZWFuKQorCShjZCB4cHJvbG9nOyAkKE1BS0UpIGNsZWFuKQorCityZWFsY2xlYW46Y2xlYW4KKwkoY2QgYnJhaG1lOyAkKE1BS0UpIHJlYWxjbGVhbikKKwkoY2QgZG9icnk7ICAkKE1BS0UpIHJlYWxjbGVhbikKKwkoY2QgZWNyYzsgICAkKE1BS0UpIHJlYWxjbGVhbikKKwkoY2QgaG9sbWVyOyAkKE1BS0UpIHJlYWxjbGVhbikKKwkoY2QgbWluZXJ2YTsgJChNQUtFKSByZWFsY2xlYW4pCisJKGNkIHBlcmVpcmE7ICQoTUFLRSkgcmVhbGNsZWFuKQorCShjZCBwb3J0bGFuZDsgJChNQUtFKSByZWFsY2xlYW4pCisJKGNkIHF1aW50dXM7ICQoTUFLRSkgcmVhbGNsZWFuKQorCShjZCB4cHJvbG9nOyAkKE1BS0UpIHJlYWxjbGVhbikKKworCisKKworCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2JlbmNoX3V0aWwucGwgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2JlbmNoX3V0aWwucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5MDk2MgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvYmVuY2hfdXRpbC5wbApAQCAtMCwwICsxLDQ3IEBACislICAgRmlsZSAgIDogYmVuY2hfdXRpbC5wbAorJSAgIEF1dGhvcnM6IE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyUgICBVcGRhdGVkOiAyNCBGZWJydWFyeSAyMDA4CislICAgUHVycG9zZTogQmVuY2htYXJrIHV0aWxpdGllcworJSAgIE5vdGUgICA6IGJhc2VkIG9uIGRyaXZlci5wbCBpbiBQZXJlaXJhJ3MgYmVuY2htYXJrCisKKyckZ2V0X2NwdV90aW1lJyhUKSA6LSBzdGF0aXN0aWNzKHJ1bnRpbWUsIFtULF9dKS4KKworJyRyZXBvcnQnKE5hbWUsIE4sIFQwLCBUMSwgVDIpIDotCisgICAgICAgIFRlc3RUaW1lIGlzIFQxLVQwLAorICAgICAgICBPdmVySGVhZCBpcyBUMi1UMSwKKwlUaW1lIGlzIFRlc3RUaW1lLU92ZXJIZWFkLAorICAgICAgICBBdmVyYWdlIGlzIFRpbWUvTiwKKwlubCwKKwl3cml0ZSgnIyBOYW1lOiAnKSwgd3JpdGUoTmFtZSksIG5sLAorICAgICAgICB3cml0ZSgnIyBJdGVyYXRpb25zOiAnKSwgd3JpdGUoTiksIG5sLAorCXdyaXRlKCcjIFRlc3RUaW1lOiAnKSwgd3JpdGUoVGVzdFRpbWUpLCB3cml0ZSgnIG1zZWMuXG4nKSwKKwl3cml0ZSgnIyBPdmVySGVhZDogJyksIHdyaXRlKE92ZXJIZWFkKSwgd3JpdGUoJyBtc2VjLlxuJyksCisJd3JpdGUoJyMgVGVzdFRpbWUtT3ZlckhlYWQ6ICcpLCB3cml0ZShUaW1lKSwgd3JpdGUoJyBtc2VjLlxuJyksCisJd3JpdGUoJyMgKFRlc3RUaW1lLU92ZXJIZWFkKS9JdGVyYXRpb25zOiAnKSwgd3JpdGUoQXZlcmFnZSksIHdyaXRlKCcgbXNlYy5cbicpLAorCSckcmVwb3J0X2NzdicoWycjIyNDU1YjIyMnLE5hbWUsTixUZXN0VGltZSxPdmVySGVhZCxUaW1lLEF2ZXJhZ2VdLCAnLCcpLAorCW5sLgorCisnJHJlcG9ydF9jc3YnKFtdLCBfKSA6LSAhLgorJyRyZXBvcnRfY3N2JyhbWF0sIF8pIDotICEsIHdyaXRlKFgpLCBubC4KKyckcmVwb3J0X2NzdicoW1h8WHNdLCBEZWxpbSkgOi0gd3JpdGUoWCksIHdyaXRlKERlbGltKSwgJyRyZXBvcnRfY3N2JyhYcywgRGVsaW0pLgorCisnJGJlbmNobWFyaycoTmFtZSwgSXRlcmF0aW9ucywgQWN0aW9uLCBDb250cm9sKSA6LSAKKyAgICAgICAgJyRnZXRfY3B1X3RpbWUnKFQwKSwKKyAgICAgICAgKCAgICckcmVwZWF0JyhJdGVyYXRpb25zKSwgb25jZShBY3Rpb24pLCBmYWlsCisgICAgICAgIDsgICAnJGdldF9jcHVfdGltZScoVDEpCisgICAgICAgICksCisgICAgICAgICggICAnJHJlcGVhdCcoSXRlcmF0aW9ucyksIG9uY2UoQ29udHJvbCksIGZhaWwKKyAgICAgICAgOyAgICckZ2V0X2NwdV90aW1lJyhUMikKKyAgICAgICAgKSwKKyAgICAgICAgJyRyZXBvcnQnKE5hbWUsIEl0ZXJhdGlvbnMsIFQwLCBUMSwgVDIpLgorCisnJHJlcGVhdCcoTikgOi0gTiA+IDAsICckZnJvbScoMSwgTikuCisKKyckZnJvbScoSSwgSSkgOi0gIS4KKyckZnJvbScoTCwgVSkgOi0gTSBpcyAoTCtVKT4+MSwgICAnJGZyb20nKEwsIE0pLgorJyRmcm9tJyhMLCBVKSA6LSBNIGlzIChMK1UpPj4xKzEsICckZnJvbScoTSwgVSkuCisKKyckZHVtbXknLgorJyRkdW1teScoXykuCisnJGR1bW15JyhfLCBfKS4KKyckZHVtbXknKF8sIF8sIF8pLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9icmFobWUvTWFrZWZpbGUgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2JyYWhtZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODEzMjcyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9icmFobWUvTWFrZWZpbGUKQEAgLTAsMCArMSw5NyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgTWFrZWZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK1BMQ0FGRSAgICAgICA9IHBsY2FmZQorUExDQUZFT1BUUyAgID0KK1BMSkFSICAgICAgICA9IHBsamFyCitQTEpBUk9QVFMgICAgPSAtdgorCitTSUNTVFVTICAgICAgPSAvdXNyL2xvY2FsL2Jpbi9zaWNzdHVzCitTSUNTVFVTT1BUUyAgPSAKKworU1dJICAgICAgICAgID0gL29wdC9sb2NhbC9iaW4vc3dpcGwKK1NXSU9QVFMgICAgICA9IC1MMTAwbQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5xbCAucWxmIC5qYXIgLnBsIC5zaWNzdHVzIC5zd2kgLnBsY2FmZSAuaW4gJChTVUZGSVhFUykKKworcGxjYWZlOiBjb21wX3BsY2FmZSBydW5fcGxjYWZlCisKK3NpY3N0dXM6IGNvbXBfc2ljc3R1cyBydW5fc2ljc3R1cworCitzd2k6IGNvbXBfc3dpIHJ1bl9zd2kKKworYWxsOiBjb21wIHJ1bgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHJ1bgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworcGxjYWZlX291dF9vYmplY3RzICA6PSAkKHBhdHN1YnN0ICUuaW4sJS5wbGNhZmUsICQod2lsZGNhcmQgKi5pbikpCitzaWNzdHVzX291dF9vYmplY3RzIDo9ICQocGF0c3Vic3QgJS5pbiwlLnNpY3N0dXMsJCh3aWxkY2FyZCAqLmluKSkKK3N3aV9vdXRfb2JqZWN0cyAgICAgOj0gJChwYXRzdWJzdCAlLmluLCUuc3dpLCAgICAkKHdpbGRjYXJkICouaW4pKQorCisuaW4ucGxjYWZlOgorCS1ybSAtZiBvdXQvJEAKKwkvYmluL2VjaG8gIlsnJDwnXSwgaGFsdC4iIFwKKwl8ICQoUExDQUZFKSAkKFBMQ0FGRU9QVFMpIC1jcCAkKi5qYXI6YmVuY2hfdXRpbC5qYXIgPiBvdXQvJEAKKworLmluLnNpY3N0dXM6CisJLXJtIC1mIG91dC8kQAorCS9iaW4vZWNobyAiZW5zdXJlX2xvYWRlZCgkKiksIGVuc3VyZV9sb2FkZWQoYmVuY2hfdXRpbCksIFsnJDwnXSwgaGFsdC4iIFwKKwl8ICQoU0lDU1RVUykgJChTSUNTVFVTT1BUUykgPiBvdXQvJEAKKworLmluLnN3aToKKwktcm0gLWYgb3V0LyRACisJL2Jpbi9lY2hvICJlbnN1cmVfbG9hZGVkKCQqKSwgZW5zdXJlX2xvYWRlZChiZW5jaF91dGlsKSwgWyckPCddLCBoYWx0LiIgXAorCXwgJChTV0kpICQoU1dJT1BUUykgPiBvdXQvJEAKKworcnVuOiBydW5fcGxjYWZlIHJ1bl9zaWNzdHVzIHJ1bl9zd2kKKworcnVuX3BsY2FmZTogJChwbGNhZmVfb3V0X29iamVjdHMpCisKK3J1bl9zaWNzdHVzOiAkKHNpY3N0dXNfb3V0X29iamVjdHMpCisKK3J1bl9zd2k6ICQoc3dpX291dF9vYmplY3RzKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGNvbXBpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2phcl9vYmplY3RzIDo9ICQocGF0c3Vic3QgJS5wbCwlLmphciwkKHdpbGRjYXJkICoucGwpKQorcWxfb2JqZWN0cyAgOj0gJChwYXRzdWJzdCAlLnBsLCUucWwsICQod2lsZGNhcmQgKi5wbCkpCitxbGZfb2JqZWN0cyA6PSAkKHBhdHN1YnN0ICUucGwsJS5xbGYsJCh3aWxkY2FyZCAqLnBsKSkKKworLnBsLmphcjoKKwkkKFBMSkFSKSAkKFBMSkFST1BUUykgJEAgJDwKKwktcm0gLWYgLXIgJCoKKworLnBsLnFsOgorCS9iaW4vZWNobyAiWyQqXSwgZmNvbXBpbGUoJCopLCBoYWx0LiIgfCAkKFNJQ1NUVVMpICQoU0lDU1RVU09QVFMpCisKKy5wbC5xbGY6CisJL2Jpbi9lY2hvICJxY29tcGlsZSgkKiksIGhhbHQuIiB8ICQoU1dJKSAkKFNXSU9QVFMpCisjCS9iaW4vZWNobyAiWyQqXSwgcWNvbXBpbGUoJCopLCBoYWx0LiIgfCAkKFNXSSkgJChTV0lPUFRTKQorCitjb21wOiBjb21wX3BsY2FmZSBjb21wX3NpY3N0dXMgY29tcF9zd2kKKworY29tcF9wbGNhZmU6ICQoamFyX29iamVjdHMpCisKK2NvbXBfc2ljc3R1czogJChxbF9vYmplY3RzKQorCitjb21wX3N3aTogJChxbGZfb2JqZWN0cykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBjbGVhbiB1cAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworY2xlYW46CisJLXJtIC1mIGNvcmUgKn4KKwktcm0gLWYgL291dC9jb3JlIG91dC8qfgorCS1ybSAtZiAqLnFsCisJLXJtIC1mICoucWxmCisKK3JlYWxjbGVhbjogY2xlYW4KKwktcm0gLWYgKi5qYXIgKi5jbGFzcworCS1ybSAtZiBvdXQvKi5wbGNhZmUgb3V0Lyouc2ljc3R1cyBvdXQvKi5zd2kKKworIyBFTkQKKwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9icmFobWUvYmVuY2hfdXRpbC5wbCBiL2V4YW1wbGVzL2JlbmNobWFya3MvYnJhaG1lL2JlbmNoX3V0aWwucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5MDk2MgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvYnJhaG1lL2JlbmNoX3V0aWwucGwKQEAgLTAsMCArMSw0NyBAQAorJSAgIEZpbGUgICA6IGJlbmNoX3V0aWwucGwKKyUgICBBdXRob3JzOiBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCislICAgVXBkYXRlZDogMjQgRmVicnVhcnkgMjAwOAorJSAgIFB1cnBvc2U6IEJlbmNobWFyayB1dGlsaXRpZXMKKyUgICBOb3RlICAgOiBiYXNlZCBvbiBkcml2ZXIucGwgaW4gUGVyZWlyYSdzIGJlbmNobWFyaworCisnJGdldF9jcHVfdGltZScoVCkgOi0gc3RhdGlzdGljcyhydW50aW1lLCBbVCxfXSkuCisKKyckcmVwb3J0JyhOYW1lLCBOLCBUMCwgVDEsIFQyKSA6LQorICAgICAgICBUZXN0VGltZSBpcyBUMS1UMCwKKyAgICAgICAgT3ZlckhlYWQgaXMgVDItVDEsCisJVGltZSBpcyBUZXN0VGltZS1PdmVySGVhZCwKKyAgICAgICAgQXZlcmFnZSBpcyBUaW1lL04sCisJbmwsCisJd3JpdGUoJyMgTmFtZTogJyksIHdyaXRlKE5hbWUpLCBubCwKKyAgICAgICAgd3JpdGUoJyMgSXRlcmF0aW9uczogJyksIHdyaXRlKE4pLCBubCwKKwl3cml0ZSgnIyBUZXN0VGltZTogJyksIHdyaXRlKFRlc3RUaW1lKSwgd3JpdGUoJyBtc2VjLlxuJyksCisJd3JpdGUoJyMgT3ZlckhlYWQ6ICcpLCB3cml0ZShPdmVySGVhZCksIHdyaXRlKCcgbXNlYy5cbicpLAorCXdyaXRlKCcjIFRlc3RUaW1lLU92ZXJIZWFkOiAnKSwgd3JpdGUoVGltZSksIHdyaXRlKCcgbXNlYy5cbicpLAorCXdyaXRlKCcjIChUZXN0VGltZS1PdmVySGVhZCkvSXRlcmF0aW9uczogJyksIHdyaXRlKEF2ZXJhZ2UpLCB3cml0ZSgnIG1zZWMuXG4nKSwKKwknJHJlcG9ydF9jc3YnKFsnIyMjQ1NWIyMjJyxOYW1lLE4sVGVzdFRpbWUsT3ZlckhlYWQsVGltZSxBdmVyYWdlXSwgJywnKSwKKwlubC4KKworJyRyZXBvcnRfY3N2JyhbXSwgXykgOi0gIS4KKyckcmVwb3J0X2NzdicoW1hdLCBfKSA6LSAhLCB3cml0ZShYKSwgbmwuCisnJHJlcG9ydF9jc3YnKFtYfFhzXSwgRGVsaW0pIDotIHdyaXRlKFgpLCB3cml0ZShEZWxpbSksICckcmVwb3J0X2NzdicoWHMsIERlbGltKS4KKworJyRiZW5jaG1hcmsnKE5hbWUsIEl0ZXJhdGlvbnMsIEFjdGlvbiwgQ29udHJvbCkgOi0gCisgICAgICAgICckZ2V0X2NwdV90aW1lJyhUMCksCisgICAgICAgICggICAnJHJlcGVhdCcoSXRlcmF0aW9ucyksIG9uY2UoQWN0aW9uKSwgZmFpbAorICAgICAgICA7ICAgJyRnZXRfY3B1X3RpbWUnKFQxKQorICAgICAgICApLAorICAgICAgICAoICAgJyRyZXBlYXQnKEl0ZXJhdGlvbnMpLCBvbmNlKENvbnRyb2wpLCBmYWlsCisgICAgICAgIDsgICAnJGdldF9jcHVfdGltZScoVDIpCisgICAgICAgICksCisgICAgICAgICckcmVwb3J0JyhOYW1lLCBJdGVyYXRpb25zLCBUMCwgVDEsIFQyKS4KKworJyRyZXBlYXQnKE4pIDotIE4gPiAwLCAnJGZyb20nKDEsIE4pLgorCisnJGZyb20nKEksIEkpIDotICEuCisnJGZyb20nKEwsIFUpIDotIE0gaXMgKEwrVSk+PjEsICAgJyRmcm9tJyhMLCBNKS4KKyckZnJvbScoTCwgVSkgOi0gTSBpcyAoTCtVKT4+MSsxLCAnJGZyb20nKE0sIFUpLgorCisnJGR1bW15Jy4KKyckZHVtbXknKF8pLgorJyRkdW1teScoXywgXykuCisnJGR1bW15JyhfLCBfLCBfKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvYnJhaG1lL3BsYmVuY2guaW4gYi9leGFtcGxlcy9iZW5jaG1hcmtzL2JyYWhtZS9wbGJlbmNoLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNzk5YWUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2JyYWhtZS9wbGJlbmNoLmluCkBAIC0wLDAgKzEsNCBAQAorOi0gJyRiZW5jaG1hcmsnKGcxZig1MDAwKSwgIDEwMCwgZzFmKDUwMDAsIF8pLCAnJGR1bW15JyhfLF8pKS4KKzotICckYmVuY2htYXJrJyhnMmYoNTAwMCksICAxMDAsIGcyZig1MDAwLCBfKSwgJyRkdW1teScoXyxfKSkuCis6LSAnJGJlbmNobWFyaycoZzJhKDUwMDApLCAgIDEwLCBnMmEoNTAwMCksICAgICckZHVtbXknKF8pKS4KKwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9icmFobWUvcGxiZW5jaC5wbCBiL2V4YW1wbGVzL2JlbmNobWFya3MvYnJhaG1lL3BsYmVuY2gucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEzZDdjYgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvYnJhaG1lL3BsYmVuY2gucGwKQEAgLTAsMCArMSw1OCBAQAorJSUlIEEgc2hvcnQgcG9zdCBvZiBiZW5jaG1hcmtzIGJ5IEJyYWhtZQorCisvKiAKKyBDSEFOR0VMT0cgYnkgTS5CYW5iYXJhIAorICAgLSBteV9tZW1iZXIvMiBpcyBhZGQuCisqLworCitteV9tZW1iZXIoWCwgW1h8X10pLgorbXlfbWVtYmVyKFgsIFtffFlzXSkgOi0gbXlfbWVtYmVyKFgsIFlzKS4KKworLyoKK0Zyb20gaG9uZXlkZXcuc3J2LmNzLmNtdS5lZHUhZGFzLW5ld3MuaGFydmFyZC5lZHUhbm9jLm5lYXIubmV0IWhvd2xhbmQucmVzdG9uLmFucy5uZXQhdml4ZW4uY3NvLnVpdWMuZWR1IXNkZC5ocC5jb20hZGVjd3JsIWRlY3dybCFuZXRjb21zdiFuZXRjb20uY29tIWJyYWhtZSBXZWQgU2VwIDE1IDE3OjI1OjI4IEVEVCAxOTkzCitBcnRpY2xlOiA4NTQ0IG9mIGNvbXAubGFuZy5wcm9sb2cKK1hyZWY6IGhvbmV5ZGV3LnNydi5jcy5jbXUuZWR1IGNvbXAubGFuZy5wcm9sb2c6ODU0NAorTmV3c2dyb3VwczogY29tcC5sYW5nLnByb2xvZworUGF0aDogaG9uZXlkZXcuc3J2LmNzLmNtdS5lZHUhZGFzLW5ld3MuaGFydmFyZC5lZHUhbm9jLm5lYXIubmV0IWhvd2xhbmQucmVzdG9uLmFucy5uZXQhdml4ZW4uY3NvLnVpdWMuZWR1IXNkZC5ocC5jb20hZGVjd3JsIWRlY3dybCFuZXRjb21zdiFuZXRjb20uY29tIWJyYWhtZQorRnJvbTogYnJhaG1lQG5ldGNvbS5jb20gKGJyYWhtZSkKK1N1YmplY3Q6IGJlbmNobWFya2luZyBwcm9sb2cgc3lzdGVtczogSGVyZSBpcyBvbmUgc21hbGwgcHJvZ3JhbQorTWVzc2FnZS1JRDogPGJyYWhtZUNERDlJNC42NDVAbmV0Y29tLmNvbT4KK09yZ2FuaXphdGlvbjogTkVUQ09NIE9uLWxpbmUgQ29tbXVuaWNhdGlvbiBTZXJ2aWNlcyAoNDA4IDI0MS05NzYwIGd1ZXN0KQorRGF0ZTogVHVlLCAxNCBTZXAgMTk5MyAyMzowNjowMyBHTVQKK0xpbmVzOiAzMQorKi8KKworJSUgSGVyZSBhcmUgYSBmZXcgcHJlZGljYXRlcyB3aGljaCBjYW4gYmUgdXNlZCB0byBiZW5jaG1hcmsKKyUlIHZhcmlvdXMgcHJvbG9nIHN5c3RlbXMuIFRoaXMgd291bGQgdGVzdCB0aGUgcHJvbG9nIHN5c3RlbXMgbWFuYWdlbWVudCBvZgorJSUgcHJvZ3JhbSBzcGFjZS4gVGhpcyBpcyB0aGUgc3BhY2UgdHlwaWNhbGx5IHVzZWQgYnkgYXNzZXJ0cyBhbmQgcmV0cmFjdHMKKyUlIGFzIHdlbGwgYXMgYnVpbHRfaW5zIGxpa2UgZmluZGFsbC4gQWxzbyBjb21wYXJpbmcgdGhlIHRpbWVzIHdpdGggZzEgd291bGQgCislJSBpbmRpY2F0ZSAgdGhlIG92ZXJoZWFkIG9mIGZpbmRhbGwgYW5kIGFzc2VydC9yZXRyYWN0cworCislJSBJdCB3b3VsZCBuaWNlIGlmIHBlb3BsZSBjb3VsZCBkZXZlbG9wIHN1Y2ggc21hbGwgYmVuY2htYXJrcyB3aGljaCAKKyUlIHRlc3QgcGFydHMgb2YgdmFyaW91cyBwcm9sb2cgc3lzdGVtcyB0aGF0IGFyZSBub3QgY292ZXJlZCBieSB0aGUgCislJSBleGlzdGluZyBiZW5jaG1hcmtzLgorCisKK2cxKE4sIEwpIDotIGxlbmd0aChMLCBOKSwgc2FtZV92YWx1ZShMLCBlKS4KKworZzIoMCkgOi0gIS4KK2cyKE4sIEEpIDotIE4gPiAwLCBBID0gZS4KK2cyKE4sIEEpIDotIE4gPiAwLCBOMSBpcyBOIC0gMSwgZzIoTjEsIEEpLgorCitnMWYoTiwgRXMpIDotIAorCWcxKE4sIEwpLCAKKwlmaW5kYWxsKEUsIG15X21lbWJlcihFLCBMKSwgRXMpLgorCitnMmYoTiwgRXMpIDotIAorCWcyKE4sIEEpLCBmaW5kYWxsKEEsIGcyKE4sIEEpLCBFcykuCisKK2cyYShOKSA6LQorCWFzc2VydGEoZzJfYW5zKFtdKSksCisJZzIoTiwgQSksIHJldHJhY3QoZzJfYW5zKExpc3QpKSwgYXNzZXJ0YShnMl9hbnMoW0F8TGlzdF0pKSwgZmFpbC4KK2cyYShOKSA6LSByZXRyYWN0KGcyX2FucyhMaXN0KSkuCisKK3NhbWVfdmFsdWUoW10sIF9FKS4KK3NhbWVfdmFsdWUoW0V8Ul0sIEUpIDotIHNhbWVfdmFsdWUoUiwgRSkuCisKKworCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2RvYnJ5L01ha2VmaWxlIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9kb2JyeS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODEzMjcyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9kb2JyeS9NYWtlZmlsZQpAQCAtMCwwICsxLDk3IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICBNYWtlZmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworUExDQUZFICAgICAgID0gcGxjYWZlCitQTENBRkVPUFRTICAgPQorUExKQVIgICAgICAgID0gcGxqYXIKK1BMSkFST1BUUyAgICA9IC12CisKK1NJQ1NUVVMgICAgICA9IC91c3IvbG9jYWwvYmluL3NpY3N0dXMKK1NJQ1NUVVNPUFRTICA9IAorCitTV0kgICAgICAgICAgPSAvb3B0L2xvY2FsL2Jpbi9zd2lwbAorU1dJT1BUUyAgICAgID0gLUwxMDBtCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLnFsIC5xbGYgLmphciAucGwgLnNpY3N0dXMgLnN3aSAucGxjYWZlIC5pbiAkKFNVRkZJWEVTKQorCitwbGNhZmU6IGNvbXBfcGxjYWZlIHJ1bl9wbGNhZmUKKworc2ljc3R1czogY29tcF9zaWNzdHVzIHJ1bl9zaWNzdHVzCisKK3N3aTogY29tcF9zd2kgcnVuX3N3aQorCithbGw6IGNvbXAgcnVuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgcnVuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitwbGNhZmVfb3V0X29iamVjdHMgIDo9ICQocGF0c3Vic3QgJS5pbiwlLnBsY2FmZSwgJCh3aWxkY2FyZCAqLmluKSkKK3NpY3N0dXNfb3V0X29iamVjdHMgOj0gJChwYXRzdWJzdCAlLmluLCUuc2ljc3R1cywkKHdpbGRjYXJkICouaW4pKQorc3dpX291dF9vYmplY3RzICAgICA6PSAkKHBhdHN1YnN0ICUuaW4sJS5zd2ksICAgICQod2lsZGNhcmQgKi5pbikpCisKKy5pbi5wbGNhZmU6CisJLXJtIC1mIG91dC8kQAorCS9iaW4vZWNobyAiWyckPCddLCBoYWx0LiIgXAorCXwgJChQTENBRkUpICQoUExDQUZFT1BUUykgLWNwICQqLmphcjpiZW5jaF91dGlsLmphciA+IG91dC8kQAorCisuaW4uc2ljc3R1czoKKwktcm0gLWYgb3V0LyRACisJL2Jpbi9lY2hvICJlbnN1cmVfbG9hZGVkKCQqKSwgZW5zdXJlX2xvYWRlZChiZW5jaF91dGlsKSwgWyckPCddLCBoYWx0LiIgXAorCXwgJChTSUNTVFVTKSAkKFNJQ1NUVVNPUFRTKSA+IG91dC8kQAorCisuaW4uc3dpOgorCS1ybSAtZiBvdXQvJEAKKwkvYmluL2VjaG8gImVuc3VyZV9sb2FkZWQoJCopLCBlbnN1cmVfbG9hZGVkKGJlbmNoX3V0aWwpLCBbJyQ8J10sIGhhbHQuIiBcCisJfCAkKFNXSSkgJChTV0lPUFRTKSA+IG91dC8kQAorCitydW46IHJ1bl9wbGNhZmUgcnVuX3NpY3N0dXMgcnVuX3N3aQorCitydW5fcGxjYWZlOiAkKHBsY2FmZV9vdXRfb2JqZWN0cykKKworcnVuX3NpY3N0dXM6ICQoc2ljc3R1c19vdXRfb2JqZWN0cykKKworcnVuX3N3aTogJChzd2lfb3V0X29iamVjdHMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgY29tcGlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworamFyX29iamVjdHMgOj0gJChwYXRzdWJzdCAlLnBsLCUuamFyLCQod2lsZGNhcmQgKi5wbCkpCitxbF9vYmplY3RzICA6PSAkKHBhdHN1YnN0ICUucGwsJS5xbCwgJCh3aWxkY2FyZCAqLnBsKSkKK3FsZl9vYmplY3RzIDo9ICQocGF0c3Vic3QgJS5wbCwlLnFsZiwkKHdpbGRjYXJkICoucGwpKQorCisucGwuamFyOgorCSQoUExKQVIpICQoUExKQVJPUFRTKSAkQCAkPAorCS1ybSAtZiAtciAkKgorCisucGwucWw6CisJL2Jpbi9lY2hvICJbJCpdLCBmY29tcGlsZSgkKiksIGhhbHQuIiB8ICQoU0lDU1RVUykgJChTSUNTVFVTT1BUUykKKworLnBsLnFsZjoKKwkvYmluL2VjaG8gInFjb21waWxlKCQqKSwgaGFsdC4iIHwgJChTV0kpICQoU1dJT1BUUykKKyMJL2Jpbi9lY2hvICJbJCpdLCBxY29tcGlsZSgkKiksIGhhbHQuIiB8ICQoU1dJKSAkKFNXSU9QVFMpCisKK2NvbXA6IGNvbXBfcGxjYWZlIGNvbXBfc2ljc3R1cyBjb21wX3N3aQorCitjb21wX3BsY2FmZTogJChqYXJfb2JqZWN0cykKKworY29tcF9zaWNzdHVzOiAkKHFsX29iamVjdHMpCisKK2NvbXBfc3dpOiAkKHFsZl9vYmplY3RzKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGNsZWFuIHVwCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitjbGVhbjoKKwktcm0gLWYgY29yZSAqfgorCS1ybSAtZiAvb3V0L2NvcmUgb3V0Lyp+CisJLXJtIC1mICoucWwKKwktcm0gLWYgKi5xbGYKKworcmVhbGNsZWFuOiBjbGVhbgorCS1ybSAtZiAqLmphciAqLmNsYXNzCisJLXJtIC1mIG91dC8qLnBsY2FmZSBvdXQvKi5zaWNzdHVzIG91dC8qLnN3aQorCisjIEVORAorCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2RvYnJ5L2JlbmNoX3V0aWwucGwgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2RvYnJ5L2JlbmNoX3V0aWwucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5MDk2MgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvZG9icnkvYmVuY2hfdXRpbC5wbApAQCAtMCwwICsxLDQ3IEBACislICAgRmlsZSAgIDogYmVuY2hfdXRpbC5wbAorJSAgIEF1dGhvcnM6IE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyUgICBVcGRhdGVkOiAyNCBGZWJydWFyeSAyMDA4CislICAgUHVycG9zZTogQmVuY2htYXJrIHV0aWxpdGllcworJSAgIE5vdGUgICA6IGJhc2VkIG9uIGRyaXZlci5wbCBpbiBQZXJlaXJhJ3MgYmVuY2htYXJrCisKKyckZ2V0X2NwdV90aW1lJyhUKSA6LSBzdGF0aXN0aWNzKHJ1bnRpbWUsIFtULF9dKS4KKworJyRyZXBvcnQnKE5hbWUsIE4sIFQwLCBUMSwgVDIpIDotCisgICAgICAgIFRlc3RUaW1lIGlzIFQxLVQwLAorICAgICAgICBPdmVySGVhZCBpcyBUMi1UMSwKKwlUaW1lIGlzIFRlc3RUaW1lLU92ZXJIZWFkLAorICAgICAgICBBdmVyYWdlIGlzIFRpbWUvTiwKKwlubCwKKwl3cml0ZSgnIyBOYW1lOiAnKSwgd3JpdGUoTmFtZSksIG5sLAorICAgICAgICB3cml0ZSgnIyBJdGVyYXRpb25zOiAnKSwgd3JpdGUoTiksIG5sLAorCXdyaXRlKCcjIFRlc3RUaW1lOiAnKSwgd3JpdGUoVGVzdFRpbWUpLCB3cml0ZSgnIG1zZWMuXG4nKSwKKwl3cml0ZSgnIyBPdmVySGVhZDogJyksIHdyaXRlKE92ZXJIZWFkKSwgd3JpdGUoJyBtc2VjLlxuJyksCisJd3JpdGUoJyMgVGVzdFRpbWUtT3ZlckhlYWQ6ICcpLCB3cml0ZShUaW1lKSwgd3JpdGUoJyBtc2VjLlxuJyksCisJd3JpdGUoJyMgKFRlc3RUaW1lLU92ZXJIZWFkKS9JdGVyYXRpb25zOiAnKSwgd3JpdGUoQXZlcmFnZSksIHdyaXRlKCcgbXNlYy5cbicpLAorCSckcmVwb3J0X2NzdicoWycjIyNDU1YjIyMnLE5hbWUsTixUZXN0VGltZSxPdmVySGVhZCxUaW1lLEF2ZXJhZ2VdLCAnLCcpLAorCW5sLgorCisnJHJlcG9ydF9jc3YnKFtdLCBfKSA6LSAhLgorJyRyZXBvcnRfY3N2JyhbWF0sIF8pIDotICEsIHdyaXRlKFgpLCBubC4KKyckcmVwb3J0X2NzdicoW1h8WHNdLCBEZWxpbSkgOi0gd3JpdGUoWCksIHdyaXRlKERlbGltKSwgJyRyZXBvcnRfY3N2JyhYcywgRGVsaW0pLgorCisnJGJlbmNobWFyaycoTmFtZSwgSXRlcmF0aW9ucywgQWN0aW9uLCBDb250cm9sKSA6LSAKKyAgICAgICAgJyRnZXRfY3B1X3RpbWUnKFQwKSwKKyAgICAgICAgKCAgICckcmVwZWF0JyhJdGVyYXRpb25zKSwgb25jZShBY3Rpb24pLCBmYWlsCisgICAgICAgIDsgICAnJGdldF9jcHVfdGltZScoVDEpCisgICAgICAgICksCisgICAgICAgICggICAnJHJlcGVhdCcoSXRlcmF0aW9ucyksIG9uY2UoQ29udHJvbCksIGZhaWwKKyAgICAgICAgOyAgICckZ2V0X2NwdV90aW1lJyhUMikKKyAgICAgICAgKSwKKyAgICAgICAgJyRyZXBvcnQnKE5hbWUsIEl0ZXJhdGlvbnMsIFQwLCBUMSwgVDIpLgorCisnJHJlcGVhdCcoTikgOi0gTiA+IDAsICckZnJvbScoMSwgTikuCisKKyckZnJvbScoSSwgSSkgOi0gIS4KKyckZnJvbScoTCwgVSkgOi0gTSBpcyAoTCtVKT4+MSwgICAnJGZyb20nKEwsIE0pLgorJyRmcm9tJyhMLCBVKSA6LSBNIGlzIChMK1UpPj4xKzEsICckZnJvbScoTSwgVSkuCisKKyckZHVtbXknLgorJyRkdW1teScoXykuCisnJGR1bW15JyhfLCBfKS4KKyckZHVtbXknKF8sIF8sIF8pLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9kb2JyeS9kb2JyeS5pbiBiL2V4YW1wbGVzL2JlbmNobWFya3MvZG9icnkvZG9icnkuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwNDJiNwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvZG9icnkvZG9icnkuaW4KQEAgLTAsMCArMSwxMyBAQAorOi0gJyRiZW5jaG1hcmsnKGNvbjEsICAgIDEwMDAwMCwgY29uMSwgICAgJyRkdW1teScpLgorOi0gJyRiZW5jaG1hcmsnKGNvbjYsICAgIDEwMDAwMCwgY29uNiwgICAgJyRkdW1teScpLgorOi0gJyRiZW5jaG1hcmsnKGRpZmYsICAgIDEwMDAwMCwgZGlmZiwgICAgJyRkdW1teScpLgorOi0gJyRiZW5jaG1hcmsnKGhhbm9pLCAgIDEwMDAwMCwgaGFub2ksICAgJyRkdW1teScpLgorOi0gJyRiZW5jaG1hcmsnKG11LCAgICAgIDEwMDAwMCwgbXUsICAgICAgJyRkdW1teScpLgorOi0gJyRiZW5jaG1hcmsnKG5yZXYxLCAgIDEwMDAwMCwgbnJldjEsICAgJyRkdW1teScpLgorOi0gJyRiZW5jaG1hcmsnKHF1ZWVucywgIDEwMDAwMCwgcXVlZW5zLCAgJyRkdW1teScpLgorOi0gJyRiZW5jaG1hcmsnKHF1ZXJ5LCAgIDEwMDAwMCwgcXVlcnksICAgJyRkdW1teScpLgorOi0gJyRiZW5jaG1hcmsnKHFzNCwgICAgIDEwMDAwMCwgcXM0LCAgICAgJyRkdW1teScpLgorOi0gJyRiZW5jaG1hcmsnKHBhbGluMjUsIDEwMDAwMCwgcGFsaW4yNSwgJyRkdW1teScpLgorOi0gJyRiZW5jaG1hcmsnKHNpZXZlLCAgIDEwMDAwMCwgc2lldmUsICAgJyRkdW1teScpLgorCisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvZG9icnkvZG9icnkucGwgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2RvYnJ5L2RvYnJ5LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMDZmZjAKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2RvYnJ5L2RvYnJ5LnBsCkBAIC0wLDAgKzEsNDc1IEBACisvKgorICBEb2JyeSdzIGJlbmNobWFya3MKKyovCisKKy8qIENIQU5HRUxPRyBieSBNLkJhbmJhcmEgCisgICAtIFtYLC4uWV0gICAgICAgLS0+ICBjb21tZW50IG91dAorICAgLSBub3QoWCkgICAgICAgIC0tPiAgXCsoWCkKKyAgIC0gaXMoTjIsTjEsKywxKSAtLT4gIE4yIGlzIE4xKzEKKyAgIC0gd3JpdGUvMSwgbmwvMCAtLT4gY29tbWVudCBvdXQKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitIZXJlIGl0IGlzLCBJIGhvcGUgKEkgdGhpbmsgSSBoYXZlIGxlZnQgdGhlIGNvZGUgdW50b3VjaGVkLCBidXQgSSBhbSBub3QgMTAwJQorc3VyZSkuIEl0IGNvbWVzIGZyb20gVGVwIERvYnJ5IHdoZW4gaGUgd2FzIGF0IFVDQi4KKworQnkgdGhlIHdheSwgdGhlc2UgYmVuY2htYXJrcyBhcmUgc29tZWhvdyBvdXRkYXRlZC4gRG8geW91IGtub3cgYWJvdXQgdGhlCitiZW5jaG1hcmsKK3N1aXRlIHVzZWQgZm9yIGFzc2Vzc2luZyB0aGUgQkFNIGFuZCB0aGUgQXF1YXJpdXMgUHJvbG9nIENvbXBpbGVyPyBJdCBpcworYXZhaWxhYmxlIGJ5IGFub255bW91cyBGVFAgZnJvbSBVQ0IuIFRoZSBzdWl0ZSBvZiBGLiBQZXJlaXJhIChwdWJsaXNoZWQKK29uIHRoZSBuZXQgaW4gODYgb3IgODcpIGlzIGFsc28gcXVpdGUgaW50ZXJlc3RpbmcgKGl0IHRyaWVzIHRvIHRlc3QKK3NwZWNpZmljIG9wZXJhdGlvbnMsCit1bmlmaWNhdGlvbiwgaW5kZXhpbmcsIGJhY2t0cmFja2luZy4uLikuCisKKy0tIEphY3F1ZXMgTk9ZRQorCitGcm9tOiAoVGVwIERvYnJ5KSBUZXAldWNiZGFsaUBCZXJrZWxleSAKK1N1YmplY3Q6IFRoZSBCZXJrZWxleSBQTE0gQmVuY2htYXJrcworRGF0ZTogICAgV2VkbmVzZGF5LCBNYXkgMjIgMTk4NQorCisgICAgIEF0IHRoZSBXYXJyZW4gQWJzdHJhY3QgTWFjaGluZSBXb3Jrc2hvcCBhIGZldyB3ZWVrcyBhZ28KK0kgIHdhcyAgYXNrZWQgdG8gcHVibGlzaCB0aGUgc2V0IG9mIGJlbmNobWFya3MgcHJvZ3JhbXMgSSd2ZQorYmVlbiAgdXNpbmcgIG9uICBteSAgc2ltdWxhdG9yICBmb3IgIHRoZSAgIEJlcmtlbGV5ICAgUHJvbG9nCitNYWNoaW5lKFBMTSkuICBJJ3ZlICBmaW5hbGx5IGdvdCB0aGVtIGFsbCBjb2xsZWN0ZWQgdG9nZXRoZXIKK2luIFByb2xvZyBmb3JtIChDUHJvbG9nKSBhbmQgaGF2ZSBzZW50IHRoZW0gdG8gIHRoZSAgRGlnZXN0LgorVGhleSdyZSAgcmVhbGx5ICB0b28gIGJpZyAgdG8ganVzdCBwdWJsaXNoIGluIHRoZSBEaWdlc3QsIHNvCit0aGV5IGFyZSBiZWluZyBzZXQgdXAgaW4gYSBkaXJlY3RvcnkgaW4gdGhlIFBST0xPRyBkaXJlY3RvcnkKK2F0ICBTVS1TQ09SRS4gIFRoZXJlIGFyZSAxMSBmaWxlcyB3aXRoIGEgdG90YWwgb2YgNDAwIGxpbmVzLgorU2luY2Ugb3VyIG1hY2hpbmUgaXMgYmFzZWQgb24gY29tcGlsZWQgUHJvbG9nLCB0aGUgdG9wIGxldmVsCitxdWVyaWVzICBhcmUgIGFsc28gIGNvbXBpbGVkICBpbiwgZ2VuZXJhbGx5IGFzIHRoZSBwcmVkaWNhdGUKK21haW4vMC4KKworICAgICBUaGUgYmVuY2htYXJrcyB3ZXJlIHByaW1hcmlseSBjaG9zZW4gdG8gZXhlcmNpc2UgYWxsIG9mCit0aGUgIGZlYXR1cmVzIG9mIHRoZSBQTE0sIG5vdCBmb3IgYW55IGNvbXBsZXhpdHkgb2YgcHJvZ3JhbS0KK21pbmcuIEFib3V0IGhhbGYgb2YgdGhlbSBjb21lIGZyb20gV2FycmVuJ3MgdGhlc2lzLCBhbmQgIHRoZQorb3RoZXJzICB3ZSd2ZSAgYWRkZWQgaGVyZS4gIE91ciBvcmlnaW5hbCBwZXJmb3JtYW5jZSBmaWd1cmVzCit3ZXJlIGJhc2VkIG9uIHNpbXVsYXRpb25zIG9mIGhhbmQgY29tcGlsZWQgdmVyc2lvbnMgb2YgdGhlc2UKK2JlbmNobWFya3MuICAgV2UgYXJlIGN1cnJlbnRseSBsb29raW5nIGZvciBsYXJnZXIsIG1vcmUgY29tLQorcGxleCBiZW5jaG1hcmtzIHRvIHJ1biBvbiB0aGUgaGFyZHdhcmUgd2hlbiBpdCBpcyBhdmFpbGFibGUuCitTbyAgSSdkICBiZSAgaW50ZXJlc3RlZCAgc2VlaW5nIGxhcmdlIGJlbmNobWFya3Mgc2VudCB0byB0aGUKK0RpZ2VzdC4KKworLS0gVGVwIERvYnJ5IChURVBAQmVya2VsZXkpCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCislCWNvbmNhdCAoY29uMSwgY29uNikKKyUJVGhlc2UgdHdvIHRlc3RzIGFyZSBzaW1wbGUgZXhhbXBsZXMgb2YgdGhlIGNvbmNhdCBwcmVkaWNhdGUKKyUJY29uMSBpcyBkZXRlcm1pbmF0ZSwgY29uNiBpcyBub24tZGV0ZXJtaW5hdGUgZ2V0dGluZyBhbGwgNiBhbnN3ZXJzCisKK2NvbjEgOi0gY29uY2F0KFthLGIsY10sW2QsZV0sWCkuICAlIGNvbjEKKwkld3JpdGUoWCksbmwuCitjb242IDotIGNvbmNhdChYLFksW2EsYixjLGQsZV0pLCAgJSBjb242CisJJXdyaXRlKFgpLG5sLAorCSV3cml0ZShZKSxubCxubCwKKwlmYWlsLgorCitjb25jYXQoW10sTCxMKS4KK2NvbmNhdChbWHxMMV0sTDIsW1h8TDNdKSA6LSBjb25jYXQoTDEsTDIsTDMpLgorCisKKyUJZGlmZmVyZW4gKHRpbWVzMTAsZGl2aWRlMTAsbG9nMTAsb3BzOCkKKyUJVGhlc2UgNCBleGFtcGxlcyBhcmUgZnJvbSBXYXJyZW4ncyB0aGVzaXMKKworZGlmZiA6LQorCXRpbWVzMTAoSTEpLAorCWQoSTEseCxEMSksCisJJXdyaXRlKEQxKSwgbmwsCisJZGl2aWRlMTAoSTIpLAorCWQoSTIseCxEMiksCisJJXdyaXRlKEQyKSwgbmwsCisJbG9nMTAoSTMpLAorCWQoSTMseCxEMyksCisJJXdyaXRlKEQzKSwgbmwsCisJb3BzOChJNCksCisJZChJNCx4LEQ0KS4KKwkld3JpdGUoRDQpLCBubC4KKworZChVK1YsWCxEVStEVikgOi0gISwgZChVLFgsRFUpLCBkKFYsWCxEVikuCitkKFUtVixYLERVLURWKSA6LSAhLCBkKFUsWCxEVSksIGQoVixYLERWKS4KK2QoVSpWLFgsRFUqVitVKkRWKSA6LSAhLCBkKFUsWCxEVSksIGQoVixYLERWKS4KK2QoVS9WLFgsKERVKlYtVSpEVikvKF4oViwyKSkpIDotICEsIGQoVSxYLERVKSwgZChWLFgsRFYpLgorZCheKFUsTiksWCxEVSpOKiheKFUsTjEpKSkgOi0gISwgaW50ZWdlcihOKSwgTjEgaXMgTiAtIDEsIGQoVSxYLERVKS4KK2QoLVUsWCwtRFUpIDotICEsIGQoVSxYLERVKS4KK2QoZXhwKFUpLFgsZXhwKFUpKkRVKSA6LSAhLCBkKFUsWCxEVSkuCitkKGxvZyhVKSxYLERVL1UpIDotICEsIGQoVSxYLERVKS4KK2QoWCxYLDEpLgklIFRoZXJlIGlzIGEgY3V0IGluIFdhcnJlbidzIHByb2dyYW0hIC0tIEphY3F1ZXMKK2QoQyxYLDApLgorCit0aW1lczEwKCAoKCgoKCgoKHgqeCkqeCkqeCkqeCkqeCkqeCkqeCkqeCkqeCApLgorZGl2aWRlMTAoICgoKCgoKCgoeC94KS94KS94KS94KS94KS94KS94KS94KS94ICkuCitsb2cxMCggbG9nKGxvZyhsb2cobG9nKGxvZyhsb2cobG9nKGxvZyhsb2cobG9nKHgpKSkpKSkpKSkpICkuCitvcHM4KCAoeCsxKSooKF4oeCwyKSsyKSooXih4LDMpKzMpKSApLgorCisKKworJQl0b3dlcnMgb2YgaGFub2kgKCBoYW5vaSApIGZvciA4IGRpc2tzCisKK2hhbm9pIDotIGhhbm9pKDgpLgorCitoYW5vaShOKSA6LSBtb3ZlKE4sbGVmdCxjZW50ZXIscmlnaHQpLgorCittb3ZlKDAsXyxfLF8pIDotICEuCislbW92ZShOLEEsQixDKSA6LSBNIGlzIE4tMSwgbW92ZShNLEEsQyxCKSwgaW5mb3JtKEEsQiksIG1vdmUoTSxDLEIsQSkuCittb3ZlKE4sQSxCLEMpIDotIE0gaXMgTi0xLCBtb3ZlKE0sQSxDLEIpLCBtb3ZlKE0sQyxCLEEpLgorCitpbmZvcm0oQSxCKSA6LSB3cml0ZShbbW92ZSxkaXNrLGZyb20sQSx0byxCXSksIG5sLCBmYWlsLgoraW5mb3JtKF8sXykuCisKKy8qCislIE1haW4gcHJvZ3JhbSB0byBkbyBicmFuY2ggYW5kIGJvdW5kIE5BTkQgZ2F0ZSBkZXNpZ25zLgorJSBPcHRpbWl6ZWQgZm9yIDItaW5wdXQgTkFORCBnYXRlcyBhbmQgMyBpbnB1dCB2YXJpYWJsZXMuCislIEEuIERlc3BhaW4sIEZlYiA4NC4KKyUgSW4gdGhpcyBjYXNlLCBkZXNpZ24gYSAyLTEgTVVYIChja3QyKQorCittYWluIDotIHNldF9ib3VuZCgzMjAwMCksIHVwZGF0ZV9jaXJjdWl0KFtdLDApLCByKDAsIFswLDAsMSwxLDAsMSwwLDFdKS4KKworcnVuKERlcHRoLCBUYWJsZSwgQ2lyY3VpdCwgQ29zdCwgRGVwdGgpIDotIHNlYXJjaChEZXB0aCwgVGFibGUpLAorCQkJCQkgICBjaXJjdWl0KENpcmN1aXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcmN1aXRcPT1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0X2JvdW5kKENvc3QpLCEuCitydW4oRGVwdGgsIFRhYmxlLCBDaXJjdWl0LCBDb3N0LCBEZWxheSkgOi0gRCBpcyBEZXB0aCArIDEsCisgICAgcnVuKEQsIFRhYmxlLCBDaXJjdWl0LCBDb3N0LCBEZWxheSksIS4KKworc2VhcmNoKERlcHRoLCBUYWJsZSkgOi0gdChEZXB0aCwgQ2lyY3VpdCwgVGFibGUsIDAsIENvc3Rfb3V0KSwKKwkJCXVwZGF0ZV9jaXJjdWl0KENpcmN1aXQsQ29zdF9vdXQpLAorCQkJdXBkYXRlX2JvdW5kKENvc3Rfb3V0KS4KKworJSBJbnB1dCBzaWduYWxzIGFyZSBmcmVlIGFuZCB0ZXJtaW5hdGUgdGhlIHNlYXJjaC4KK3QoXywgMCAsIFswLDEsMCwxLDAsMSwwLDFdLEMsQykuCit0KF8sIDEgLCBbMCwwLDEsMSwwLDAsMSwxXSxDLEMpLgordChfLCAyICwgWzAsMCwwLDAsMSwxLDEsMV0sQyxDKS4KK3QoXyxpMCAsIFsxLDAsMSwwLDEsMCwxLDBdLEMsQykuCit0KF8saTEgLCBbMSwxLDAsMCwxLDEsMCwwXSxDLEMpLgordChfLGkyICwgWzEsMSwxLDEsMCwwLDAsMF0sQyxDKS4KKworJSBJbnZlcnRlcnMgYXJlIGZyZWUgaW4gdGhpcyBtb2RlbC4KK3QoRGVwdGgsIFtpLFpdLCBUYWJsZSwgQ2luLCBDb3V0KSA6LSBEZXB0aCA+IDAsCisJCQkJIEQgaXMgRGVwdGggLTEsCisJCQkJIHNpbnQoVGFibGUsIEl0YWJsZSksCisJCQkJIHQoRCwgWiwgSXRhYmxlLCBDaW4sIENvdXQpLgorCislIE1haW4gTkFORCBnYXRlIGNsYXVzZS4KK3QoRGVwdGgsIFtuLFksWl0sIFRhYmxlLCBDaW4sIENvdXQpIDotIERlcHRoID4gMCwKKwkJCQkgRCBpcyBEZXB0aCAtMSwKKwkJCQkgdXBkYXRlX2Nvc3QoQ2luLDEsQzIpLAorCQkJCSBuZ2F0ZShUYWJsZSwgQSwgQiksCisJCQkJIHQoRCxZLEEsQzIsQzMpLAorCQkJCSB0KEQsWixCLEMzLENvdXQpLgorCislIEludmVydGVyIHNpZ25hbCB0cmFuc2Zvcm1hdGlvbi4KKyVzaW50KFtIMSwuLlQxXSxbSDIsLi5UMl0pIDotIGludihIMSwgSDIpLCBzaW50KFQxLCBUMikuCitzaW50KFtdLFtdKS4KK3NpbnQoW1gsLi5UMV0sW18sLi5UMl0pIDotIHZhcihYKSwgc2ludChUMSwgVDIpLCEuCitzaW50KFswLC4uVDFdLFsxLC4uVDJdKSA6LSBzaW50KFQxLCBUMikuCitzaW50KFsxLC4uVDFdLFswLC4uVDJdKSA6LSBzaW50KFQxLCBUMikuCisKKyUgT3B0aW1pemVkIGdhdGUgc2lnbmFsIHRyYW5zZm9ybWF0aW9uLgorbmdhdGUoW10sIFtdLCBbXSkuCit0Z2F0ZShbXSwgW10sIFtdKS4KK25nYXRlKFtYLC4uVDBdLCBbXywuLlQxXSwgW18sLi5UMl0pIDotIHZhcihYKSwgISwgbmdhdGUoVDAsIFQxLCBUMikuCituZ2F0ZShbWCwuLlQwXSwgWzEsLi5UMV0sIFsxLC4uVDJdKSA6LSBYPT0wLCBuZ2F0ZShUMCwgVDEsIFQyKS4KK25nYXRlKFtYLC4uVDBdLCBbXywuLlQxXSwgWzAsLi5UMl0pIDotIFg9PTEsIHRnYXRlKFQwLCBUMSwgVDIpLgordGdhdGUoW1gsLi5UMF0sIFtfLC4uVDFdLCBbXywuLlQyXSkgOi0gdmFyKFgpLCAhLCB0Z2F0ZShUMCwgVDEsIFQyKS4KK3RnYXRlKFtYLC4uVDBdLCBbMSwuLlQxXSwgWzEsLi5UMl0pIDotIFg9PTAsIHRnYXRlKFQwLCBUMSwgVDIpLgordGdhdGUoW1gsLi5UMF0sIFtfLC4uVDFdLCBbMCwuLlQyXSkgOi0gWD09MSwgdGdhdGUoVDAsIFQxLCBUMikuCit0Z2F0ZShbWCwuLlQwXSwgWzAsLi5UMV0sIFtfLC4uVDJdKSA6LSBYPT0xLCB0Z2F0ZShUMCwgVDEsIFQyKS4KKworCityKERlcHRoLFRhYmxlKSA6LSBydW4oMCwgVGFibGUsIEwsIEMsIEQpLAorICAgICAgICAgICAgICAgICAgRGVwdGggPTwgRCwKKwkgICAgICAgICAgbmwsIHdyaXRlKFttaW5pbXVtLGNvc3QsY2lyY3VpdCxvZix0aGUsc2hvcnRlc3QsZGVsYXldKSwKKwkgICAgICAgICAgbmwsIHdyaXRlKFsgIGNpcmN1aXQsPSxMXSksCisJICAgICAgICAgIG5sLCB3cml0ZShbICBjb3N0LGlzLEMsZ2F0ZXNdKSwKKwkgICAgICAgICAgbmwsIHdyaXRlKFsgIGRlbGF5LGlzLEQsZ2F0ZSx0aW1lc10pLG5sLCEuCityKERlcHRoLFRhYmxlKSA6LSBydW4oRGVwdGgsIFRhYmxlLCBMLCBDLCBEKSwKKwkgICAgICAgICAgbmwsIHdyaXRlKFtsb3dlc3QsY29zdCxjaXJjdWl0LGZvcixhLGdpdmVuLGRlbGF5XSksCisJICAgICAgICAgIG5sLCB3cml0ZShbICBjaXJjdWl0LD0sTF0pLAorCSAgICAgICAgICBubCwgd3JpdGUoWyAgY29zdCxpcyxDLGdhdGVzXSksCisJICAgICAgICAgIG5sLCB3cml0ZShbICBkZWxheSxpcyxELGdhdGUsdGltZXNdKSxubC4KKworJVV0aWxpdHkgcHJvY2VkdXJlcworCittaW4oWCxZLFgpIDotIFggPCBZICwgISAuCittaW4oWCxZLFkpLgorCit1cGRhdGVfY29zdChDb3N0X2luLCBDb3N0LCBDb3N0X291dCkgOi0gQ29zdF9vdXQgaXMgQ29zdF9pbiArIENvc3QsCisJCQkJCWNvc3RfYm91bmQoQiksCisJCQkJCUNvc3Rfb3V0IDwgQiwgISAuCisKK2Nvc3RfYm91bmQoMzIwMDApLgorCitzZXRfYm91bmQoWCkgOi0gcmV0cmFjdCgoY29zdF9ib3VuZChfKSkpLAorCQlhc3NlcnQoKGNvc3RfYm91bmQoWCkpKSwgISAuCisKK3VwZGF0ZV9ib3VuZChYKSA6LSByZXRyYWN0KChjb3N0X2JvdW5kKFkpKSksCisJCSAgIG1pbihYLFksWiksCisJCSAgIGFzc2VydCgoY29zdF9ib3VuZChaKSkpLCAhIC4KKwordXBkYXRlX2NpcmN1aXQoQ2lyY3VpdCxDb3N0KSA6LSBjb3N0X2JvdW5kKFgpLAorCQkJCUNvc3QgPCBYICwKKwkJCQlyZXRyYWN0KChjaXJjdWl0KF8pKSksCisJCQkJYXNzZXJ0KChjaXJjdWl0KENpcmN1aXQpKSksIS4KK3VwZGF0ZV9jaXJjdWl0KENpcmN1aXQsQ29zdCkuCisKK2NpcmN1aXQoW10pLgorKi8KKworJSAgSG9mc3RhZGVyJ3MgbXUgbWF0aCAobXV0ZXN0KSBwcm92aW5nIG11aWl1CislCWZyb20gR29kZWwgRXNjaGVyIEJhY2gKKworbXUgOi0gdGhlb3JlbSg1LFttLHUsaSxpLHVdKS4KKworcnVsZXMoUywgUikgOi0gcnVsZTMoUyxSKS4KK3J1bGVzKFMsIFIpIDotIHJ1bGU0KFMsUikuCitydWxlcyhTLCBSKSA6LSBydWxlMShTLFIpLgorcnVsZXMoUywgUikgOi0gcnVsZTIoUyxSKS4KKworcnVsZTEoUyxSKSA6LQorCWFwcGVuZChYLCBbaV0sIFMpLAorCWFwcGVuZChYLCBbaSx1XSwgUikuCisKK3J1bGUyKFttIHwgVF0sIFttIHwgUl0pIDotIGFwcGVuZChULCBULCBSKS4KKworcnVsZTMoW10sIC0pIDotIGZhaWwuCitydWxlMyhSLCBUKSA6LQorCWFwcGVuZChbaSxpLGldLCBTLCBSKSwKKwlhcHBlbmQoW3VdLCBTLCBUKS4KK3J1bGUzKFtIIHwgVF0sIFtIIHwgUl0pIDotIHJ1bGUzKFQsIFIpLgorCitydWxlNChbXSwgLSkgOi0gZmFpbC4KK3J1bGU0KFIsIFQpIDotIGFwcGVuZChbdSwgdV0sIFQsIFIpLgorcnVsZTQoW0ggfCBUXSwgW0ggfCBSXSkgOi0gcnVsZTQoVCwgUikuCisKK3RoZW9yZW0oRGVwdGgsIFttLCBpXSkuCit0aGVvcmVtKERlcHRoLCBbXSkgOi0gZmFpbC4KKwordGhlb3JlbShEZXB0aCwgUikgOi0KKwlEZXB0aCA+IDAsCisJRCBpcyBEZXB0aCAtIDEsCisJdGhlb3JlbShELCBTKSwKKwlydWxlcyhTLCBSKS4KKworYXBwZW5kKFtdLCBYLCBYKS4KK2FwcGVuZChbQSB8IEJdLCBYLCBbQSB8IEIxXSkgOi0KKwkhLAorCWFwcGVuZChCLCBYLCBCMSkuCisKKworJQluYWl2ZSByZXZlcnNlIChucmV2MSkKKyUJZnJvbSBXYXJyZW4ncyB0aGVzaXMKKworbnJldjEgOi0KKwlsaXN0MzAoTCksCisJbnJldmVyc2UoTCxYKS4KKwkld3JpdGUoWCksIG5sLgorCitucmV2ZXJzZShbWHxMMF0sTCkgOi0gbnJldmVyc2UoTDAsTDEpLCBjb25jYXRlbmF0ZShMMSxbWF0sTCkuCitucmV2ZXJzZShbXSxbXSkuCisKK2NvbmNhdGVuYXRlKFtYfEwxXSxMMixbWHxMM10pIDotIGNvbmNhdGVuYXRlKEwxLEwyLEwzKS4KK2NvbmNhdGVuYXRlKFtdLEwsTCkuCisKK2xpc3QzMChbMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsCisJMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsCisJMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzBdKS4KKworCislCXRoZSBxdWVlbnMgb24gYSBjaGVzc2JvYXJkIHByb2JsZW0gKHF1ZWVucykgZm9yIDR4NCBib2FyZAorCitxdWVlbnMgOi0gIHJ1big0LFgpLCBmYWlsLgorCitzaXplKDQpLgoraW50KDEpLgoraW50KDIpLgoraW50KDMpLgoraW50KDQpLgorCislcnVuKFNpemUsIFNvbG4pIDotIGdldF9zb2x1dGlvbnMoU2l6ZSwgU29sbiksIGluZm9ybShTb2xuKS4KK3J1bihTaXplLCBTb2xuKSA6LSBnZXRfc29sdXRpb25zKFNpemUsIFNvbG4pLgorCitnZXRfc29sdXRpb25zKEJvYXJkX3NpemUsIFNvbG4pIDotIHNvbHZlKEJvYXJkX3NpemUsIFtdLCBTb2xuKS4KKworJQluZXdzcXVhcmUgZ2VuZXJhdGVzIGxlZ2FsIHBvc2l0aW9ucyBmb3IgbmV4dCBxdWVlbgorCituZXdzcXVhcmUoW10sIHNxdWFyZSgxLCBYKSkgOi0gaW50KFgpLgorbmV3c3F1YXJlKFtzcXVhcmUoSSwgSikgfCBSZXN0XSwgc3F1YXJlKFgsIFkpKSA6LQorCVggaXMgSSArIDEsCisJaW50KFkpLAorCVwrKHRocmVhdGVuZWQoSSwgSiwgWCwgWSkpLAorCXNhZmUoWCwgWSwgUmVzdCkuCisKKworJQlzYWZlIGNoZWNrcyB3aGV0aGVyIHNxdWFyZShYLCBZKSBpcyB0aHJlYXRlbmVkIGJ5IGFueQorJQlleGlzdGluZyBxdWVlbnMKKworc2FmZShYLCBZLCBbXSkuCitzYWZlKFgsIFksIFtzcXVhcmUoSSwgSikgfCBMXSkgOi0KKwlcKyh0aHJlYXRlbmVkKEksIEosIFgsIFkpKSwKKwlzYWZlKFgsIFksIEwpLgorCisKKyUJdGhyZWF0ZW5lZCBjaGVja3Mgd2hldGhlciBzcXVhcmVzIChJLCBKKSBhbmQgKFgsIFkpCislCXRocmVhdGVuIGVhY2ggb3RoZXIKKwordGhyZWF0ZW5lZChJLCBKLCBYLCBZKSA6LQorCShJID0gWCksCisJIS4KK3RocmVhdGVuZWQoSSwgSiwgWCwgWSkgOi0KKwkoSiA9IFkpLAorCSEuCit0aHJlYXRlbmVkKEksIEosIFgsIFkpIDotCisJKFUgaXMgSSAtIEopLAorCShWIGlzIFggLSBZKSwKKwkoVSA9IFYpLAorCSEuCit0aHJlYXRlbmVkKEksIEosIFgsIFkpIDotCisJKFUgaXMgSSArIEopLAorCShWIGlzIFggKyBZKSwKKwkoVSA9IFYpLAorCSEuCisKKworJQlzb2x2ZSBhY2N1bXVsYXRlcyB0aGUgcG9zaXRpb25zIG9mIG9jY3VwaWVkIHNxdWFyZXMKKworc29sdmUoQnMsIFtzcXVhcmUoQnMsIFkpIHwgTF0sIFtzcXVhcmUoQnMsIFkpIHwgTF0pIDotIHNpemUoQnMpLgorc29sdmUoQm9hcmRfc2l6ZSwgSW5pdGlhbCwgRmluYWwpIDotCisJbmV3c3F1YXJlKEluaXRpYWwsIE5leHQpLAorCXNvbHZlKEJvYXJkX3NpemUsIFtOZXh0IHwgSW5pdGlhbF0sIEZpbmFsKS4KKworaW5mb3JtKFtdKSA6LSBubCxubC4KK2luZm9ybShbTSB8IExdKSA6LSB3cml0ZShNKSwgbmwsIGluZm9ybShMKS4KKworJQlxdWVyeQorJQlmcm9tIFdhcnJlbidzIHRoZXNpcworCitxdWVyeSA6LQorCXF1ZXJ5KFgpLAorCSV3cml0ZShYKSwgbmwsCisJZmFpbC4KKworcXVlcnkoW0MxLEQxLEMyLEQyXSkgOi0gCisJZGVuc2l0eShDMSxEMSksIAorCWRlbnNpdHkoQzIsRDIpLAorCUQxID4gRDIsCisJVDEgaXMgMjAqRDEsCisJVDIgaXMgMjEqRDIsCisJVDEgPCBUMi4KKworZGVuc2l0eShDLEQpIDotIHBvcChDLFApLCBhcmVhKEMsQSksIEQgaXMgKFAqMTAwKS8vQS4KKworcG9wKGNoaW5hLAk4MjUwKS4JYXJlYShjaGluYSwJMzM4MCkuCitwb3AoaW5kaWEsCTU4NjMpLglhcmVhKGluZGlhLAkxMTM5KS4KK3BvcCh1c3NyLAkyNTIxKS4JYXJlYSh1c3NyLAk4NzA4KS4KK3BvcCh1c2EsCTIxMTkpLglhcmVhKHVzYSwJMzYwOSkuCitwb3AoaW5kb25lc2lhLAkxMjc2KS4JYXJlYShpbmRvbmVzaWEsCTU3MCkuCitwb3AoamFwYW4sCTEwOTcpLglhcmVhKGphcGFuLAkxNDgpLgorcG9wKGJyYXppbCwJMTA0MikuCWFyZWEoYnJhemlsLAkzMjg4KS4KK3BvcChiYW5nbGFkZXNoLAk3NTApLglhcmVhKGJhbmdsYWRlc2gsNTUpLgorcG9wKHBha2lzdGFuLAk2ODIpLglhcmVhKHBha2lzdGFuLAkzMTEpLgorcG9wKHdfZ2VybWFueSwJNjIwKS4JYXJlYSh3X2dlcm1hbnksCTk2KS4KK3BvcChuaWdlcmlhLAk2MTMpLglhcmVhKG5pZ2VyaWEsCTM3MykuCitwb3AobWV4aWNvLAk1ODEpLglhcmVhKG1leGljbywJNzY0KS4KK3BvcCh1aywJCTU1OSkuCWFyZWEodWssCTg2KS4KK3BvcChpdGFseSwJNTU0KS4JYXJlYShpdGFseSwJMTE2KS4KK3BvcChmcmFuY2UsCTUyNSkuCWFyZWEoZnJhbmNlLAkyMTMpLgorcG9wKHBoaWxsaXBpbmVzLDQxNSkuCWFyZWEocGhpbGxpcGluZXMsOTApLgorcG9wKHRoYWlsYW5kLAk0MTApLglhcmVhKHRoYWlsYW5kLAkyMDApLgorcG9wKHR1cmtleSwJMzgzKS4JYXJlYSh0dXJrZXksCTI5NikuCitwb3AoZWd5cHQsCTM2NCkuCWFyZWEoZWd5cHQsCTM4NikuCitwb3Aoc3BhaW4sCTM1MikuCWFyZWEoc3BhaW4sCTE5MCkuCitwb3AocG9sYW5kLAkzMzcpLglhcmVhKHBvbGFuZCwJMTIxKS4KK3BvcChzX2tvcmVhLAkzMzUpLglhcmVhKHNfa29yZWEsCTM3KS4KK3BvcChpcmFuLAkzMjApLglhcmVhKGlyYW4sCTYyOCkuCitwb3AoZXRoaW9waWEsCTI3MikuCWFyZWEoZXRoaW9waWEsCTM1MCkuCitwb3AoYXJnZW50aW5hLAkyNTEpLglhcmVhKGFyZ2VudGluYSwJMTA4MCkuCisKKworJQlxdWlja3NvcnQgKHFzNCkgb24gNTAgaXRlbXMKKyUJZnJvbSBXYXJyZW4ncyB0aGVzaXMKKworcXM0IDotCisJbGlzdDUwKEwpLAorCXFzb3J0KEwsWCxbXSkuCisJJXdyaXRlKFgpLCBubC4KKworcXNvcnQoW1h8TF0sUixSMCkgOi0KKwlwYXJ0aXRpb24oTCxYLEwxLEwyKSwKKwlxc29ydChMMixSMSxSMCksCisJcXNvcnQoTDEsUixbWHxSMV0pLgorcXNvcnQoW10sUixSKS4KKworcGFydGl0aW9uKFtYfExdLFksW1h8TDFdLEwyKSA6LQorCVg8WSwgISwKKwlwYXJ0aXRpb24oTCxZLEwxLEwyKS4KK3BhcnRpdGlvbihbWHxMXSxZLEwxLFtYfEwyXSkgOi0KKwlwYXJ0aXRpb24oTCxZLEwxLEwyKS4KK3BhcnRpdGlvbihbXSxfLFtdLFtdKS4KKworbGlzdDUwKFsyNyw3NCwxNywzMyw5NCwxOCw0Niw4Myw2NSwyLAorCTMyLDUzLDI4LDg1LDk5LDQ3LDI4LDgyLDYsMTEsCisJNTUsMjksMzksODEsOTAsMzcsMTAsMCw2Niw1MSwKKwk3LDIxLDg1LDI3LDMxLDYzLDc1LDQsOTUsOTksCisJMTEsMjgsNjEsNzQsMTgsOTIsNDAsNTMsNTksOF0pLgorCisKKworJQlzZXJpYWxpemUgKHBhbGluMjUpCislCWZyb20gV2FycmVuJ3MgdGhlc2lzCisKK3BhbGluMjUgOi0KKwlwYWxpbjI1KFApLAorCXNlcmlhbGl6ZShQLFgpLgorCSV3cml0ZShYKSxubC4KKworc2VyaWFsaXplKEwsUikgOi0KKwlwYWlybGlzdHMoTCxSLEEpLAorCWFycmFuZ2UoQSxUKSwKKwludW1iZXJlZChULDEsTikuCisKK3BhaXJsaXN0cyhbWHxMXSwgW1l8Ul0sIFtwYWlyKFgsWSl8QV0pIDotIHBhaXJsaXN0cyhMLFIsQSkuCitwYWlybGlzdHMoW10sIFtdLCBbXSkuCisKK2FycmFuZ2UoW1h8TF0sIHRyZWUoVDEsIFgsIFQyKSkgOi0KKwlzcGxpdChMLCBYLCBMMSwgTDIpLAorCWFycmFuZ2UoTDEsIFQxKSwKKwlhcnJhbmdlKEwyLCBUMikuCithcnJhbmdlKFtdLCB2b2lkKS4KKworc3BsaXQoW1h8TF0sIFgsIEwxLCBMMikgOi0gISwgc3BsaXQoTCwgWCwgTDEsIEwyKS4KK3NwbGl0KFtYfExdLCBZLCBbWHxMMV0sIEwyKSA6LSBiZWZvcmUoWCxZKSwgISwgc3BsaXQoTCxZLEwxLEwyKS4KK3NwbGl0KFtYfExdLCBZLCBMMSwgW1h8TDJdKSA6LSBiZWZvcmUoWSxYKSwgISwgc3BsaXQoTCxZLEwxLEwyKS4KK3NwbGl0KFtdLCBfLCBbXSwgW10pLgorCitiZWZvcmUocGFpcihYMSxZMSksIHBhaXIoWDIsWTIpKSA6LSBYMSA8IFgyLgorCitudW1iZXJlZCh0cmVlKFQxLCBwYWlyKFgsTjEpLCBUMiksIE4wLCBOKSA6LQorCW51bWJlcmVkKFQxLCBOMCwgTjEpLAorCSVpcyhOMixOMSwrLDEpLAorCU4yIGlzIE4xKzEsCisJbnVtYmVyZWQoVDIsTjIsTikuCitudW1iZXJlZChfLE4sTikuCisKK3BhbGluMjUoIkFCTEUgV0FTIEkgRVJFIEkgU0FXIEVMQkEiKS4KKworCislIFRoZSBzaWV2ZSBvZiBFcmF0b3N0aGVuZXMsIGZyb20gQ2xvY2tzaW4gJiBNZWxsaXNoIChwcmkyKQorJQlmaW5kaW5nIHRoZSBwcmltZSBudW1iZXJzIHVwIHRvIDk4LgkKKworJXNpZXZlIDotIHByaW1lcyg5OCwgWCksIHdyaXRlKFgpLCBubC4KK3NpZXZlIDotIHByaW1lcyg5OCwgWCkuCisKK3ByaW1lcyhMaW1pdCwgUHMpIDotIGludGVnZXJzKDIsIExpbWl0LCBJcyksIHNpZnQoSXMsIFBzKS4KKworaW50ZWdlcnMoTG93LCBIaWdoLCBbTG93IHwgUmVzdF0pIDotIAorCUxvdyA9PCBIaWdoLCAhLAorCU0gaXMgTG93KzEsCisJaW50ZWdlcnMoTSwgSGlnaCwgUmVzdCkuCitpbnRlZ2VycyhfLF8sW10pLgorCitzaWZ0KFtdLFtdKS4KK3NpZnQoW0kgfCBJc10sIFtJIHwgUHNdKSA6LSByZW1vdmUoSSxJcyxOZXcpLCBzaWZ0KE5ldywgUHMpLgorCityZW1vdmUoUCxbXSxbXSkuCityZW1vdmUoUCxbSSB8IElzXSwgW0kgfCBOaXNdKSA6LSBcKygwIGlzIEkgbW9kIFApLCAhLCByZW1vdmUoUCxJcyxOaXMpLgorcmVtb3ZlKFAsW0kgfCBJc10sIE5pcykgOi0gMCBpcyBJIG1vZCBQLCAhLCByZW1vdmUoUCxJcyxOaXMpLgorCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2VjcmMvTWFrZWZpbGUgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2VjcmMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhYTFiMgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvZWNyYy9NYWtlZmlsZQpAQCAtMCwwICsxLDk1IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICBNYWtlZmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworUExDQUZFICAgICAgID0gcGxjYWZlCitQTENBRkVPUFRTICAgPSAtSiAnLVhteDEwMG0nCitQTEpBUiAgICAgICAgPSBwbGphcgorUExKQVJPUFRTICAgID0gLXYgLUogJy1YbXgxMDBtJyAtQyAnLUotWG14MzAwbScKKworU0lDU1RVUyAgICAgID0gL3Vzci9sb2NhbC9iaW4vc2ljc3R1cworU0lDU1RVU09QVFMgID0gCisKK1NXSSAgICAgICAgICA9IC9vcHQvbG9jYWwvYmluL3N3aXBsCitTV0lPUFRTICAgICAgPSAtTDEwMG0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLnFsIC5xbGYgLmphciAucGwgLnNpY3N0dXMgLnN3aSAucGxjYWZlIC5pbiAkKFNVRkZJWEVTKQorCitwbGNhZmU6IGNvbXBfcGxjYWZlIHJ1bl9wbGNhZmUKKworc2ljc3R1czogY29tcF9zaWNzdHVzIHJ1bl9zaWNzdHVzCisKK3N3aTogY29tcF9zd2kgcnVuX3N3aQorCithbGw6IGNvbXAgcnVuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgcnVuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitwbGNhZmVfb3V0X29iamVjdHMgIDo9ICQocGF0c3Vic3QgJS5pbiwlLnBsY2FmZSwgJCh3aWxkY2FyZCAqLmluKSkKK3NpY3N0dXNfb3V0X29iamVjdHMgOj0gJChwYXRzdWJzdCAlLmluLCUuc2ljc3R1cywkKHdpbGRjYXJkICouaW4pKQorc3dpX291dF9vYmplY3RzICAgICA6PSAkKHBhdHN1YnN0ICUuaW4sJS5zd2ksICAgICQod2lsZGNhcmQgKi5pbikpCisKKy5pbi5wbGNhZmU6CisJLXJtIC1mIG91dC8kQAorCS9iaW4vZWNobyAiWyckPCddLCBoYWx0LiIgXAorCXwgJChQTENBRkUpICQoUExDQUZFT1BUUykgLWNwICQqLmphciA+IG91dC8kQAorCisuaW4uc2ljc3R1czoKKwktcm0gLWYgb3V0LyRACisJL2Jpbi9lY2hvICJlbnN1cmVfbG9hZGVkKCQqKSwgWyckPCddLCBoYWx0LiIgXAorCXwgJChTSUNTVFVTKSAkKFNJQ1NUVVNPUFRTKSA+IG91dC8kQAorCisuaW4uc3dpOgorCS1ybSAtZiBvdXQvJEAKKwkvYmluL2VjaG8gImVuc3VyZV9sb2FkZWQoJCopLCBbJyQ8J10sIGhhbHQuIiBcCisJfCAkKFNXSSkgJChTV0lPUFRTKSA+IG91dC8kQAorCitydW46IHJ1bl9wbGNhZmUgcnVuX3NpY3N0dXMgcnVuX3N3aQorCitydW5fcGxjYWZlOiAkKHBsY2FmZV9vdXRfb2JqZWN0cykKKworcnVuX3NpY3N0dXM6ICQoc2ljc3R1c19vdXRfb2JqZWN0cykKKworcnVuX3N3aTogJChzd2lfb3V0X29iamVjdHMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgY29tcGlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworamFyX29iamVjdHMgOj0gJChwYXRzdWJzdCAlLnBsLCUuamFyLCQod2lsZGNhcmQgKi5wbCkpCitxbF9vYmplY3RzICA6PSAkKHBhdHN1YnN0ICUucGwsJS5xbCwgJCh3aWxkY2FyZCAqLnBsKSkKK3FsZl9vYmplY3RzIDo9ICQocGF0c3Vic3QgJS5wbCwlLnFsZiwkKHdpbGRjYXJkICoucGwpKQorCisucGwuamFyOgorCSQoUExKQVIpICQoUExKQVJPUFRTKSAkQCAkPAorCS1ybSAtZiAtciAkKgorCisucGwucWw6CisJL2Jpbi9lY2hvICJbJCpdLCBmY29tcGlsZSgkKiksIGhhbHQuIiB8ICQoU0lDU1RVUykgJChTSUNTVFVTT1BUUykKKworLnBsLnFsZjoKKwkvYmluL2VjaG8gInFjb21waWxlKCQqKSwgaGFsdC4iIHwgJChTV0kpICQoU1dJT1BUUykKKworY29tcDogY29tcF9wbGNhZmUgY29tcF9zaWNzdHVzIGNvbXBfc3dpCisKK2NvbXBfcGxjYWZlOiAkKGphcl9vYmplY3RzKQorCitjb21wX3NpY3N0dXM6ICQocWxfb2JqZWN0cykKKworY29tcF9zd2k6ICQocWxmX29iamVjdHMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgY2xlYW4gdXAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2NsZWFuOgorCS1ybSAtZiBjb3JlICp+CisJLXJtIC1mIC9vdXQvY29yZSBvdXQvKn4KKwktcm0gLWYgKi5xbAorCS1ybSAtZiAqLnFsZgorCityZWFsY2xlYW46IGNsZWFuCisJLXJtIC1mICouamFyICouY2xhc3MKKwktcm0gLWYgb3V0LyoucGxjYWZlIG91dC8qLnNpY3N0dXMgb3V0Lyouc3dpCisKKyMgRU5ECisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvZWNyYy9iZW5jaF8xXzEuaW4gYi9leGFtcGxlcy9iZW5jaG1hcmtzL2VjcmMvYmVuY2hfMV8xLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MmNmZjgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2VjcmMvYmVuY2hfMV8xLmluCkBAIC0wLDAgKzEgQEAKKzotIGJvcmVzZWEoMTAwMDAwKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvZWNyYy9iZW5jaF8xXzEucGwgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2VjcmMvYmVuY2hfMV8xLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlN2RiOWQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2VjcmMvYmVuY2hfMV8xLnBsCkBAIC0wLDAgKzEsMjUyIEBACisvKiBDSEFOR0VMT0cgYnkgTS5CYW5iYXJhCisgIC0gcHJpbnRfdGltZXMvNCAtLT4gcHJpbnRfdGltZXMvNQorICAtIHJlcG9ydF9jc3YvMiBpcyBhZGRlZC4KKyovCisKKworLyogVGhpcyBwcm9ncmFtIGlzIGNhbGxlZCB3aXRoIHRoZSBxdWVyeSAiPy1ib3Jlc2VhKFgpLiIgICAgICAgICAqLworLyogWCBpcyB0aGUgbnVtYmVyIG9mIGxvb3AgaXRlcmF0aW9ucyBleGVjdXRlZC4gSXQgc2hvdWxkIGJlIGJpZyAqLworLyogZW5vdWdoIHRvIGdpdmUgc2lnbmlmaWNhbnQgcmVzdWx0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogc3VnZ2VzdGVkIHZhbHVlIGZvciBYOiAxMDAgZm9yIGludGVycHJldGVkIGNvZGUqLworLyogICAgICAgICAgICAgICAgICAgICAgIDEwMDAgZm9yIGNvbXBpbGVkIGNvZGUgICAqLworLyogYXZlcmFnZSB2YWx1ZXMgZm9yIEMtcHJvbG9nIGludGVycHJldGVyOiAgICAgICAqLworLyogICAgICAgWD0xMDAwLCBUbG9vcD0yNy4xIFQuY29tcD0xLjAgVG5ldD0yNi4xIEtsaXBzPTcuNyAqLworCitib3Jlc2VhKFgpCisgICAgIDotIHN0YXRpc3RpY3MocnVudGltZSxbVDF8X10pLAorICAgICAgICBkb19tYXhfS0xpcHMoWCksICAgICAgIC8qIGNhbGxzIHRoZSBsb29wIHRvIGV4ZWN1dGUgdGhlICAqLworICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QyfF9dKSwgICAgICAgIC8qIHNlcXVlbmNlIG9mIDIwMCBwcmVkaWNhdGVzICAgICAqLworICAgICAgICBjb21wZW5zX2xvb3AoWCksICAgICAgIC8qIGNvbXBlbnNhdGlvbiBsb29wICAgICAgICAgICAgICAqLworICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QzfF9dKSwKKyAgICAgICAgcHJpbnRfdGltZXMoYm9yZXNlYShYKSxUMSxUMixUMyxYLDIwMCkuIC8qY29tcHV0ZSBhbmQgcHJpbnQgcmVzdWx0cyAgKi8KKworY29tcGVuc19sb29wKDApLiAgICAgICAgICAgICAgICAgICAgLyogY29tcGVuc2F0aW9uIGxvb3AgICAgICAgICAqLworY29tcGVuc19sb29wKFgpIDotIFkgaXMgWCAtIDEsIGNvbXBlbnNfbG9vcChZKS4KKworcHJpbnRfdGltZXMoTmFtZSxUMSxUMixUMyxYLEkpIDotICAgICAgICAvKiBwcmludHMgdGhlIHJlc3VsdHMgICAgICAgICovCisgICAgICAgIFRUMSBpcyBUMiAtIFQxLAorICAgICAgICBUVDIgaXMgVDMgLSBUMiwKKyAgICAgICAgVFQgaXMgVFQxIC0gVFQyLAorICAgICAgICB3cml0ZSgnIyBOYW1lOiAgICAgICAgICAgICAnKSx3cml0ZShOYW1lKSwgbmwsCisgICAgICAgIHdyaXRlKCcjIFQgb3ZlcmFsbCBsb29wOiAgICcpLHdyaXRlKFRUMSksIHdyaXRlKCcgbXNlYy4nKSxubCwKKyAgICAgICAgd3JpdGUoJyMgVCBjb21wZW5zIGxvb3A6ICAgJyksd3JpdGUoVFQyKSwgd3JpdGUoJyBtc2VjLicpLG5sLAorICAgICAgICB3cml0ZSgnIyBUIG5ldDogICAgICAgICAgICAnKSx3cml0ZShUVCksICB3cml0ZSgnIG1zZWMuJyksbmwsCisgICAgICAgIHdyaXRlKCcjIEtMaXBzOiAgICAgICAgICAgICcpLAorICAgICAgICBMaSBpcyBJICogWCwKKyAgICAgICAgTGlwcyBpcyBMaSAvIFRULAorICAgICAgICBLTGlwcyBpcyBMaXBzIC8gMTAwMCwKKyAgICAgICAgd3JpdGUoS0xpcHMpLG5sLAorCXJlcG9ydF9jc3YoWycjIyNDU1YjIyMnLE5hbWUsVFQxLFRUMixUVCxLTGlwc10sICcsJyksCisJbmwuCisKK3JlcG9ydF9jc3YoW10sIF8pIDotICEuCityZXBvcnRfY3N2KFtYXSwgXykgOi0gISwgd3JpdGUoWCksIG5sLgorcmVwb3J0X2NzdihbWHxYc10sIERlbGltKSA6LSB3cml0ZShYKSwgd3JpdGUoRGVsaW0pLCByZXBvcnRfY3N2KFhzLCBEZWxpbSkuCisKKworCitkb19tYXhfS0xpcHMoMCkuICAgICAgICAgICAgLyogbG9vcCBjYWxsaW5nIHRoZSBhY3R1YWwgYmVuY2htYXJrICovCitkb19tYXhfS0xpcHMoWCkgOi0gbGlwczEsIFkgaXMgWCAtIDEsIGRvX21heF9LTGlwcyhZKS4KKworLyogcHJlZGljYXRlcyB0byB0ZXN0IGNhbGwgKi8KKworbGlwczEgOi0gbGlwczIuCitsaXBzMiA6LSBsaXBzMy4KK2xpcHMzIDotIGxpcHM0LgorbGlwczQgOi0gbGlwczUuCitsaXBzNSA6LSBsaXBzNi4KK2xpcHM2IDotIGxpcHM3LgorbGlwczcgOi0gbGlwczguCitsaXBzOCA6LSBsaXBzOS4KK2xpcHM5IDotIGxpcHMxMC4KK2xpcHMxMCA6LSBsaXBzMTEuCitsaXBzMTEgOi0gbGlwczEyLgorbGlwczEyIDotIGxpcHMxMy4KK2xpcHMxMyA6LSBsaXBzMTQuCitsaXBzMTQgOi0gbGlwczE1LgorbGlwczE1IDotIGxpcHMxNi4KK2xpcHMxNiA6LSBsaXBzMTcuCitsaXBzMTcgOi0gbGlwczE4LgorbGlwczE4IDotIGxpcHMxOS4KK2xpcHMxOSA6LSBsaXBzMjAuCitsaXBzMjAgOi0gbGlwczIxLgorbGlwczIxIDotIGxpcHMyMi4KK2xpcHMyMiA6LSBsaXBzMjMuCitsaXBzMjMgOi0gbGlwczI0LgorbGlwczI0IDotIGxpcHMyNS4KK2xpcHMyNSA6LSBsaXBzMjYuCitsaXBzMjYgOi0gbGlwczI3LgorbGlwczI3IDotIGxpcHMyOC4KK2xpcHMyOCA6LSBsaXBzMjkuCitsaXBzMjkgOi0gbGlwczMwLgorbGlwczMwIDotIGxpcHMzMS4KK2xpcHMzMSA6LSBsaXBzMzIuCitsaXBzMzIgOi0gbGlwczMzLgorbGlwczMzIDotIGxpcHMzNC4KK2xpcHMzNCA6LSBsaXBzMzUuCitsaXBzMzUgOi0gbGlwczM2LgorbGlwczM2IDotIGxpcHMzNy4KK2xpcHMzNyA6LSBsaXBzMzguCitsaXBzMzggOi0gbGlwczM5LgorbGlwczM5IDotIGxpcHM0MC4KK2xpcHM0MCA6LSBsaXBzNDEuCitsaXBzNDEgOi0gbGlwczQyLgorbGlwczQyIDotIGxpcHM0My4KK2xpcHM0MyA6LSBsaXBzNDQuCitsaXBzNDQgOi0gbGlwczQ1LgorbGlwczQ1IDotIGxpcHM0Ni4KK2xpcHM0NiA6LSBsaXBzNDcuCitsaXBzNDcgOi0gbGlwczQ4LgorbGlwczQ4IDotIGxpcHM0OS4KK2xpcHM0OSA6LSBsaXBzNTAuCitsaXBzNTAgOi0gbGlwczUxLgorbGlwczUxIDotIGxpcHM1Mi4KK2xpcHM1MiA6LSBsaXBzNTMuCitsaXBzNTMgOi0gbGlwczU0LgorbGlwczU0IDotIGxpcHM1NS4KK2xpcHM1NSA6LSBsaXBzNTYuCitsaXBzNTYgOi0gbGlwczU3LgorbGlwczU3IDotIGxpcHM1OC4KK2xpcHM1OCA6LSBsaXBzNTkuCitsaXBzNTkgOi0gbGlwczYwLgorbGlwczYwIDotIGxpcHM2MS4KK2xpcHM2MSA6LSBsaXBzNjIuCitsaXBzNjIgOi0gbGlwczYzLgorbGlwczYzIDotIGxpcHM2NC4KK2xpcHM2NCA6LSBsaXBzNjUuCitsaXBzNjUgOi0gbGlwczY2LgorbGlwczY2IDotIGxpcHM2Ny4KK2xpcHM2NyA6LSBsaXBzNjguCitsaXBzNjggOi0gbGlwczY5LgorbGlwczY5IDotIGxpcHM3MC4KK2xpcHM3MCA6LSBsaXBzNzEuCitsaXBzNzEgOi0gbGlwczcyLgorbGlwczcyIDotIGxpcHM3My4KK2xpcHM3MyA6LSBsaXBzNzQuCitsaXBzNzQgOi0gbGlwczc1LgorbGlwczc1IDotIGxpcHM3Ni4KK2xpcHM3NiA6LSBsaXBzNzcuCitsaXBzNzcgOi0gbGlwczc4LgorbGlwczc4IDotIGxpcHM3OS4KK2xpcHM3OSA6LSBsaXBzODAuCitsaXBzODAgOi0gbGlwczgxLgorbGlwczgxIDotIGxpcHM4Mi4KK2xpcHM4MiA6LSBsaXBzODMuCitsaXBzODMgOi0gbGlwczg0LgorbGlwczg0IDotIGxpcHM4NS4KK2xpcHM4NSA6LSBsaXBzODYuCitsaXBzODYgOi0gbGlwczg3LgorbGlwczg3IDotIGxpcHM4OC4KK2xpcHM4OCA6LSBsaXBzODkuCitsaXBzODkgOi0gbGlwczkwLgorbGlwczkwIDotIGxpcHM5MS4KK2xpcHM5MSA6LSBsaXBzOTIuCitsaXBzOTIgOi0gbGlwczkzLgorbGlwczkzIDotIGxpcHM5NC4KK2xpcHM5NCA6LSBsaXBzOTUuCitsaXBzOTUgOi0gbGlwczk2LgorbGlwczk2IDotIGxpcHM5Ny4KK2xpcHM5NyA6LSBsaXBzOTguCitsaXBzOTggOi0gbGlwczk5LgorbGlwczk5IDotIGxpcHMxMDAuCitsaXBzMTAwOi0gbGlwczEwMS4KK2xpcHMxMDEgOi0gbGlwczEwMi4KK2xpcHMxMDIgOi0gbGlwczEwMy4KK2xpcHMxMDMgOi0gbGlwczEwNC4KK2xpcHMxMDQgOi0gbGlwczEwNS4KK2xpcHMxMDUgOi0gbGlwczEwNi4KK2xpcHMxMDYgOi0gbGlwczEwNy4KK2xpcHMxMDcgOi0gbGlwczEwOC4KK2xpcHMxMDggOi0gbGlwczEwOS4KK2xpcHMxMDkgOi0gbGlwczExMC4KK2xpcHMxMTAgOi0gbGlwczExMS4KK2xpcHMxMTEgOi0gbGlwczExMi4KK2xpcHMxMTIgOi0gbGlwczExMy4KK2xpcHMxMTMgOi0gbGlwczExNC4KK2xpcHMxMTQgOi0gbGlwczExNS4KK2xpcHMxMTUgOi0gbGlwczExNi4KK2xpcHMxMTYgOi0gbGlwczExNy4KK2xpcHMxMTcgOi0gbGlwczExOC4KK2xpcHMxMTggOi0gbGlwczExOS4KK2xpcHMxMTkgOi0gbGlwczEyMC4KK2xpcHMxMjAgOi0gbGlwczEyMS4KK2xpcHMxMjEgOi0gbGlwczEyMi4KK2xpcHMxMjIgOi0gbGlwczEyMy4KK2xpcHMxMjMgOi0gbGlwczEyNC4KK2xpcHMxMjQgOi0gbGlwczEyNS4KK2xpcHMxMjUgOi0gbGlwczEyNi4KK2xpcHMxMjYgOi0gbGlwczEyNy4KK2xpcHMxMjcgOi0gbGlwczEyOC4KK2xpcHMxMjggOi0gbGlwczEyOS4KK2xpcHMxMjkgOi0gbGlwczEzMC4KK2xpcHMxMzAgOi0gbGlwczEzMS4KK2xpcHMxMzEgOi0gbGlwczEzMi4KK2xpcHMxMzIgOi0gbGlwczEzMy4KK2xpcHMxMzMgOi0gbGlwczEzNC4KK2xpcHMxMzQgOi0gbGlwczEzNS4KK2xpcHMxMzUgOi0gbGlwczEzNi4KK2xpcHMxMzYgOi0gbGlwczEzNy4KK2xpcHMxMzcgOi0gbGlwczEzOC4KK2xpcHMxMzggOi0gbGlwczEzOS4KK2xpcHMxMzkgOi0gbGlwczE0MC4KK2xpcHMxNDAgOi0gbGlwczE0MS4KK2xpcHMxNDEgOi0gbGlwczE0Mi4KK2xpcHMxNDIgOi0gbGlwczE0My4KK2xpcHMxNDMgOi0gbGlwczE0NC4KK2xpcHMxNDQgOi0gbGlwczE0NS4KK2xpcHMxNDUgOi0gbGlwczE0Ni4KK2xpcHMxNDYgOi0gbGlwczE0Ny4KK2xpcHMxNDcgOi0gbGlwczE0OC4KK2xpcHMxNDggOi0gbGlwczE0OS4KK2xpcHMxNDkgOi0gbGlwczE1MC4KK2xpcHMxNTAgOi0gbGlwczE1MS4KK2xpcHMxNTEgOi0gbGlwczE1Mi4KK2xpcHMxNTIgOi0gbGlwczE1My4KK2xpcHMxNTMgOi0gbGlwczE1NC4KK2xpcHMxNTQgOi0gbGlwczE1NS4KK2xpcHMxNTUgOi0gbGlwczE1Ni4KK2xpcHMxNTYgOi0gbGlwczE1Ny4KK2xpcHMxNTcgOi0gbGlwczE1OC4KK2xpcHMxNTggOi0gbGlwczE1OS4KK2xpcHMxNTkgOi0gbGlwczE2MC4KK2xpcHMxNjAgOi0gbGlwczE2MS4KK2xpcHMxNjEgOi0gbGlwczE2Mi4KK2xpcHMxNjIgOi0gbGlwczE2My4KK2xpcHMxNjMgOi0gbGlwczE2NC4KK2xpcHMxNjQgOi0gbGlwczE2NS4KK2xpcHMxNjUgOi0gbGlwczE2Ni4KK2xpcHMxNjYgOi0gbGlwczE2Ny4KK2xpcHMxNjcgOi0gbGlwczE2OC4KK2xpcHMxNjggOi0gbGlwczE2OS4KK2xpcHMxNjkgOi0gbGlwczE3MC4KK2xpcHMxNzAgOi0gbGlwczE3MS4KK2xpcHMxNzEgOi0gbGlwczE3Mi4KK2xpcHMxNzIgOi0gbGlwczE3My4KK2xpcHMxNzMgOi0gbGlwczE3NC4KK2xpcHMxNzQgOi0gbGlwczE3NS4KK2xpcHMxNzUgOi0gbGlwczE3Ni4KK2xpcHMxNzYgOi0gbGlwczE3Ny4KK2xpcHMxNzcgOi0gbGlwczE3OC4KK2xpcHMxNzggOi0gbGlwczE3OS4KK2xpcHMxNzkgOi0gbGlwczE4MC4KK2xpcHMxODAgOi0gbGlwczE4MS4KK2xpcHMxODEgOi0gbGlwczE4Mi4KK2xpcHMxODIgOi0gbGlwczE4My4KK2xpcHMxODMgOi0gbGlwczE4NC4KK2xpcHMxODQgOi0gbGlwczE4NS4KK2xpcHMxODUgOi0gbGlwczE4Ni4KK2xpcHMxODYgOi0gbGlwczE4Ny4KK2xpcHMxODcgOi0gbGlwczE4OC4KK2xpcHMxODggOi0gbGlwczE4OS4KK2xpcHMxODkgOi0gbGlwczE5MC4KK2xpcHMxOTAgOi0gbGlwczE5MS4KK2xpcHMxOTEgOi0gbGlwczE5Mi4KK2xpcHMxOTIgOi0gbGlwczE5My4KK2xpcHMxOTMgOi0gbGlwczE5NC4KK2xpcHMxOTQgOi0gbGlwczE5NS4KK2xpcHMxOTUgOi0gbGlwczE5Ni4KK2xpcHMxOTYgOi0gbGlwczE5Ny4KK2xpcHMxOTcgOi0gbGlwczE5OC4KK2xpcHMxOTggOi0gbGlwczE5OS4KK2xpcHMxOTkgOi0gbGlwczIwMC4KK2xpcHMyMDAuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2VjcmMvYmVuY2hfMV8yLmluIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzFfMi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTRkYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzFfMi5pbgpAQCAtMCwwICsxLDUgQEAKKzotIGNob2ljZV9wb2ludCgxMDAwMCkuCis6LSBjaG9pY2VfcG9pbnQoMTAwMDApLgorOi0gY2hvaWNlX3BvaW50MGFyKDEwMDAwKS4KKzotIGJha3RyYWsxKDEwMDAwMDApLgorOi0gYmFrdHJhazIoMTAwMDAwMCkuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2VjcmMvYmVuY2hfMV8yLnBsIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzFfMi5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjc2NjYyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzFfMi5wbApAQCAtMCwwICsxLDI1NSBAQAorLyogQ0hBTkdFTE9HIGJ5IE0uQmFuYmFyYQorICAtIHByaW50X3RpbWVzLzQgLS0+IHByaW50X3RpbWVzLzUKKyAgLSByZXBvcnRfY3N2LzIgaXMgYWRkZWQuCisqLworCisvKiBUaGUgcHJlZGljYXRlcyBhcmUgY2FsbGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogICAgbyAgImNob2ljZV9wb2ludChOKSIgICAgLSBjcmVhdGlvbiBvZiBjaG9pY2UgcG9pbnRzICAgICovCisvKiAgICBvICAiY2hvaWNlX3BvaW50MGFyKE4pICAtIHNhbWUsIHdpdGggMCBhcmcgICAgICAgICAgICAgKi8KKy8qICAgIG8gICJiYWt0cmFrMShOKSIgICAgICAgIC0gZGVlcCBiYWNrdHJhY2tpbmcgICAgICAgICAgICAqLworLyogICAgbyAgImJha3RyYWsyKE4pIiAgICAgICAgLSBzaGFsbG93IGJhY2t0cmFja2luZyAgICAgICAgICovCisKKy8qICBOIGlzIHRoZSBudW1iZXIgb2YgbG9vcCBpdGVyYXRpb25zIGV4ZWN1dGVkICAqLworCisKKy8qIHByZWRpY2F0ZSB0byB0ZXN0IGNyZWF0aW9uIG9mIGNob2ljZSBwb2ludHMgd2l0aG91dCBiYWNrdHJhY2tpbmcgKi8KKy8qIHN1Z2dlc3RlZCB2YWx1ZSBmb3IgTjogMTAwMCAqLworLyogcmVzdWx0cyBmb3IgIENwcm9sb2cgTj0xMDAwICovCisvKiBUbG9vcD01Ljk1IFRjb21wZW5zPTAuOTggVG5ldD00Ljk3IEtsaXBzPTQuMDIgKi8KKworY2hvaWNlX3BvaW50KE4pOi1zdGF0aXN0aWNzKHJ1bnRpbWUsW1QxfF9dKSwKKyAgICAgICAgY3JlX0NQKE4pLCBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QyfF9dKSwKKyAgICAgICAgY29tcGVuc19sb29wKE4pLCBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QzfF9dKSwKKyAgICAgICAgcHJpbnRfdGltZXMoY2hvaWNlX3BvaW50KE4pLFQxLFQyLFQzLE4sMjApLgorCisvKiBwcmVkaWNhdGUgY2hvaWNlX3BvaW50LCBidXQgd2l0aCB6ZXJvIGFyZ3VtZW50ICAqLworLyogc3VnZ2VzdGVkIHZhbHVlIGZvciBOOiAxMDAwICovCisvKiByZXN1bHRzIGZvciBDcHJvbG9nOiBOPTEwMDAgKi8KKy8qIFRsb29wPTMuNTUgVGNvbXBlbnM9MC45OCBUbmV0PTIuNTcgS2xpcHM9Ny43ICAqLworCisKK2Nob2ljZV9wb2ludDBhcihOKTotc3RhdGlzdGljcyhydW50aW1lLFtUMXxfXSksCisgICAgICAgIGNyZV9DUDBhcihOKSwgc3RhdGlzdGljcyhydW50aW1lLFtUMnxfXSksCisgICAgICAgIGNvbXBlbnNfbG9vcChOKSwgc3RhdGlzdGljcyhydW50aW1lLFtUM3xfXSksCisgICAgICAgIHByaW50X3RpbWVzKGNob2ljZV9wb2ludDBhcihOKSxUMSxUMixUMyxOLDIwKS4KKy8qIFByZWRpY2F0ZSB0byB0ZXN0IHRoZSAoZGVlcCkgYmFja3RyYWNraW5nIG1lY2hhbmlzbS4gKi8KKy8qIHN1Z2dlc3RlZCB2YWx1ZSBmb3IgTjogMTAwMCAoaW50ZXJwKSwgMjAwMChjb21wKSAqLworLyogcmVzdWx0cyBmb3IgQ3Byb2xvZzogTj0xMDAwICAqLworLyogVGxvb3A9OS42MyBUY29tcD0xIFRuZXQ9OC42MyBLbGlwcz0yLjMyICAqLworCitiYWt0cmFrMShOKQorICAgICA6LSBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QxfF9dKSwKKyAgICAgICAgZGVlcF9iYWNrKE4pLAorICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QyfF9dKSwKKyAgICAgICAgY29tcGVuc19sb29wKE4pLAorICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QzfF9dKSwKKyAgICAgICAgcHJpbnRfdGltZXMoYmFrdHJhazEoTiksVDEsVDIsVDMsTiwyMCkuCisKKworLyogUHJlZGljYXRlIHRvIHRlc3QgdGhlIChzaGFsbG93KSBiYWNrdHJhY2tpbmcgbWVjaGFuaXNtICovCisvKiBzdWdnZXN0ZWQgdmFsdWUgZm9yIE46IDEwMDAgKGludGVycCksIDIwMDAgKGNvbXApICovCisvKiByZXN1bHRzIGZvciBDcHJvbG9nOiBOPTEwMDAgICovCisvKiBUbG9vcD0zLjYzICBUY29tcD0wLjk1IFRuZXQ9Mi42OCBLbGlwcz03LjQ1ICovCisKK2Jha3RyYWsyKFgpCisgICAgIDotIHN0YXRpc3RpY3MocnVudGltZSxbVDF8X10pLAorICAgICAgICBzaGFsbG93X2JhY2soWCksIHN0YXRpc3RpY3MocnVudGltZSxbVDJ8X10pLAorICAgICAgICBjb21wZW5zX2xvb3AoWCksIHN0YXRpc3RpY3MocnVudGltZSxbVDN8X10pLAorICAgICAgICBwcmludF90aW1lcyhiYWt0cmFrMihYKSxUMSxUMixUMyxYLDIwKS4KKworCisvKiBjb21wZW5zYXRpb24gbG9vcCwgdXNlZCB0byBtZWFzdXJlIHRoZSB0aW1lIHNwZW50IGluIHRoZSBsb29wICAqLworY29tcGVuc19sb29wKDApLgorY29tcGVuc19sb29wKFgpIDotIFkgaXMgWCAtIDEsIGNvbXBlbnNfbG9vcChZKS4KKworLyogbG9vcCB0byB0ZXN0IGNob2ljZSBwb2ludCBjcmVhdGlvbiAgICovCitjcmVfQ1AoMCkuCitjcmVfQ1AoTik6LU0gaXMgTi0xLCBjY3AxKDAsMCwwKSwgY3JlX0NQKE0pLgorCitjcmVfQ1AwYXIoMCkuCitjcmVfQ1AwYXIoTik6LU0gaXMgTi0xLCBjY3AxLCBjcmVfQ1AwYXIoTSkuCisKKy8qIGxvb3AgdG8gdGVzdCBkZWVwIGJhY2t0cmFja2luZyAgICAgICAqLworZGVlcF9iYWNrKDApLgorZGVlcF9iYWNrKFgpIDotIHBkKF8sXyxfKSwgWSBpcyBYIC0gMSwgZGVlcF9iYWNrKFkpLgorCisvKiBsb29wIHRvIHRlc3Qgc2hhbGxvdyBiYWNrdHJhY2tpbmcgKi8KK3NoYWxsb3dfYmFjaygwKS4KK3NoYWxsb3dfYmFjayhYKSA6LSBwcyhfLGEsYiksIFkgaXMgWCAtIDEsIHNoYWxsb3dfYmFjayhZKS4KKworCitwcmludF90aW1lcyhOYW1lLFQxLFQyLFQzLFgsSSkgOi0gICAgICAgIC8qIHByaW50cyB0aGUgcmVzdWx0cyAqLworICAgICAgICBUVDEgaXMgVDIgLSBUMSwKKyAgICAgICAgVFQyIGlzIFQzIC0gVDIsCisgICAgICAgIFRUIGlzIFRUMSAtIFRUMiwKKyAgICAgICAgd3JpdGUoJyMgTmFtZTogICAgICAgICAgICAgJyksd3JpdGUoTmFtZSksIG5sLAorICAgICAgICB3cml0ZSgnIyBUIG92ZXJhbGwgbG9vcDogICAnKSx3cml0ZShUVDEpLCB3cml0ZSgnIG1zZWMuJyksbmwsCisgICAgICAgIHdyaXRlKCcjIFQgY29tcGVucyBsb29wOiAgICcpLHdyaXRlKFRUMiksIHdyaXRlKCcgbXNlYy4nKSxubCwKKyAgICAgICAgd3JpdGUoJyMgVCBuZXQ6ICAgICAgICAgICAgJyksd3JpdGUoVFQpLHdyaXRlKCcgbXNlYy4nKSxubCwKKyAgICAgICAgd3JpdGUoJyMgS0xpcHM6ICAgICAgICAgICAgJyksCisgICAgICAgIExpIGlzIEkgKiBYLAorICAgICAgICBMaXBzIGlzIExpIC8gVFQsCisgICAgICAgIEtMaXBzIGlzIExpcHMgLyAxMDAwLAorICAgICAgICB3cml0ZShLTGlwcyksbmwsCisJcmVwb3J0X2NzdihbJyMjI0NTViMjIycsTmFtZSxUVDEsVFQyLFRULEtMaXBzXSwgJywnKSwKKwlubC4KKworcmVwb3J0X2NzdihbXSwgXykgOi0gIS4KK3JlcG9ydF9jc3YoW1hdLCBfKSA6LSAhLCB3cml0ZShYKSwgbmwuCityZXBvcnRfY3N2KFtYfFhzXSwgRGVsaW0pIDotIHdyaXRlKFgpLCB3cml0ZShEZWxpbSksIHJlcG9ydF9jc3YoWHMsIERlbGltKS4KKworCisvKiAgY2NwMSBjcmVhdGVzIDIwIGNob2ljZSBwb2ludHMgKi8KKy8qIGNjcDEgaXMgdGhlIGJlZ2lubmluZyBvZiBhIHNldCBvZiBwcmVkaWNhdGVzICAqLworLyogY29tcG9zZWQgb2YgMiBjbGF1c2VzIGVhY2guIEV2ZXJ5IGludm9rYXRpb24gb2YgbmQwIHdpbGwgY3JlYXRlICovCisvKiBhIHNlcXVlbmNlIG9mIDIwIGNob2ljZSBwb2ludHMuIFRoZSBib2R5IG9mIHRoZSBjbGF1c2VzIGFyZSAgICAgKi8KKy8qIGxpbWl0ZWQgdG8gb25lIGdvYWwsIHRodXMgYXZvaWRpbmcgYSBjcmVhdGlvbiBvZiBlbnZpcm9ubWVudCAgICAqLworLyogd2hlbiB0aGUgY2xhdXNlIGlzIGFjdGl2YXRlZC4gbmQwLCBhbmQgaXRzIHN1Y2Nlc3NvcnMsIGhhdmUgICAgICovCisvKiAgIHRocmVlIGFyZ3VtZW50cyB0byBjb21wbHkgd2l0aCBvdXIgYXZlcmFnZSBzdGF0aWMgYW5hbHlzaXMgICAgKi8KKy8qICAgcmVzdWx0cyBtYWRlIG9uIG1vcmUgdGhhbiAzMCByZWFsIFByb2xvZyBwcm9ncmFtcy4gICAgICAgICAgICAqLworLyogY2NwWFggZXhpc3RzIHdpdGggMyBhcmd1bWVudHMsIGFuZCAwIGFyZ3MuICovCisKK2NjcDEoWCxZLFopOi1jY3AyKFgsWSxaKS4KK2NjcDEoWCxZLFopLgorY2NwMihYLFksWik6LWNjcDMoWCxZLFopLgorY2NwMihYLFksWikuCitjY3AzKFgsWSxaKTotY2NwNChYLFksWikuCitjY3AzKFgsWSxaKS4KK2NjcDQoWCxZLFopOi1jY3A1KFgsWSxaKS4KK2NjcDQoWCxZLFopLgorY2NwNShYLFksWik6LWNjcDYoWCxZLFopLgorY2NwNShYLFksWikuCitjY3A2KFgsWSxaKTotY2NwNyhYLFksWikuCitjY3A2KFgsWSxaKS4KK2NjcDcoWCxZLFopOi1jY3A4KFgsWSxaKS4KK2NjcDcoWCxZLFopLgorY2NwOChYLFksWik6LWNjcDkoWCxZLFopLgorY2NwOChYLFksWikuCitjY3A5KFgsWSxaKTotY2NwMTAoWCxZLFopLgorY2NwOShYLFksWikuCitjY3AxMChYLFksWik6LWNjcDExKFgsWSxaKS4KK2NjcDEwKFgsWSxaKS4KK2NjcDExKFgsWSxaKTotY2NwMTIoWCxZLFopLgorY2NwMTEoWCxZLFopLgorY2NwMTIoWCxZLFopOi1jY3AxMyhYLFksWikuCitjY3AxMihYLFksWikuCitjY3AxMyhYLFksWik6LWNjcDE0KFgsWSxaKS4KK2NjcDEzKFgsWSxaKS4KK2NjcDE0KFgsWSxaKTotY2NwMTUoWCxZLFopLgorY2NwMTQoWCxZLFopLgorY2NwMTUoWCxZLFopOi1jY3AxNihYLFksWikuCitjY3AxNShYLFksWikuCitjY3AxNihYLFksWik6LWNjcDE3KFgsWSxaKS4KK2NjcDE2KFgsWSxaKS4KK2NjcDE3KFgsWSxaKTotY2NwMTgoWCxZLFopLgorY2NwMTcoWCxZLFopLgorY2NwMTgoWCxZLFopOi1jY3AxOShYLFksWikuCitjY3AxOChYLFksWikuCitjY3AxOShYLFksWik6LWNjcDIwKFgsWSxaKS4KK2NjcDE5KFgsWSxaKS4KKworY2NwMjAoWCxZLFopLgorY2NwMjAoWCxZLFopLgorCitjY3AxOi1jY3AyLgorY2NwMS4KK2NjcDI6LWNjcDMuCitjY3AyLgorY2NwMzotY2NwNC4KK2NjcDMuCitjY3A0Oi1jY3A1LgorY2NwNC4KK2NjcDU6LWNjcDYuCitjY3A1LgorY2NwNjotY2NwNy4KK2NjcDYuCitjY3A3Oi1jY3A4LgorY2NwNy4KK2NjcDg6LWNjcDkuCitjY3A4LgorY2NwOTotY2NwMTAuCitjY3A5LgorY2NwMTA6LWNjcDExLgorY2NwMTAuCitjY3AxMTotY2NwMTIuCitjY3AxMS4KK2NjcDEyOi1jY3AxMy4KK2NjcDEyLgorY2NwMTM6LWNjcDE0LgorY2NwMTMuCitjY3AxNDotY2NwMTUuCitjY3AxNC4KK2NjcDE1Oi1jY3AxNi4KK2NjcDE1LgorY2NwMTY6LWNjcDE3LgorY2NwMTYuCitjY3AxNzotY2NwMTguCitjY3AxNy4KK2NjcDE4Oi1jY3AxOS4KK2NjcDE4LgorY2NwMTk6LWNjcDIwLgorY2NwMTkuCisKK2NjcDIwLgorY2NwMjAuCisKKworLyogIGRlZXAgYmFja3RyYWNraW5nICovCisvKiAgVGhlIGNhbGwgdG8gcGQgY3JlYXRlcyBhIGNob2ljZSBwb2ludCwgYW5kIGludm9rZXMgYSAgICAgICovCisvKiAgY2FsbCB0byBxLiBJdCB3aWxsIGZhaWwgYW5kIHRoZXJlIHdpbGwgYmUgYSBiYWNrdHJhY2tpbmcgICovCisvKiAgc3RlcCAgdG8gdHJ5IHRoZSBuZXh0IGNsYXVzZSBkZWZpbmluZyBwZC4gcGQgaGFzIDIxICAgICAgICovCisvKiAgY2xhdXNlcyx0aHVzIGZhaWx1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb2NjdXJzIDIwIHRpbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3BkKFgxLFgyLF8pIDotIHEoWDEsWDIsYSkuCitwZChYMSxYMixfKSA6LSBxKFgxLFgyLGEpLgorcGQoWDEsWDIsXykgOi0gcShYMSxYMixhKS4KK3BkKFgxLFgyLF8pIDotIHEoWDEsWDIsYSkuCitwZChYMSxYMixfKSA6LSBxKFgxLFgyLGEpLgorcGQoWDEsWDIsXykgOi0gcShYMSxYMixhKS4KK3BkKFgxLFgyLF8pIDotIHEoWDEsWDIsYSkuCitwZChYMSxYMixfKSA6LSBxKFgxLFgyLGEpLgorcGQoWDEsWDIsXykgOi0gcShYMSxYMixhKS4KK3BkKFgxLFgyLF8pIDotIHEoWDEsWDIsYSkuCitwZChYMSxYMixfKSA6LSBxKFgxLFgyLGEpLgorcGQoWDEsWDIsXykgOi0gcShYMSxYMixhKS4KK3BkKFgxLFgyLF8pIDotIHEoWDEsWDIsYSkuCitwZChYMSxYMixfKSA6LSBxKFgxLFgyLGEpLgorcGQoWDEsWDIsXykgOi0gcShYMSxYMixhKS4KK3BkKFgxLFgyLF8pIDotIHEoWDEsWDIsYSkuCitwZChYMSxYMixfKSA6LSBxKFgxLFgyLGEpLgorcGQoWDEsWDIsXykgOi0gcShYMSxYMixhKS4KK3BkKFgxLFgyLF8pIDotIHEoWDEsWDIsYSkuCitwZChYMSxYMixfKSA6LSBxKFgxLFgyLGEpLgorcGQoWDEsWDIsXykuCisKK3EoWDEsWDIsYikuCisKKworLyogICBzaGFsbG93IGJhY2t0cmFja2luZyAqLworLyogICBUaGUgcHMgcHJlZGljYXRlIGZhaWxzIDIwIHRpbWVzLiBUaGUgc2hhbGxvdyBiYWNrdHJhY2tpbmcgICAqLworLyogICB3aWxsIG5vdCByZXN0b3JlIGFsbCBjdXJyZW50IHN0YXRlIHJlZ2lzdGVycyBpbiBQcm9sb2cgICAgICAqLworLyogICBzeXN0ZW1zIHdoaWNoIHBlcmZvcm0gdGhpcyBvcHRpbWlzYXRpb24sIHdoaWxlIG90aGVycyB3aWxsLiAqLworCitwcyhfLFgsWCkuCitwcyhfLFgsWCkuCitwcyhfLFgsWCkuCitwcyhfLFgsWCkuCitwcyhfLFgsWCkuCitwcyhfLFgsWCkuCitwcyhfLFgsWCkuCitwcyhfLFgsWCkuCitwcyhfLFgsWCkuCitwcyhfLFgsWCkuCitwcyhfLFgsWCkuCitwcyhfLFgsWCkuCitwcyhfLFgsWCkuCitwcyhfLFgsWCkuCitwcyhfLFgsWCkuCitwcyhfLFgsWCkuCitwcyhfLFgsWCkuCitwcyhfLFgsWCkuCitwcyhfLFgsWCkuCitwcyhfLFgsWCkuCitwcyhfLF8sXykuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2VjcmMvYmVuY2hfMV8zLmluIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzFfMy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTM1NWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzFfMy5pbgpAQCAtMCwwICsxLDIgQEAKKzotIGVudmlyKDEwMDAwMDApLgorOi0gZW52aXIwYXIoMTAwMDAwMCkuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2VjcmMvYmVuY2hfMV8zLnBsIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzFfMy5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTJkYzY5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzFfMy5wbApAQCAtMCwwICsxLDg1IEBACisvKiBDSEFOR0VMT0cgYnkgTS5CYW5iYXJhCisgIC0gcHJpbnRfdGltZXMvNCAtLT4gcHJpbnRfdGltZXMvNQorICAtIHJlcG9ydF9jc3YvMiBpcyBhZGRlZC4KKyovCisKKy8qIGVudmlyKE4pOiAzIGFyZ3VtZW50cyBlbnZpcm9ubWVudCBjcmVhdGlvbiAqLworLyogICAgICAgICBjcmVhdGVzIDc5IGVudmlyb25tZW50cyBhbmQgMTU4IGNhbGxzICAgICAqLworLyogc3VnZ2VzdGVkIHZhbHVlIGZvciBOOiAxMDAwIChpbnRlcnApLCAxMDAwIChjb21wKSAqLworLyogcmVzdWx0cyBmb3IgQ3Byb2xvZzogTj0xMDAwICAgICAgICAgICAqLworLyogVGxvb3A9MzguNiBUY29tcD0wLjk3IFRuZXQ9MzcuNiBLbGlwcz00LjIzICovCisKK2VudmlyKE4pOi1zdGF0aXN0aWNzKHJ1bnRpbWUsW1QxfF9dKSwKKyAgICAgICAgY3JlX2VudihOKSwgc3RhdGlzdGljcyhydW50aW1lLFtUMnxfXSksCisgICAgICAgIGNvbXBlbnNfbG9vcChOKSwgc3RhdGlzdGljcyhydW50aW1lLFtUM3xfXSksCisgICAgICAgIHByaW50X3RpbWVzKGVudmlyKE4pLFQxLFQyLFQzLE4sMTU5KS4KKworY3JlX2VudigwKS4KK2NyZV9lbnYoTik6LU0gaXMgTi0xLCBlbnYwKFgsWSxaKSwgY3JlX2VudihNKS4KKworY29tcGVuc19sb29wKDApLgorY29tcGVuc19sb29wKE4pOi1NIGlzIE4tMSxjb21wZW5zX2xvb3AoTSkuCisKK2VudjAoWCxZLFopOi1lbnYxKFosWCxZKSxlbnYyKFksWixYKS4gLyogY3JlYXRlcyA3OSBlbnZpcm9ubWVudHMgKi8KK2VudjEoWCxZLFopOi1lbnYzKFosWSxYKSxlbnY0KFksWixYKS4KK2VudjIoWCxZLFopOi1lbnYzKFosWSxYKSxlbnY0KFksWixYKS4gIC8qIGFuZCAxNTggY2FsbHMgKi8KK2VudjMoWCxZLFopOi1lbnY1KFosWSxYKSxlbnY2KFksWixYKS4KK2VudjQoWCxZLFopOi1lbnY1KFosWSxYKSxlbnY2KFksWixYKS4KK2VudjUoWCxZLFopOi1lbnY3KFosWSxYKSxlbnY4KFksWixYKS4KK2VudjYoWCxZLFopOi1lbnY3KFosWSxYKSxlbnY4KFksWixYKS4KK2VudjcoWCxZLFopOi1lbnY5KFosWSxYKSxlbnYxMChZLFosWCkuCitlbnY4KFgsWSxaKTotZW52OShaLFksWCksZW52MTAoWSxaLFgpLgorZW52OShYLFksWik6LWVudjExKFosWSxYKSxlbnYxMihZLFosWCkuCitlbnYxMChYLFksWik6LWVudjEyKFosWSxYKSxlbnYxMihZLFosWCkuCitlbnYxMShYLFksWik6LWVudjEyKFosWSxYKSxlbnYxMihZLFosWCkuCitlbnYxMihYLFksWikuCisKKworLyogZW52aXIwYXIoTik6IHplcm8gYXJndW1lbnQgZW52aXJvbm1lbnQgY3JlYXRpb24gKi8KKy8qICAgICAgIGNyZWF0ZXMgNzkgZW52aXJvbm1lbnRzIGFuZCAxNTggY2FsbHMgICAgICovCisvKiBzdWdnZXN0ZWQgdmFsdWUgZm9yIE46IDEwMDAgKGludGVycCksIDEwMDAgKGNvbXApICovCisvKiByZXN1bHRzIGZvciBDcHJvbG9nOiBOPTEwMDAgICAgICAgICAgICovCisvKiBUbG9vcD0xOC44OCBUY29tcD0xLjAxIFRuZXQ9MTcuODcgS2xpcHM9OC45ICovCisKK2VudmlyMGFyKE4pOi1zdGF0aXN0aWNzKHJ1bnRpbWUsW1QxfF9dKSwKKyAgICAgICAgY3JlX2VudjBhcihOKSwgc3RhdGlzdGljcyhydW50aW1lLFtUMnxfXSksCisgICAgICAgIGNvbXBlbnNfbG9vcChOKSwgc3RhdGlzdGljcyhydW50aW1lLFtUM3xfXSksCisgICAgICAgIHByaW50X3RpbWVzKGVudmlyMGFyKE4pLFQxLFQyLFQzLE4sMTU5KS4KKworY3JlX2VudjBhcigwKS4KK2NyZV9lbnYwYXIoTik6LU0gaXMgTi0xLCBlbnYwLCBjcmVfZW52KE0pLgorCisKK2VudjA6LWVudjEsZW52Mi4gLyogY3JlYXRlcyA3OSBlbnZpcm9ubWVudHMgKi8KK2VudjE6LWVudjMsZW52NC4KK2VudjI6LWVudjMsZW52NC4gIC8qIGFuZCAxNTggY2FsbHMgKi8KK2VudjM6LWVudjUsZW52Ni4KK2VudjQ6LWVudjUsZW52Ni4KK2VudjU6LWVudjcsZW52OC4KK2VudjY6LWVudjcsZW52OC4KK2Vudjc6LWVudjksZW52MTAuCitlbnY4Oi1lbnY5LGVudjEwLgorZW52OTotZW52MTEsZW52MTIuCitlbnYxMDotZW52MTIsZW52MTIuCitlbnYxMTotZW52MTIsZW52MTIuCitlbnYxMi4KKworcHJpbnRfdGltZXMoTmFtZSxUMSxUMixUMyxYLEkpIDotICAgICAgICAvKiBwcmludHMgdGhlIHJlc3VsdHMgKi8KKyAgICAgICAgVFQxIGlzIFQyIC0gVDEsCisgICAgICAgIFRUMiBpcyBUMyAtIFQyLAorICAgICAgICBUVCBpcyBUVDEgLSBUVDIsCisgICAgICAgIHdyaXRlKCcjIE5hbWU6ICAgICAgICAgICAgICcpLHdyaXRlKE5hbWUpLCBubCwKKyAgICAgICAgd3JpdGUoJyMgVCBvdmVyYWxsIGxvb3A6ICAgJyksd3JpdGUoVFQxKSwgd3JpdGUoJyBtc2VjLicpLG5sLAorICAgICAgICB3cml0ZSgnIyBUIGNvbXBlbnMgbG9vcDogICAnKSx3cml0ZShUVDIpLCB3cml0ZSgnIG1zZWMuJyksbmwsCisgICAgICAgIHdyaXRlKCcjIFQgbmV0OiAgICAgICAgICAgICcpLHdyaXRlKFRUKSx3cml0ZSgnIG1zZWMuJyksbmwsCisgICAgICAgIHdyaXRlKCcjIEtMaXBzOiAgICAgICAgICAgICcpLAorICAgICAgICBMaSBpcyBJICogWCwKKyAgICAgICAgTGlwcyBpcyBMaSAvIFRULAorICAgICAgICBLTGlwcyBpcyBMaXBzIC8gMTAwMCwKKyAgICAgICAgd3JpdGUoS0xpcHMpLG5sLAorCXJlcG9ydF9jc3YoWycjIyNDU1YjIyMnLE5hbWUsVFQxLFRUMixUVCxLTGlwc10sICcsJyksCisJbmwuCisKK3JlcG9ydF9jc3YoW10sIF8pIDotICEuCityZXBvcnRfY3N2KFtYXSwgXykgOi0gISwgd3JpdGUoWCksIG5sLgorcmVwb3J0X2NzdihbWHxYc10sIERlbGltKSA6LSB3cml0ZShYKSwgd3JpdGUoRGVsaW0pLCByZXBvcnRfY3N2KFhzLCBEZWxpbSkuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2VjcmMvYmVuY2hfMV80LmluIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzFfNC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDEwM2EyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzFfNC5pbgpAQCAtMCwwICsxIEBACis6LSBteV9pbmRleCgxMDAwMCkuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2VjcmMvYmVuY2hfMV80LnBsIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzFfNC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGFlMmU2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzFfNC5wbApAQCAtMCwwICsxLDg4IEBACisvKiBDSEFOR0VMT0cgYnkgTS5CYW5iYXJhCisgIC0gcHJpbnRfdGltZXMvNCAtLT4gcHJpbnRfdGltZXMvNQorICAtIHJlcG9ydF9jc3YvMiBpcyBhZGRlZC4KKyAgLSByZW5hbWUgaW5kZXgvMSAgLS0+IG15X2luZGV4LzEKKyovCisKKy8qIFRoaXMgcHJvZ3JhbSBpcyBjYWxsZWQgd2l0aCAiaW5kZXgoTikiICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBJdCB0ZXN0cyB0aGUgZWZmaWNpZW5jeSBvZiBzaW1wbGUgaW5kZXhpbmcgb24gdGhlIDFzdCBhcmd1bWVudCAqLworLyogc3VnZ2VzdGVkIHZhbHVlIGZvciBOOiA1MDAgKGludGVycCksIDIwMDAoY29tcCkgKi8KKy8qIHJlc3VsdHMgZm9yIENwcm9sb2c6IE49NTAwICAqLworLyogVGxvb3A9OC45OCBUY29tcD0wLjUyIFRuZXQ9OC40NyBLbGlwcz0xLjI0ICAqLworCitteV9pbmRleChOKQorICAgICA6LSBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QxfF9dKSwKKyAgICAgICAgaW5kZXhfbG9vcChOKSwgc3RhdGlzdGljcyhydW50aW1lLFtUMnxfXSksCisgICAgICAgIGNvbXBlbnNfbG9vcChOKSwgc3RhdGlzdGljcyhydW50aW1lLFtUM3xfXSksCisgICAgICAgIHByaW50X3RpbWVzKGluZGV4KE4pLFQxLFQyLFQzLE4sMjEpLgorCisvKiBsb29wIHdpdGggY2FsbHMgdG8gdGhlIGFjdHVhbCBiZW5jaG1hcmsgcHJvZ3JhbSBmb3IgaW5kZXhpbmcgKi8KK2luZGV4X2xvb3AoMCkuCitpbmRleF9sb29wKFgpIDotIHAoYSksIHAoW2FdKSwgcChzKGEpKSwgLyogcXVlcmllcyB0byB0aGUgYWN0dWFsICovCisgICAgICAgICAgICAgICAgIHAoYiksIHAoW2JdKSwgcCh0KGIpKSwgLyogYmVuY2htYXJrIHByb2dyYW0gICAgICovCisgICAgICAgICAgICAgICAgIHAoYyksIHAoW2NdKSwgcCh1KGMpKSwKKyAgICAgICAgICAgICAgICAgcChkKSwgcChbZF0pLCBwKHYoZCkpLAorICAgICAgICAgICAgICAgICBwKGUpLCBwKFtlXSksIHAodyhlKSksCisgICAgICAgICAgICAgICAgIHAoZiksIHAoW2ZdKSwgcCh4KGYpKSwKKyAgICAgICAgICAgICAgICAgcChnKSwgcChbZ10pLCBwKHkoZykpLAorICAgICAgICAgICAgICAgICBZIGlzIFggLSAxLCBpbmRleF9sb29wKFkpLgorCisvKiBjb21wZW5zYXRpb24gbG9vcCAqLworY29tcGVuc19sb29wKDApLgorY29tcGVuc19sb29wKFgpIDotIFkgaXMgWCAtIDEsIGNvbXBlbnNfbG9vcChZKS4KKworLyogdGVzdCBwcm9ncmFtIHdoaWNoIGNhbiBiZSBvcHRpbWlzZWQgYnkgaW5kZXhpbmcgKi8KK3AoYSkuCitwKFthXSkuCitwKHMoYSkpLgorcChiKS4KK3AoW2JdKS4KK3AodChiKSkuCitwKGMpLgorcChbY10pLgorcCh1KGMpKS4KK3AoZCkuCitwKFtkXSkuCitwKHYoZCkpLgorcChlKS4KK3AoW2VdKS4KK3AodyhlKSkuCitwKGYpLgorcChbZl0pLgorcCh4KGYpKS4KK3AoZykuCitwKFtnXSkuCitwKHkoZykpLgorCislcHJpbnRfdGltZXMoVDEsVDIsVDMsWCxJKSA6LSAgICAgICAgLyogcHJpbnRzIHRoZSByZXN1bHRzICovCislICAgICAgICBUVDEgaXMgVDIgLSBUMSwKKyUgICAgICAgIFRUMiBpcyBUMyAtIFQyLAorJSAgICAgICAgVFQgaXMgVFQxIC0gVFQyLAorJSAgICAgICAgd3JpdGUoJ1QgZmlyc3QgbG9vcDogICAgICcpLHdyaXRlKFRUMSksIG5sLAorJSAgICAgICAgd3JpdGUoJ1QgY29tcGVucyBsb29wOiAgICcpLHdyaXRlKFRUMiksIG5sLAorJSAgICAgICAgd3JpdGUoJ1QgbmV0OiAgICAgICAgICAgICcpLHdyaXRlKFRUKSxubCwKKyUgICAgICAgIHdyaXRlKCdLTGlwczogICAgICAgICAgICAnKSwKKyUgICAgICAgIExpIGlzIEkgKiBYLAorJSAgICAgICAgTGlwcyBpcyBMaSAvIFRULAorJSAgICAgICAgS0xpcHMgaXMgTGlwcyAvIDEwMDAsCislICAgICAgICB3cml0ZShLTGlwcyksbmwsbmwuCisKK3ByaW50X3RpbWVzKE5hbWUsVDEsVDIsVDMsWCxJKSA6LSAgICAgICAgLyogcHJpbnRzIHRoZSByZXN1bHRzICovCisgICAgICAgIFRUMSBpcyBUMiAtIFQxLAorICAgICAgICBUVDIgaXMgVDMgLSBUMiwKKyAgICAgICAgVFQgaXMgVFQxIC0gVFQyLAorICAgICAgICB3cml0ZSgnIyBOYW1lOiAgICAgICAgICAgICAnKSx3cml0ZShOYW1lKSwgbmwsCisgICAgICAgIHdyaXRlKCcjIFQgZmlyc3QgbG9vcDogICAgICcpLHdyaXRlKFRUMSksIHdyaXRlKCcgbXNlYy4nKSxubCwKKyAgICAgICAgd3JpdGUoJyMgVCBjb21wZW5zIGxvb3A6ICAgJyksd3JpdGUoVFQyKSwgd3JpdGUoJyBtc2VjLicpLG5sLAorICAgICAgICB3cml0ZSgnIyBUIG5ldDogICAgICAgICAgICAnKSx3cml0ZShUVCksd3JpdGUoJyBtc2VjLicpLG5sLAorICAgICAgICB3cml0ZSgnIyBLTGlwczogICAgICAgICAgICAnKSwKKyAgICAgICAgTGkgaXMgSSAqIFgsCisgICAgICAgIExpcHMgaXMgTGkgLyBUVCwKKyAgICAgICAgS0xpcHMgaXMgTGlwcyAvIDEwMDAsCisgICAgICAgIHdyaXRlKEtMaXBzKSxubCwKKwlyZXBvcnRfY3N2KFsnIyMjQ1NWIyMjJyxOYW1lLFRUMSxUVDIsVFQsS0xpcHNdLCAnLCcpLAorCW5sLgorCityZXBvcnRfY3N2KFtdLCBfKSA6LSAhLgorcmVwb3J0X2NzdihbWF0sIF8pIDotICEsIHdyaXRlKFgpLCBubC4KK3JlcG9ydF9jc3YoW1h8WHNdLCBEZWxpbSkgOi0gd3JpdGUoWCksIHdyaXRlKERlbGltKSwgcmVwb3J0X2NzdihYcywgRGVsaW0pLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzFfNS5pbiBiL2V4YW1wbGVzL2JlbmNobWFya3MvZWNyYy9iZW5jaF8xXzUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UyYzc4YQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvZWNyYy9iZW5jaF8xXzUuaW4KQEAgLTAsMCArMSw1IEBACis6LSBjb25zdHJ1Y3RfbGlzdCgxMDAwMDApLgorOi0gbWF0Y2hfbGlzdCgxMDAwMDApLgorOi0gY29uc3RydWN0X3N0cnVjdHVyZSgxMDAwMDApLgorOi0gbWF0Y2hfc3RydWN0dXJlKDEwMDAwMCkuCis6LSBtYXRjaF9uZXN0ZWRfc3RydWN0dXJlKDEwMDAwMCkuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2VjcmMvYmVuY2hfMV81LnBsIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzFfNS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGViZDlkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzFfNS5wbApAQCAtMCwwICsxLDQ1NiBAQAorLyogQ0hBTkdFTE9HIGJ5IE0uQmFuYmFyYQorICAtIHByaW50X3RpbWVzLzQgLS0+IHByaW50X3RpbWVzLzUKKyAgLSByZXBvcnRfY3N2LzIgaXMgYWRkZWQuCisqLworCisvKiBUaGUgcHJlZGljYXRlcyBhcmUgY2FsbGVkIHdpdGg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIGJlbmNobWFya19uYW1lKFgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogd2hlcmUgYmVuY2htYXJrX25hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByZWRpY2F0ZSAgICAgICAgICovCisvKiAgICAgICAgYW5kIFggaXMgdGhlIG51bWJlciBvZiAoZXh0ZXJuYWwpIGxvb3AgaXRlcmF0aW9ucyAgKi8KKy8qIFRoZSBiZW5jaG1hcmtzIG9uIHRoaXMgZmlsZSBhcmU6ICAgY29uc3RydWN0X2xpc3QgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9saXN0ICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdF9zdHJ1Y3R1cmUgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfc3RydWN0dXJlICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9uZXN0ZWRfc3RydWN0dXJlICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYWxfdW5pZmljYXRpb24gICAgKi8KKworLyogIFRlc3Qgb2YgbGlzdCBjb25zdHJ1Y3Rpb24gdmlhIHVuaWZpY2F0aW9uICovCisvKiBzdWdnZXN0ZWQgdmFsdWUgZm9yIE46IDEwMCAoaW50ZXJwKSwgNTAwKGNvbXApICovCisvKiByZXN1bHRzIGZvciBDcHJvbG9nOiBOPTEwMCAgKi8KKy8qIFRsb29wPTIuNDkgVGNvbXA9MC4wOCBUbmV0PTIuNDEgS2xpcHM9NC4yICAqLworY29uc3RydWN0X2xpc3QoWCkgICAgICAgICAgICAgLyogdXNlcyB1bmlmaWNhdGlvbiB0byAqLworICAgICA6LSBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QxfF9dKSwgICAgICAgIC8qIGNvbnN0cnVjdCBhIGxpc3Qgb2YgMTAwIGVsdHMgKi8KKyAgICAgICAgZG9fY29uc3RydWN0X2xpc3QoWCksCisgICAgICAgIHN0YXRpc3RpY3MocnVudGltZSxbVDJ8X10pLAorICAgICAgICBjb21wZW5zX2xvb3AoWCksCisgICAgICAgIHN0YXRpc3RpY3MocnVudGltZSxbVDN8X10pLAorICAgICAgICBwcmludF90aW1lcyhjb25zdHJ1Y3RfbGlzdChYKSxUMSxUMixUMyxYLDEwMCkuCisKKworLyogIFRlc3Qgb2YgbGlzdCBtYXRjaGluZyB1bmlmaWNhdGlvbiAqLworLyogc3VnZ2VzdGVkIHZhbHVlIGZvciBOOiAxMDAgKGludGVycCksIDEwMDAoY29tcCkgKi8KKy8qIHJlc3VsdHMgZm9yIENwcm9sb2c6IE49MTAwICAqLworLyogVGxvb3A9NC41NiBUY29tcD0wLjEgVG5ldD00LjQ2IEtsaXBzPTIuMiAgKi8KK21hdGNoX2xpc3QoWCkKKyAgICAgOi0gbGlzdDEwMChaKSwgLyogY29uc3RydWN0aW9uIG9mIHRoZSBtYXRjaGluZyBsaXN0IGlzIGRvbmUgICovCisgICAgICAgIHN0YXRpc3RpY3MocnVudGltZSxbVDF8X10pLCAgICAgIC8qIG91dHNpZGUgb2YgdGhlIGxvb3AsICAgICAqLworICAgICAgICBkb19tYXRjaF9saXN0KFgsWiksIC8qIGluIG9yZGVyIG5vdCB0byBjb3VuICAgICAqLworICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QyfF9dKSwgICAgICAvKiBjb25zdHJ1Y3Rpb24gb2YgdGhlIGxpc3QgKi8KKyAgICAgICAgY29tcGVuc19sb29wKFgpLAorICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QzfF9dKSwKKyAgICAgICAgcHJpbnRfdGltZXMobWF0Y2hfbGlzdChYKSxUMSxUMixUMyxYLDEwMCkuCisKKworLyogIFRlc3Qgb2Ygc3RydWN0dXJlIGNvbnN0cnVjdGlvbiB2aWEgdW5pZmljYXRpb24gICAgICAqLworCisvKiB0aGlzIHByb2dyYW0gaXMgZXF1aXZhbGVudCB0byBjb25zdHJ1Y3RfbGlzdCwgZXhjZXB0ICovCisvKiB0aGF0IGl0IHVzZXMgdGhlIHN0YW5kYXJkIHN0cnVjdHVyZSByZXByZXNlbnRhdGlvbiAgICovCisvKmluc3RlYWQgb2YgdGhlIHNpbXBsaWZpZWQgbGlzdCBub3RhdGlvbiAgICAgICAgICAgICAgICovCisvKiBzdWdnZXN0ZWQgdmFsdWUgZm9yIE46IDEwMCAoaW50ZXJwKSwgNTAwKGNvbXApICAgICAgICovCisvKiByZXN1bHRzIGZvciBDcHJvbG9nOiBOPTEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUbG9vcD0yLjU2IFRjb21wPTAuMDggVG5ldD0yLjQ4IEtsaXBzPTQgICAgICAgICAgICAgICovCitjb25zdHJ1Y3Rfc3RydWN0dXJlKFgpCisgICAgIDotIHN0YXRpc3RpY3MocnVudGltZSxbVDF8X10pLAorICAgICAgICBkb19jb25zdHJ1Y3Rfc3RydWN0dXJlKFgpLAorICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QyfF9dKSwKKyAgICAgICAgY29tcGVuc19sb29wKFgpLAorICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QzfF9dKSwKKyAgICAgICAgcHJpbnRfdGltZXMoY29uc3RydWN0X3N0cnVjdHVyZShYKSxUMSxUMixUMyxYLDEwMCkuCisKKworLyogIFRlc3Qgb2Ygc3RydWN0dXJlIG1hdGNoaW5nIHZpYSB1bmlmaWNhdGlvbiAgICAqLworCisvKiB0aGlzIHByZWRpY2F0ZSBtYXRjaGVzIGEgbGlzdCBvZiAxMDAgZWxlbWVudHMgICovCisvKiBpbiBzdHJ1Y3R1cmUgbm90YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBzdWdnZXN0ZWQgdmFsdWUgZm9yIE46IDEwMCAoaW50ZXJwKSwgMTAwKGNvbXApICovCisvKiByZXN1bHRzIGZvciBDcHJvbG9nOiBOPTEwMCAgICAgICAgICAgICAgICAgICAgICovCisvKiBUbG9vcD00LjY2IFRjb21wPTAuMSBUbmV0PTQuNTYgS2xpcHM9Mi4yICAgICAgICovCittYXRjaF9zdHJ1Y3R1cmUoWCkKKyAgICAgOi0gc3RydWN0dXJlMTAwKFopLAorICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QxfF9dKSwKKyAgICAgICAgZG9fbWF0Y2hfc3RydWN0dXJlKFgsWiksCisgICAgICAgIHN0YXRpc3RpY3MocnVudGltZSxbVDJ8X10pLAorICAgICAgICBjb21wZW5zX2xvb3AoWCksCisgICAgICAgIHN0YXRpc3RpY3MocnVudGltZSxbVDN8X10pLAorICAgICAgICBwcmludF90aW1lcyhtYXRjaF9zdHJ1Y3R1cmUoWCksVDEsVDIsVDMsWCwxMDApLgorCisvKiAgVGVzdCB0byBtYXRjaCBhIG5lc3RlZCBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAqLworCisvKiB0aGlzIHByZWRpY2F0ZSB0ZXN0cyB0aGUgKGNvbXBpbGVkKSB1bmlmaWNhdGlvbiAqLworLyogb2YgYSBjb21wbGV4IHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHN1Z2dlc3RlZCB2YWx1ZSBmb3IgTjogMjAwIChpbnRlcnApLCAyMDAoY29tcCkgICovCisvKiByZXN1bHRzIGZvciBDcHJvbG9nOiBOPTIwMCAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGxvb3A9MS4zNCBUY29tcD0wLjE3IFRuZXQ9MS4xOCBLbGlwcz0wLjE3ICAgICAgKi8KK21hdGNoX25lc3RlZF9zdHJ1Y3R1cmUoWCkKKyAgICAgOi0gbmVzdGVkX3N0cnVjdHVyZTEoWiksIC8qIHRoZSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggaXMgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25zdHJ1Y3RlZCBvdXRzaWRlIHRoZSBsb29wLCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gb3JkZXIgdG8gbWVhc3VyZSAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9ubHkgdGhlIG1hdGNoaW5nIHRpbWUgICAgICAgICovCisgICAgICAgIHN0YXRpc3RpY3MocnVudGltZSxbVDF8X10pLAorICAgICAgICBkb19tYXRjaF9uZXN0ZWRfc3RydWN0dXJlKFgsWiksCisgICAgICAgIHN0YXRpc3RpY3MocnVudGltZSxbVDJ8X10pLAorICAgICAgICBjb21wZW5zX2xvb3AoWCksCisgICAgICAgIHN0YXRpc3RpY3MocnVudGltZSxbVDN8X10pLAorICAgICAgICBwcmludF90aW1lcyhtYXRjaF9uZXN0ZWRfc3RydWN0dXJlKFgpLFQxLFQyLFQzLFgsMSkuCisKKworLyogICAgIFRlc3Qgb2YgZ2VuZXJhbCB1bmlmaWNhdGlvbiBvZiAyIGNvbXBsZXggc3RydWN0dXJlcyAgICAgKi8KKworLyogVGhpcyBwcmVkaWNhdGUgdGVzdHMgZ2VuZXJhbCB1bmlmaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgKi8KKy8qIFdlIGNhbGwgaXQgZ2VuZXJhbCB1bmlmaWNhdGlvbiwgYmVjYXVzZSBpdCBjYW5ub3QgICAgICAgICAgICovCisvKiBiZSBhbmFseXNlZCBhdCBjb21waWxlIHRpbWUuIFRoZXJlZm9yZSB0aGlzIGtpbmQgb2YgICAgICAgICAqLworLyogdW5pZmljYXRpb24gY2Fubm90IGJlIGNvbXBpbGVkIGFuZCwgZXZlbiBpbiAgICAgICAgICAgICAgICAgKi8KKy8qIGEgY29tcGlsZWQgc3lzdGVtLCBpdCBtdXN0IGJlIGhhbmRsZWQgYXQgICAgICAgICAgICAgICAgICAgICovCisvKiBydW4gdGltZSwgZXhhY3RseSBhcyBieSBhbiBpbnRlcnByZXRlci4gICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBpcyBkb25lIGJ5IGEgZ2VuZXJhbCBwcm9jZWR1cmUgZm9yIHVuaWZpY2F0aW9uLiAgICAgICAgKi8KKy8qIFRoZSBuYW1lIG9mIHRoZSBiZW5jaG1hcmsgdGhlcmVmb3JlIGRvZXMgbm90ICAgICAgICAgICAgICAgICovCisvKiByZWZsZWN0IHRoYXQgdGhlIHVuaWZpY2F0aW9uIGlzIGdlbmVyYWwsIGkuZS4gaW5jbHVkaW5nICAgICAqLworLyogYWxsIFByb2xvZyB0eXBlcyAoZS5nLiBpdCBkb2VzIG5vdCBjb250YWluIHZhcmlhYmxlcyksICAgICAgKi8KKy8qIGJ1dCBpdCByZWZsZWN0cyB0aGUgdXNlIG9mIHRoZSBwcm9jZWR1cmUgZm9yIGdlbmVyYWwgICAgICAgICovCisvKiB1bmlmaWNhdGlvbiBhcyBvcHBvc2VkIHRvIHNwZWNpZmljLCBjb21waWxlZCB1bmlmaWNhdGlvbi4gICAqLworCisKKy8qIHN1Z2dlc3RlZCB2YWx1ZSBmb3IgTjogMjAwIChpbnRlcnApLCA1MDAoY29tcCkgKi8KKy8qIHJlc3VsdHMgZm9yIENwcm9sb2c6IE49MjAwICAqLworLyogVGxvb3A9MS4zOCBUY29tcD0wLjE4IFRuZXQ9MS4yMCBLbGlwcz0wLjE3ICAqLworZ2VuZXJhbF91bmlmaWNhdGlvbihYKSA6LQorCisgICAgICAgIG5lc3RlZF9zdHJ1Y3R1cmUxKEEpLAorICAgICAgICBuZXN0ZWRfc3RydWN0dXJlMihCKSwKKyAgICAgICAgc3RhdGlzdGljcyhydW50aW1lLFtUMXxfXSksCisgICAgICAgIGRvX2dlbmVyYWxfdW5pZmljYXRpb24oWCxBLEIpLAorICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QyfF9dKSwKKyAgICAgICAgY29tcGVuc19sb29wKFgpLAorICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QzfF9dKSwKKyAgICAgICAgcHJpbnRfdGltZXMoZ2VuZXJhbF91bmlmaWNhdGlvbihYKSxUMSxUMixUMyxYLDEpLgorCisvKiBwcmVkaWNhdGUgdG8gcHJpbnQgdGhlIHJlc3VsdHMgb2YgdGhlIGJlbmNobWFya2luZyAgICAqLworJXByaW50X3RpbWVzKFQxLFQyLFQzLFgsSSkgOi0KKyUgICAgICAgIFRUMSBpcyBUMiAtIFQxLAorJSAgICAgICAgVFQyIGlzIFQzIC0gVDIsCislICAgICAgICBUVCBpcyBUVDEgLSBUVDIsCislICAgICAgICB3cml0ZSgnVCBvdmVyYWxsIGxvb3A6ICcpLHdyaXRlKFRUMSksIG5sLAorJSAgICAgICAgd3JpdGUoJ1QgY29tcGVucyBsb29wOiAnKSx3cml0ZShUVDIpLCBubCwKKyUgICAgICAgIHdyaXRlKCdUIGJlbmNobWFyazogICAgJyksd3JpdGUoVFQpLG5sLAorJSAgICAgICAgd3JpdGUoJ0tMaXBzOiAgICAgICAgICAnKSwKKyUgICAgICAgIExpIGlzIEkgKiBYLAorJSAgICAgICAgTGlwcyBpcyBMaSAvIFRULAorJSAgICAgICAgS0xpcHMgaXMgTGlwcyAvIDEwMDAsCislICAgICAgICB3cml0ZShLTGlwcyksbmwsbmwuCisKK3ByaW50X3RpbWVzKE5hbWUsVDEsVDIsVDMsWCxJKSA6LSAgICAgICAgLyogcHJpbnRzIHRoZSByZXN1bHRzICovCisgICAgICAgIFRUMSBpcyBUMiAtIFQxLAorICAgICAgICBUVDIgaXMgVDMgLSBUMiwKKyAgICAgICAgVFQgaXMgVFQxIC0gVFQyLAorICAgICAgICB3cml0ZSgnIyBOYW1lOiAgICAgICAgICAgICAnKSx3cml0ZShOYW1lKSwgbmwsCisgICAgICAgIHdyaXRlKCcjIFQgb3ZlcmFsbCBsb29wOiAgICcpLHdyaXRlKFRUMSksIHdyaXRlKCcgbXNlYy4nKSxubCwKKyAgICAgICAgd3JpdGUoJyMgVCBjb21wZW5zIGxvb3A6ICAgJyksd3JpdGUoVFQyKSwgd3JpdGUoJyBtc2VjLicpLG5sLAorICAgICAgICB3cml0ZSgnIyBUIGJlbmNobWFyazogICAgICAnKSx3cml0ZShUVCksd3JpdGUoJyBtc2VjLicpLG5sLAorICAgICAgICB3cml0ZSgnIyBLTGlwczogICAgICAgICAgICAnKSwKKyAgICAgICAgTGkgaXMgSSAqIFgsCisgICAgICAgIExpcHMgaXMgTGkgLyBUVCwKKyAgICAgICAgS0xpcHMgaXMgTGlwcyAvIDEwMDAsCisgICAgICAgIHdyaXRlKEtMaXBzKSxubCwKKwlyZXBvcnRfY3N2KFsnIyMjQ1NWIyMjJyxOYW1lLFRUMSxUVDIsVFQsS0xpcHNdLCAnLCcpLAorCW5sLgorCityZXBvcnRfY3N2KFtdLCBfKSA6LSAhLgorcmVwb3J0X2NzdihbWF0sIF8pIDotICEsIHdyaXRlKFgpLCBubC4KK3JlcG9ydF9jc3YoW1h8WHNdLCBEZWxpbSkgOi0gd3JpdGUoWCksIHdyaXRlKERlbGltKSwgcmVwb3J0X2NzdihYcywgRGVsaW0pLgorCisvKiBjb21wZW5zYXRpb24gbG9vcCwgdXNlZCB0byBtZWFzdXJlIHRoZSB0aW1lIHNwZW50IGluIHRoZSBsb29wICovCitjb21wZW5zX2xvb3AoMCkuCitjb21wZW5zX2xvb3AoWCkgOi0gWSBpcyBYIC0gMSwgY29tcGVuc19sb29wKFkpLgorCisvKiBsaXN0IGNvbnN0cnVjdGluZyBsb29wICovCitkb19jb25zdHJ1Y3RfbGlzdCgwKS4KK2RvX2NvbnN0cnVjdF9saXN0KFgpIDotIGNsMShaMSxaMixaMyksIFkgaXMgWCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBkb19jb25zdHJ1Y3RfbGlzdChZKS4KKworLyogbGlzdCBtYXRjaGluZyBsb29wICovCitkb19tYXRjaF9saXN0KDAsWikuCitkb19tYXRjaF9saXN0KFgsWikgOi0gY2wxKFosWixaKSwgWSBpcyBYIC0gMSwgZG9fbWF0Y2hfbGlzdChZLFopLgorCisvKiBzdHJ1Y3R1cmUgY29uc3RydWN0aW5nIGxvb3AgKi8KK2RvX2NvbnN0cnVjdF9zdHJ1Y3R1cmUoMCkuCitkb19jb25zdHJ1Y3Rfc3RydWN0dXJlKFgpIDotIGNzMShaMSxaMixaMyksIFkgaXMgWCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2NvbnN0cnVjdF9zdHJ1Y3R1cmUoWSkuCisKKy8qIHN0cnVjdHVyZSBtYXRjaGluZyBsb29wICovCitkb19tYXRjaF9zdHJ1Y3R1cmUoMCxaKS4KK2RvX21hdGNoX3N0cnVjdHVyZShYLFopIDotIGNzMShaLFosWiksIFkgaXMgWCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19tYXRjaF9zdHJ1Y3R1cmUoWSxaKS4KKworLyogbG9vcCB0byBtYXRjaCBhIG5lc3RlZCBzdHJ1Y3R1cmUgKi8KK2RvX21hdGNoX25lc3RlZF9zdHJ1Y3R1cmUoMCxaKS4KK2RvX21hdGNoX25lc3RlZF9zdHJ1Y3R1cmUoWCxaKSA6LQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkX3N0cnVjdHVyZTIoWiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZIGlzIFggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fbWF0Y2hfbmVzdGVkX3N0cnVjdHVyZShZLFopLgorCisvKiBsb29wIGZvciBnZW5lcmFsIHVuaWZpY2F0aW9uICovCitkb19nZW5lcmFsX3VuaWZpY2F0aW9uKDAsQSxCKS4KK2RvX2dlbmVyYWxfdW5pZmljYXRpb24oWCxBLEIpIDotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pZnkoQSxCKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZIGlzIFggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2dlbmVyYWxfdW5pZmljYXRpb24oWSxBLEIpLgorCisvKiBnZW5lcmFsIHVuaWZpY2F0aW9uICovCit1bmlmeShYLFgpLgorCisvKiBjb21wbGV4IHN0cnVjdHVyZSBhcyBleGFtcGxlIGZvciB1bmlmaWNhdGlvbiB0ZXN0cyAgICAgICovCisKKy8qIHRoZSBzYW1lIHN0cnVjdHVyZSBpcyBnaXZlbiB0d2ljZSwgaW4gb3JkZXIgdG8gbWFrZSAgICAgKi8KKy8qIHN1cmUgdGhhdCBldmVuIGltcGxlbWVudGF0aW9ucyB1c2luZyBzdHJ1Y3R1cmUgc2hhcmluZyAgKi8KKy8qIGV4ZWN1dGUgdGhlIHVuaWZpY2F0aW9uIGFuZCBkbyBub3QganVzdCBwYXNzIHBvaW50ZXJzICAgKi8KKworbmVzdGVkX3N0cnVjdHVyZTEoCitbYSggICAgW2ExKFsxLDIsM10sYSksYTIoWzQsNSw2XSxiKSxhMyhbNyw4LDldLGMpXSwKKyAgICAgICBbYTQoWzAsMSwyXSxkKSxhNShbMyw0LDVdLGUpLGE2KFs2LDcsOF0sZildLAorICAgICAgIFthNyhbOSwwLDFdLGcpLGE4KFsyLDMsNF0saCksYTkoWzUsNiw3XSxpKV0pLAorIGIoICAgIFtiMShbMSwyLDNdLGEpLGIyKFs0LDUsNl0sYiksYjMoWzcsOCw5XSxjKV0sCisgICAgICAgW2I0KFswLDEsMl0sZCksYjUoWzMsNCw1XSxlKSxiNihbNiw3LDhdLGYpXSwKKyAgICAgICBbYjcoWzksMCwxXSxnKSxiOChbMiwzLDRdLGgpLGI5KFs1LDYsN10saSldKSwKKyBjKCAgICBbYzEoWzEsMiwzXSxhKSxjMihbNCw1LDZdLGIpLGMzKFs3LDgsOV0sYyldLAorICAgICAgIFtjNChbMCwxLDJdLGQpLGM1KFszLDQsNV0sZSksYzYoWzYsNyw4XSxmKV0sCisgICAgICAgW2M3KFs5LDAsMV0sZyksYzgoWzIsMyw0XSxoKSxjOShbNSw2LDddLGkpXSldKS4KKworCituZXN0ZWRfc3RydWN0dXJlMigKK1thKCAgICBbYTEoWzEsMiwzXSxhKSxhMihbNCw1LDZdLGIpLGEzKFs3LDgsOV0sYyldLAorICAgICAgIFthNChbMCwxLDJdLGQpLGE1KFszLDQsNV0sZSksYTYoWzYsNyw4XSxmKV0sCisgICAgICAgW2E3KFs5LDAsMV0sZyksYTgoWzIsMyw0XSxoKSxhOShbNSw2LDddLGkpXSksCisgYiggICAgW2IxKFsxLDIsM10sYSksYjIoWzQsNSw2XSxiKSxiMyhbNyw4LDldLGMpXSwKKyAgICAgICBbYjQoWzAsMSwyXSxkKSxiNShbMyw0LDVdLGUpLGI2KFs2LDcsOF0sZildLAorICAgICAgIFtiNyhbOSwwLDFdLGcpLGI4KFsyLDMsNF0saCksYjkoWzUsNiw3XSxpKV0pLAorIGMoICAgIFtjMShbMSwyLDNdLGEpLGMyKFs0LDUsNl0sYiksYzMoWzcsOCw5XSxjKV0sCisgICAgICAgW2M0KFswLDEsMl0sZCksYzUoWzMsNCw1XSxlKSxjNihbNiw3LDhdLGYpXSwKKyAgICAgICBbYzcoWzksMCwxXSxnKSxjOChbMiwzLDRdLGgpLGM5KFs1LDYsN10saSldKV0pLgorCisvKiBsaXN0IG9mIDEwMCBlbGVtZW50cyB1c2VkIGZvciBtYXRjaF9saXN0ICovCitsaXN0MTAwKFthLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsCisgICAgICAgICAgIGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsCisgICAgICAgICAgIGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsCisgICAgICAgICAgIGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhXSkuCisKKy8qIHN0cnVjdHVyZSBvZiAxMDAgZWxlbWVudHMgdXNlZCBmb3IgbWF0Y2hfc3RydWN0dXJlICAgKi8KK3N0cnVjdHVyZTEwMChzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSwKKyAgICAgICAgICAgICBzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSwKKyAgICAgICAgICAgICBzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSwKKyAgICAgICAgICAgICBzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSwKKyAgICAgICAgICAgICBzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSwKKyAgICAgICAgICAgICBzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSwKKyAgICAgICAgICAgICBzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSwKKyAgICAgICAgICAgICBzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSwKKyAgICAgICAgICAgICBzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSwKKyAgICAgICAgICAgICBzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSwKKyAgICAgICAgICAgICBzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSxzdChhLHN0KGEsc3QoYSwKKyAgICAgICAgICAgICBzdChhLG5pbCkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKQorICAgICAgICAgICAgICkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkKKyAgICAgICAgICAgICApKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpLgorCisvKiBwcmVkaWNhdGVzIHRvIHRlc3QgdW5pZmljYXRpb24gb2YgbGlzdHMgKi8KK2NsMShbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2wyKFgsWSxaKS4KK2NsMihbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2wzKFgsWSxaKS4KK2NsMyhbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w0KFgsWSxaKS4KK2NsNChbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w1KFgsWSxaKS4KK2NsNShbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w2KFgsWSxaKS4KK2NsNihbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w3KFgsWSxaKS4KK2NsNyhbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w4KFgsWSxaKS4KK2NsOChbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w5KFgsWSxaKS4KK2NsOShbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2wxMChYLFksWikuCitjbDEwKFthfFhdLFthfFldLFthfFpdKSA6LSBjbDExKFgsWSxaKS4KK2NsMTEoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsMTIoWCxZLFopLgorY2wxMihbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2wxMyhYLFksWikuCitjbDEzKFthfFhdLFthfFldLFthfFpdKSA6LSBjbDE0KFgsWSxaKS4KK2NsMTQoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsMTUoWCxZLFopLgorY2wxNShbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2wxNihYLFksWikuCitjbDE2KFthfFhdLFthfFldLFthfFpdKSA6LSBjbDE3KFgsWSxaKS4KK2NsMTcoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsMTgoWCxZLFopLgorY2wxOChbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2wxOShYLFksWikuCitjbDE5KFthfFhdLFthfFldLFthfFpdKSA6LSBjbDIwKFgsWSxaKS4KK2NsMjAoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsMjEoWCxZLFopLgorY2wyMShbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2wyMihYLFksWikuCitjbDIyKFthfFhdLFthfFldLFthfFpdKSA6LSBjbDIzKFgsWSxaKS4KK2NsMjMoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsMjQoWCxZLFopLgorY2wyNChbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2wyNShYLFksWikuCitjbDI1KFthfFhdLFthfFldLFthfFpdKSA6LSBjbDI2KFgsWSxaKS4KK2NsMjYoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsMjcoWCxZLFopLgorY2wyNyhbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2wyOChYLFksWikuCitjbDI4KFthfFhdLFthfFldLFthfFpdKSA6LSBjbDI5KFgsWSxaKS4KK2NsMjkoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsMzAoWCxZLFopLgorY2wzMChbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2wzMShYLFksWikuCitjbDMxKFthfFhdLFthfFldLFthfFpdKSA6LSBjbDMyKFgsWSxaKS4KK2NsMzIoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsMzMoWCxZLFopLgorY2wzMyhbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2wzNChYLFksWikuCitjbDM0KFthfFhdLFthfFldLFthfFpdKSA6LSBjbDM1KFgsWSxaKS4KK2NsMzUoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsMzYoWCxZLFopLgorY2wzNihbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2wzNyhYLFksWikuCitjbDM3KFthfFhdLFthfFldLFthfFpdKSA6LSBjbDM4KFgsWSxaKS4KK2NsMzgoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsMzkoWCxZLFopLgorY2wzOShbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w0MChYLFksWikuCitjbDQwKFthfFhdLFthfFldLFthfFpdKSA6LSBjbDQxKFgsWSxaKS4KK2NsNDEoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsNDIoWCxZLFopLgorY2w0MihbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w0MyhYLFksWikuCitjbDQzKFthfFhdLFthfFldLFthfFpdKSA6LSBjbDQ0KFgsWSxaKS4KK2NsNDQoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsNDUoWCxZLFopLgorY2w0NShbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w0NihYLFksWikuCitjbDQ2KFthfFhdLFthfFldLFthfFpdKSA6LSBjbDQ3KFgsWSxaKS4KK2NsNDcoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsNDgoWCxZLFopLgorY2w0OChbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w0OShYLFksWikuCitjbDQ5KFthfFhdLFthfFldLFthfFpdKSA6LSBjbDUwKFgsWSxaKS4KK2NsNTAoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsNTEoWCxZLFopLgorY2w1MShbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w1MihYLFksWikuCitjbDUyKFthfFhdLFthfFldLFthfFpdKSA6LSBjbDUzKFgsWSxaKS4KK2NsNTMoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsNTQoWCxZLFopLgorY2w1NChbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w1NShYLFksWikuCitjbDU1KFthfFhdLFthfFldLFthfFpdKSA6LSBjbDU2KFgsWSxaKS4KK2NsNTYoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsNTcoWCxZLFopLgorY2w1NyhbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w1OChYLFksWikuCitjbDU4KFthfFhdLFthfFldLFthfFpdKSA6LSBjbDU5KFgsWSxaKS4KK2NsNTkoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsNjAoWCxZLFopLgorY2w2MChbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w2MShYLFksWikuCitjbDYxKFthfFhdLFthfFldLFthfFpdKSA6LSBjbDYyKFgsWSxaKS4KK2NsNjIoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsNjMoWCxZLFopLgorY2w2MyhbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w2NChYLFksWikuCitjbDY0KFthfFhdLFthfFldLFthfFpdKSA6LSBjbDY1KFgsWSxaKS4KK2NsNjUoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsNjYoWCxZLFopLgorY2w2NihbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w2NyhYLFksWikuCitjbDY3KFthfFhdLFthfFldLFthfFpdKSA6LSBjbDY4KFgsWSxaKS4KK2NsNjgoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsNjkoWCxZLFopLgorY2w2OShbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w3MChYLFksWikuCitjbDcwKFthfFhdLFthfFldLFthfFpdKSA6LSBjbDcxKFgsWSxaKS4KK2NsNzEoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsNzIoWCxZLFopLgorY2w3MihbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w3MyhYLFksWikuCitjbDczKFthfFhdLFthfFldLFthfFpdKSA6LSBjbDc0KFgsWSxaKS4KK2NsNzQoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsNzUoWCxZLFopLgorY2w3NShbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w3NihYLFksWikuCitjbDc2KFthfFhdLFthfFldLFthfFpdKSA6LSBjbDc3KFgsWSxaKS4KK2NsNzcoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsNzgoWCxZLFopLgorY2w3OChbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w3OShYLFksWikuCitjbDc5KFthfFhdLFthfFldLFthfFpdKSA6LSBjbDgwKFgsWSxaKS4KK2NsODAoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsODEoWCxZLFopLgorY2w4MShbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w4MihYLFksWikuCitjbDgyKFthfFhdLFthfFldLFthfFpdKSA6LSBjbDgzKFgsWSxaKS4KK2NsODMoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsODQoWCxZLFopLgorY2w4NChbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w4NShYLFksWikuCitjbDg1KFthfFhdLFthfFldLFthfFpdKSA6LSBjbDg2KFgsWSxaKS4KK2NsODYoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsODcoWCxZLFopLgorY2w4NyhbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w4OChYLFksWikuCitjbDg4KFthfFhdLFthfFldLFthfFpdKSA6LSBjbDg5KFgsWSxaKS4KK2NsODkoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsOTAoWCxZLFopLgorY2w5MChbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w5MShYLFksWikuCitjbDkxKFthfFhdLFthfFldLFthfFpdKSA6LSBjbDkyKFgsWSxaKS4KK2NsOTIoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsOTMoWCxZLFopLgorY2w5MyhbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w5NChYLFksWikuCitjbDk0KFthfFhdLFthfFldLFthfFpdKSA6LSBjbDk1KFgsWSxaKS4KK2NsOTUoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsOTYoWCxZLFopLgorY2w5NihbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2w5NyhYLFksWikuCitjbDk3KFthfFhdLFthfFldLFthfFpdKSA6LSBjbDk4KFgsWSxaKS4KK2NsOTgoW2F8WF0sW2F8WV0sW2F8Wl0pIDotIGNsOTkoWCxZLFopLgorY2w5OShbYXxYXSxbYXxZXSxbYXxaXSkgOi0gY2wxMDAoWCxZLFopLgorY2wxMDAoW2FdLFthXSxbYV0pLgorCisKKy8qIHByZWRpY2F0ZXMgdG8gdGVzdCB1bmlmaWNhdGlvbiBvZiBzdHJ1Y3R1cmVzICovCisKK2NzMShzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3MyKFgsWSxaKS4KK2NzMihzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3MzKFgsWSxaKS4KK2NzMyhzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M0KFgsWSxaKS4KK2NzNChzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M1KFgsWSxaKS4KK2NzNShzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M2KFgsWSxaKS4KK2NzNihzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M3KFgsWSxaKS4KK2NzNyhzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M4KFgsWSxaKS4KK2NzOChzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M5KFgsWSxaKS4KK2NzOShzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3MxMChYLFksWikuCitjczEwKHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczExKFgsWSxaKS4KK2NzMTEoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzMTIoWCxZLFopLgorY3MxMihzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3MxMyhYLFksWikuCitjczEzKHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczE0KFgsWSxaKS4KK2NzMTQoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzMTUoWCxZLFopLgorY3MxNShzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3MxNihYLFksWikuCitjczE2KHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczE3KFgsWSxaKS4KK2NzMTcoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzMTgoWCxZLFopLgorY3MxOChzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3MxOShYLFksWikuCitjczE5KHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczIwKFgsWSxaKS4KK2NzMjAoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzMjEoWCxZLFopLgorY3MyMShzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3MyMihYLFksWikuCitjczIyKHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczIzKFgsWSxaKS4KK2NzMjMoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzMjQoWCxZLFopLgorY3MyNChzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3MyNShYLFksWikuCitjczI1KHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczI2KFgsWSxaKS4KK2NzMjYoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzMjcoWCxZLFopLgorY3MyNyhzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3MyOChYLFksWikuCitjczI4KHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczI5KFgsWSxaKS4KK2NzMjkoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzMzAoWCxZLFopLgorY3MzMChzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3MzMShYLFksWikuCitjczMxKHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczMyKFgsWSxaKS4KK2NzMzIoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzMzMoWCxZLFopLgorY3MzMyhzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3MzNChYLFksWikuCitjczM0KHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczM1KFgsWSxaKS4KK2NzMzUoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzMzYoWCxZLFopLgorY3MzNihzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3MzNyhYLFksWikuCitjczM3KHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczM4KFgsWSxaKS4KK2NzMzgoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzMzkoWCxZLFopLgorY3MzOShzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M0MChYLFksWikuCitjczQwKHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczQxKFgsWSxaKS4KK2NzNDEoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzNDIoWCxZLFopLgorY3M0MihzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M0MyhYLFksWikuCitjczQzKHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczQ0KFgsWSxaKS4KK2NzNDQoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzNDUoWCxZLFopLgorY3M0NShzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M0NihYLFksWikuCitjczQ2KHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczQ3KFgsWSxaKS4KK2NzNDcoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzNDgoWCxZLFopLgorY3M0OChzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M0OShYLFksWikuCitjczQ5KHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczUwKFgsWSxaKS4KK2NzNTAoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzNTEoWCxZLFopLgorY3M1MShzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M1MihYLFksWikuCitjczUyKHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczUzKFgsWSxaKS4KK2NzNTMoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzNTQoWCxZLFopLgorY3M1NChzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M1NShYLFksWikuCitjczU1KHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczU2KFgsWSxaKS4KK2NzNTYoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzNTcoWCxZLFopLgorY3M1NyhzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M1OChYLFksWikuCitjczU4KHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczU5KFgsWSxaKS4KK2NzNTkoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzNjAoWCxZLFopLgorY3M2MChzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M2MShYLFksWikuCitjczYxKHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczYyKFgsWSxaKS4KK2NzNjIoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzNjMoWCxZLFopLgorY3M2MyhzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M2NChYLFksWikuCitjczY0KHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczY1KFgsWSxaKS4KK2NzNjUoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzNjYoWCxZLFopLgorY3M2NihzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M2NyhYLFksWikuCitjczY3KHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczY4KFgsWSxaKS4KK2NzNjgoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzNjkoWCxZLFopLgorY3M2OShzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M3MChYLFksWikuCitjczcwKHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczcxKFgsWSxaKS4KK2NzNzEoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzNzIoWCxZLFopLgorY3M3MihzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M3MyhYLFksWikuCitjczczKHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczc0KFgsWSxaKS4KK2NzNzQoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzNzUoWCxZLFopLgorY3M3NShzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M3NihYLFksWikuCitjczc2KHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczc3KFgsWSxaKS4KK2NzNzcoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzNzgoWCxZLFopLgorY3M3OChzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M3OShYLFksWikuCitjczc5KHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczgwKFgsWSxaKS4KK2NzODAoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzODEoWCxZLFopLgorY3M4MShzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M4MihYLFksWikuCitjczgyKHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczgzKFgsWSxaKS4KK2NzODMoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzODQoWCxZLFopLgorY3M4NChzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M4NShYLFksWikuCitjczg1KHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczg2KFgsWSxaKS4KK2NzODYoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzODcoWCxZLFopLgorY3M4NyhzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M4OChYLFksWikuCitjczg4KHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczg5KFgsWSxaKS4KK2NzODkoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzOTAoWCxZLFopLgorY3M5MChzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M5MShYLFksWikuCitjczkxKHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczkyKFgsWSxaKS4KK2NzOTIoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzOTMoWCxZLFopLgorY3M5MyhzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M5NChYLFksWikuCitjczk0KHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczk1KFgsWSxaKS4KK2NzOTUoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzOTYoWCxZLFopLgorY3M5NihzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3M5NyhYLFksWikuCitjczk3KHN0KGEsWCksc3QoYSxZKSxzdChhLFopKSA6LSBjczk4KFgsWSxaKS4KK2NzOTgoc3QoYSxYKSxzdChhLFkpLHN0KGEsWikpIDotIGNzOTkoWCxZLFopLgorY3M5OShzdChhLFgpLHN0KGEsWSksc3QoYSxaKSkgOi0gY3MxMDAoWCxZLFopLgorY3MxMDAoc3QoYSxuaWwpLHN0KGEsbmlsKSxzdChhLG5pbCkpLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzFfNi5pbiBiL2V4YW1wbGVzL2JlbmNobWFya3MvZWNyYy9iZW5jaF8xXzYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk1YTZmNQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvZWNyYy9iZW5jaF8xXzYuaW4KQEAgLTAsMCArMSBAQAorOi0gZGVyZWYoMTAwMDAwKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvZWNyYy9iZW5jaF8xXzYucGwgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2VjcmMvYmVuY2hfMV82LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZDEwMmUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2VjcmMvYmVuY2hfMV82LnBsCkBAIC0wLDAgKzEsMTAyIEBACisvKiBDSEFOR0VMT0cgYnkgTS5CYW5iYXJhCisgIC0gcHJpbnRfdGltZXMvNCAtLT4gcHJpbnRfdGltZXMvNQorICAtIHJlcG9ydF9jc3YvMiBpcyBhZGRlZC4KKyovCisKKworZGVyZWYoTik6LQorICAgICAgICBtYWtlX2xpc3QoNTAwLCBMMSwgXyksCisgICAgICAgIG1ha2VfbGlzdCg1MDAsIEwyLCBMYXN0KSwKKyAgICAgICAgYmluZF9mb3J3YXJkKEwxKSwKKyAgICAgICAgYmluZF9iYWNrd2FyZChMMiksCisgICAgICAgIEwyID0gW2F8X10sCisgICAgICAgIHN0YXRpc3RpY3MocnVudGltZSxbVDF8X10pLAorICAgICAgICByZWYoTiwgTDEpLAorICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QyfF9dKSwKKyAgICAgICAgcmVmKE4sIExhc3QpLAorICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QzfF9dKSwKKyAgICAgICAgcHJpbnRfdGltZXMoZGVyZWYoTiksVDEsVDIsVDMsTiwxMikuCisKKyVwcmludF90aW1lcyhUMSxUMixUMyxYLEkpIDotICAgICAgICAvKiBwcmludHMgdGhlIHJlc3VsdHMgKi8KKyUgICAgICAgIFRUMSBpcyBUMiAtIFQxLAorJSAgICAgICAgVFQyIGlzIFQzIC0gVDIsCislICAgICAgICBhYnNfZGlmZihUVDEsIFRUMiwgVFQpLAorJSAgICAgICAgd3JpdGUoJ1QgZmlyc3QgbG9vcDogICAgJyksd3JpdGUoVFQxKSwgbmwsCislICAgICAgICB3cml0ZSgnVCBzZWNvbmQgbG9vcDogICAnKSx3cml0ZShUVDIpLCBubCwKKyUgICAgICAgIHdyaXRlKCdUIG5ldDogICAgICAgICAgICcpLHdyaXRlKFRUKSxubCwKKyUgICAgICAgIHdyaXRlKCdLTGlwczogICAgICAgICAgICcpLAorJSAgICAgICAgTGkgaXMgSSAqIFgsCislICAgICAgICBMaXBzIGlzIExpIC8gVFQsCislICAgICAgICBLTGlwcyBpcyBMaXBzIC8gMTAwMCwKKyUgICAgICAgIHdyaXRlKEtMaXBzKSxubCxubC4KK3ByaW50X3RpbWVzKE5hbWUsVDEsVDIsVDMsWCxJKSA6LSAgICAgICAgLyogcHJpbnRzIHRoZSByZXN1bHRzICovCisgICAgICAgIFRUMSBpcyBUMiAtIFQxLAorICAgICAgICBUVDIgaXMgVDMgLSBUMiwKKyAgICAgICAgYWJzX2RpZmYoVFQxLCBUVDIsIFRUKSwKKyAgICAgICAgd3JpdGUoJyMgTmFtZTogICAgICAgICAgICAgJyksd3JpdGUoTmFtZSksIG5sLAorICAgICAgICB3cml0ZSgnIyBUIGZpcnN0IGxvb3A6ICAgICAnKSx3cml0ZShUVDEpLCB3cml0ZSgnIG1zZWMuJyksbmwsCisgICAgICAgIHdyaXRlKCcjIFQgc2Vjb25kIGxvb3A6ICAgICcpLHdyaXRlKFRUMiksIHdyaXRlKCcgbXNlYy4nKSxubCwKKyAgICAgICAgd3JpdGUoJyMgVCBuZXQ6ICAgICAgICAgICAgJyksd3JpdGUoVFQpLHdyaXRlKCcgbXNlYy4nKSxubCwKKyAgICAgICAgd3JpdGUoJyMgS0xpcHM6ICAgICAgICAgICAgJyksCisgICAgICAgIExpIGlzIEkgKiBYLAorICAgICAgICBMaXBzIGlzIExpIC8gVFQsCisgICAgICAgIEtMaXBzIGlzIExpcHMgLyAxMDAwLAorICAgICAgICB3cml0ZShLTGlwcyksbmwsCisJcmVwb3J0X2NzdihbJyMjI0NTViMjIycsTmFtZSxUVDEsVFQyLFRULEtMaXBzXSwgJywnKSwKKwlubC4KKworcmVwb3J0X2NzdihbXSwgXykgOi0gIS4KK3JlcG9ydF9jc3YoW1hdLCBfKSA6LSAhLCB3cml0ZShYKSwgbmwuCityZXBvcnRfY3N2KFtYfFhzXSwgRGVsaW0pIDotIHdyaXRlKFgpLCB3cml0ZShEZWxpbSksIHJlcG9ydF9jc3YoWHMsIERlbGltKS4KKworYWJzX2RpZmYoWCxZLFopIDotIFggPiBZLCAhLCBaIGlzIFggLSBZLgorYWJzX2RpZmYoWCxZLFopIDotIFogaXMgWSAtIFguCisKKy8qCisgKiBCaW5kIHJlcGVhdGl2ZWx5IGEgY29ucyBjZWxsIHRvIGFub3RoZXIgb25lLgorICovCityZWYoMCwgXykgOi0gIS4KK3JlZihOLCBDb25zKSA6LQorICAgICAgICBDb25zID0gW2F8X10sCisgICAgICAgIENvbnMgPSBbYXxfXSwKKyAgICAgICAgQ29ucyA9IFthfF9dLAorICAgICAgICBDb25zID0gW2F8X10sCisgICAgICAgIENvbnMgPSBbYXxfXSwKKyAgICAgICAgQ29ucyA9IFthfF9dLAorICAgICAgICBDb25zID0gW2F8X10sCisgICAgICAgIENvbnMgPSBbYXxfXSwKKyAgICAgICAgQ29ucyA9IFthfF9dLAorICAgICAgICBDb25zID0gW2F8X10sCisgICAgICAgIE4xIGlzIE4gLSAxLAorICAgICAgICByZWYoTjEsIENvbnMpLgorCisvKgorICogQ3JlYXRlIGEgdmFyaWFibGUgY2hhaW4gaWYgaW4gPy0gZXF1YWwoWCwgWSkgdGhlIHN5c3RlbSBiaW5kcworICogWCB0byBZLgorICovCitiaW5kX2ZvcndhcmQoW2FdKSA6LSAhLgorYmluZF9mb3J3YXJkKFtYLCBZfFRdKSA6LQorICAgICAgICBlcXVhbChYLCBZKSwKKyAgICAgICAgYmluZF9mb3J3YXJkKFtZfFRdKS4KKworLyoKKyAqIENyZWF0ZSBhIHZhcmlhYmxlIGNoYWluIGlmIGluID8tIGVxdWFsKFgsIFkpIHRoZSBzeXN0ZW0gYmluZHMKKyAqIFkgdG8gWC4KKyAqLworYmluZF9iYWNrd2FyZChbWF0pIDotICEuCitiaW5kX2JhY2t3YXJkKFtYLCBZfFRdKSA6LQorICAgICAgICBiaW5kX2JhY2t3YXJkKFtZfFRdKSwKKyAgICAgICAgZXF1YWwoWCwgWSkuCisKK2VxdWFsKFgsIFgpLgorCisvKgorICogQ3JlYXRlIGEgbGlzdCBjb250YWluaW5nIHZhcmlhYmxlcyBhbmQgcmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZQorICogZmlyc3QgYW5kIHRvIHRoZSBsYXN0IGNvbnMgY2VsbC4KKyAqLworbWFrZV9saXN0KDEsIEwsIEwpIDotCisgICAgICAgIEwgPSBbWF0sCisgICAgICAgICEuCittYWtlX2xpc3QoTiwgW1h8UmVzdF0sIExhc3QpIDotCisgICAgICAgIE4xIGlzIE4gLSAxLAorICAgICAgICBtYWtlX2xpc3QoTjEsIFJlc3QsIExhc3QpLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzFfNy5pbiBiL2V4YW1wbGVzL2JlbmNobWFya3MvZWNyYy9iZW5jaF8xXzcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmNTc4YwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvZWNyYy9iZW5jaF8xXzcuaW4KQEAgLTAsMCArMSBAQAorOi0gY3V0dGVzdCgxMDAwMDApLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzFfNy5wbCBiL2V4YW1wbGVzL2JlbmNobWFya3MvZWNyYy9iZW5jaF8xXzcucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU5NTMwNgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvZWNyYy9iZW5jaF8xXzcucGwKQEAgLTAsMCArMSw2MyBAQAorLyogQ0hBTkdFTE9HIGJ5IE0uQmFuYmFyYQorICAtIHByaW50X3RpbWVzLzQgLS0+IHByaW50X3RpbWVzLzUKKyAgLSByZXBvcnRfY3N2LzIgaXMgYWRkZWQuCisqLworCisKK2N1dHRlc3QoTik6LXN0YXRpc3RpY3MocnVudGltZSxbVDF8X10pLAorICAgICAgICBjdXRpdDExKE4pLCBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QyfF9dKSwKKyAgICAgICAgY29tcGVuc19sb29wKE4pLCBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QzfF9dKSwKKyAgICAgICAgcHJpbnRfdGltZXMoY3V0dGVzdChOKSxUMSxUMixUMyxOLDMwMCkuCisKK2NvbXBlbnNfbG9vcCgwKS4KK2NvbXBlbnNfbG9vcChYKSA6LSBZIGlzIFggLSAxLCBjb21wZW5zX2xvb3AoWSkuCisKKy8qIGN1dGl0MTEoTikgICAgKi8KK2N1dGl0MTEoMCkuCitjdXRpdDExKE4pOi0gY3V0dDEoWzEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwKKyAgICAgICAgICAgICAgICAgMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLAorICAgICAgICAgICAgICAgICAxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsCisgICAgICAgICAgICAgICAgIDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwKKyAgICAgICAgICAgICAgICAgMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLAorICAgICAgICAgICAgICAgICAxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsCisgICAgICAgICAgICAgICAgIDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwKKyAgICAgICAgICAgICAgICAgMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLAorICAgICAgICAgICAgICAgICAxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsCisgICAgICAgICAgICAgICAgIDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMCwxMDAsMTAwLDEwMF0pLAorICAgICAgICAgICBNIGlzIE4tMSwgY3V0aXQxMShNKS4KKworY3V0dDEoW10pLgorY3V0dDEoW1h8TF0pOi1YPTEwMCwgISwgY3V0dDEoTCkuCitjdXR0MShbWHxMXSk6LVggPiAxMDAsIGN1dHQxKEwpLgorCislcHJpbnRfdGltZXMoVDEsVDIsVDMsWCxJKSA6LSAgICAgICAgLyogcHJpbnRzIHRoZSByZXN1bHRzICovCislICAgICAgICBUVDEgaXMgVDIgLSBUMSwKKyUgICAgICAgIFRUMiBpcyBUMyAtIFQyLAorJSAgICAgICAgVFQgaXMgVFQxIC0gVFQyLAorJSAgICAgICAgd3JpdGUoJ1Qgb3ZlcmFsbCBsb29wOiAgICcpLHdyaXRlKFRUMSksIG5sLAorJSAgICAgICAgd3JpdGUoJ1QgY29tcGVucyBsb29wOiAgICcpLHdyaXRlKFRUMiksIG5sLAorJSAgICAgICAgd3JpdGUoJ1QgbmV0OiAgICAgICAgICAgICcpLHdyaXRlKFRUKSxubCwKKyUgICAgICAgIHdyaXRlKCdLTGlwczogICAgICAgICAgICAnKSwKKyUgICAgICAgIExpIGlzIEkgKiBYLAorJSAgICAgICAgTGlwcyBpcyBMaSAvIFRULAorJSAgICAgICAgS0xpcHMgaXMgTGlwcyAvIDEwMDAsCislICAgICAgICB3cml0ZShLTGlwcyksbmwsbmwuCitwcmludF90aW1lcyhOYW1lLFQxLFQyLFQzLFgsSSkgOi0gICAgICAgIC8qIHByaW50cyB0aGUgcmVzdWx0cyAqLworICAgICAgICBUVDEgaXMgVDIgLSBUMSwKKyAgICAgICAgVFQyIGlzIFQzIC0gVDIsCisgICAgICAgIFRUIGlzIFRUMSAtIFRUMiwKKyAgICAgICAgd3JpdGUoJyMgTmFtZTogICAgICAgICAgICAgJyksd3JpdGUoTmFtZSksIG5sLAorICAgICAgICB3cml0ZSgnIyBUIG92ZXJhbGwgbG9vcDogICAnKSx3cml0ZShUVDEpLCB3cml0ZSgnIG1zZWMuJyksbmwsCisgICAgICAgIHdyaXRlKCcjIFQgY29tcGVucyBsb29wOiAgICcpLHdyaXRlKFRUMiksIHdyaXRlKCcgbXNlYy4nKSxubCwKKyAgICAgICAgd3JpdGUoJyMgVCBuZXQ6ICAgICAgICAgICAgJyksd3JpdGUoVFQpLHdyaXRlKCcgbXNlYy4nKSxubCwKKyAgICAgICAgd3JpdGUoJyMgS0xpcHM6ICAgICAgICAgICAgJyksCisgICAgICAgIExpIGlzIEkgKiBYLAorICAgICAgICBMaXBzIGlzIExpIC8gVFQsCisgICAgICAgIEtMaXBzIGlzIExpcHMgLyAxMDAwLAorICAgICAgICB3cml0ZShLTGlwcyksbmwsCisJcmVwb3J0X2NzdihbJyMjI0NTViMjIycsTmFtZSxUVDEsVFQyLFRULEtMaXBzXSwgJywnKSwKKwlubC4KKworcmVwb3J0X2NzdihbXSwgXykgOi0gIS4KK3JlcG9ydF9jc3YoW1hdLCBfKSA6LSAhLCB3cml0ZShYKSwgbmwuCityZXBvcnRfY3N2KFtYfFhzXSwgRGVsaW0pIDotIHdyaXRlKFgpLCB3cml0ZShEZWxpbSksIHJlcG9ydF9jc3YoWHMsIERlbGltKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvZWNyYy9iZW5jaF8yLmluIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzIuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5OGU3NgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvZWNyYy9iZW5jaF8yLmluCkBAIC0wLDAgKzEsMTAgQEAKKzotIGZpYm9uYWNjaSgxMDAwMCkuCis6LSBtYXAoMTAwMDAwKS4KKzotIG1oYW0oMTAwKS4KKzotIG11dGVzdCgxMDAwMCkuCis6LSBxcygxMDAwMCkuCis6LSBxdSgxMDAwMCkuCis6LSBxdWVyeSgxMDAwMCkuCis6LSBkaWZmZXJlbigxMDAwMDApLgorOi0gZGlmZigxMDAwMCkuCis6LSBucmV2KDUwMDApLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzIucGwgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2VjcmMvYmVuY2hfMi5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGRiMjEwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9lY3JjL2JlbmNoXzIucGwKQEAgLTAsMCArMSw1MzEgQEAKKy8qIENIQU5HRUxPRyBieSBNLkJhbmJhcmEKKyAgLSBwcmludF90aW1lcy80IC0tPiBwcmludF90aW1lcy81CisgIC0gcmVwb3J0X2Nzdi8yIGlzIGFkZGVkLgorICAgLSB1c2VyICAtLT4gdXNlcl9vdXRwdXQgKHN0cmVhbSBhbGlhcykKKyovCisKKy8qIENvbW1vbiBmdW5jdGlvbnMuLi4gICAgICAgKi8KKyVwcmludF90aW1lcyhUMSxUMixUMyxMKSA6LQorJSAgICAgICAgVFQxIGlzIFQyIC0gVDEsCislICAgICAgICBUVDIgaXMgVDMgLSBUMiwKKyUgICAgICAgIFRUIGlzIFRUMSAtIFRUMiwKKyUgICAgICAgIHdyaXRlKCdOZXQgVGltZSBpczogJyksIHdyaXRlKFRUKSwgbmwsCislICAgICAgICBMaXBzIGlzIEwgLyBUVCwKKyUgICAgICAgIEtsaXBzIGlzIExpcHMgLyAxMDAwLAorJSAgICAgICAgd3JpdGUoJ0tMaXBzIGFyZTogJyksIHdyaXRlKEtsaXBzKSwgbmwuCisKK3ByaW50X3RpbWVzKE5hbWUsVDEsVDIsVDMsTCkgOi0KKyAgICAgICAgVFQxIGlzIFQyIC0gVDEsCisgICAgICAgIFRUMiBpcyBUMyAtIFQyLAorICAgICAgICBUVCBpcyBUVDEgLSBUVDIsCisgICAgICAgIHdyaXRlKCcjIE5hbWU6ICAgICAgICAgICAgICcpLHdyaXRlKE5hbWUpLCBubCwKKyAgICAgICAgd3JpdGUoJyMgTmV0IFRpbWUgaXM6ICAgICAgJyksd3JpdGUoVFQpLHdyaXRlKCcgbXNlYy4nKSxubCwKKyAgICAgICAgd3JpdGUoJyMgS0xpcHMgYXJlOiAgICAgICAgJyksCisgICAgICAgIExpcHMgaXMgTCAvIFRULAorICAgICAgICBLTGlwcyBpcyBMaXBzIC8gMTAwMCwKKyAgICAgICAgd3JpdGUoS0xpcHMpLG5sLAorCXJlcG9ydF9jc3YoWycjIyNDU1YjIyMnLE5hbWUsVFQxLFRUMixUVCxLTGlwc10sICcsJyksCisJbmwuCisKK3JlcG9ydF9jc3YoW10sIF8pIDotICEuCityZXBvcnRfY3N2KFtYXSwgXykgOi0gISwgd3JpdGUoWCksIG5sLgorcmVwb3J0X2NzdihbWHxYc10sIERlbGltKSA6LSB3cml0ZShYKSwgd3JpdGUoRGVsaW0pLCByZXBvcnRfY3N2KFhzLCBEZWxpbSkuCisKK2NvbXBlbnNfbG9vcCgwKS4KK2NvbXBlbnNfbG9vcChYKSA6LSBZIGlzIFggLSAxLCBjb21wZW5zX2xvb3AoWSkuCisKK2VsKFgsW1h8TF0pLgorZWwoWCxbWXxMXSk6LWVsKFgsTCkuCisKK2xpc3Q1MChbMjcsNzQsMTcsMzMsOTQsMTgsNDYsODMsNjUsMiwKKyAgICAgICAzMiw1MywyOCw4NSw5OSw0NywyOCw4Miw2LDExLAorICAgICAgIDU1LDI5LDM5LDgxLDkwLDM3LDEwLDAsNjYsNTEsCisgICAgICAgIDcsMjEsODUsMjcsMzEsNjMsNzUsNCw5NSw5OSwKKyAgICAgICAxMSwyOCw2MSw3NCwxOCw5Miw0MCw1Myw1OSw4XSkuCisKKy8qIEZpYm9uYWNjaSBTZXJpZXMgdGhlIHNsb3cgd2F5ICAgICAgICAgICAgKi8KKy8qIGZpYm9uYWNjaSgxKSB3aWxsIGRvLi4uICAgICAgICAgICAgICAgICAgKi8KKworZmlib25hY2NpKE4pIDotIHN0YXRpc3RpY3MocnVudGltZSxbWHxfXSksCisgICAgICAgICAgZmliX2xvb3AoTiksCisgICAgICAgICAgc3RhdGlzdGljcyhydW50aW1lLFtOb3d8X10pLAorICAgICAgICAgIGNvbXBlbnNfbG9vcChOKSwKKyAgICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW018X10pLAorICAgICAgICAgIExpIGlzIDQ5MzIgKiBOLAorICAgICAgICAgIHByaW50X3RpbWVzKGZpYm9uYWNjaShOKSxYLE5vdyxNLExpKS4KKworCitmaWJfbG9vcCgwKS4KK2ZpYl9sb29wKFgpIDotIFwrIFwrIHRvcF9maWIoMTUsWiksIFkgaXMgWCAtIDEsIGZpYl9sb29wKFkpLgorCit0b3BfZmliKDAsMSkuCit0b3BfZmliKDEsMSkuCit0b3BfZmliKFgsWSk6LVgxIGlzIFgtMSxYMiBpcyBYLTIsdG9wX2ZpYihYMSxZMSksCisgICAgICAgICAgICAgdG9wX2ZpYihYMixZMiksWSBpcyBZMStZMi4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBNYXAgY29sb3VyaW5nIHByb2JsZW0gICAgICAgICAgICAgICAgKi8KKy8qICBtYXAoMjAwKSBpcyBhZHZpc2VkLiAgICAgICAgICAgICAgICAqLworCittYXAoTikgOi0gc3RhdGlzdGljcyhydW50aW1lLFtYfF9dKSwKKyAgICAgICAgICBtYXBfbG9vcChOKSwKKyAgICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW05vd3xfXSksCisgICAgICAgICAgY29tcGVuc19sb29wKE4pLAorICAgICAgICAgIHN0YXRpc3RpY3MocnVudGltZSxbTXxfXSksCisgICAgICAgICAgTGkgaXMgNjggKiBOLAorICAgICAgICAgIHByaW50X3RpbWVzKG1hcChOKSxYLE5vdyxNLExpKS4KKworbWFwX2xvb3AoMCkuCittYXBfbG9vcChYKSA6LSBcKyBcKyBtYXBfdG9wLCBZIGlzIFggLSAxLCBtYXBfbG9vcChZKS4KKworbWFwX3RvcDotCisJZWwoWDEsW2JdKSwKKwllbChYMixbcl0pLAorCWVsKFg3LFtnXSksCisJZWwoWDEzLFt3XSksCisJZWwoWDMsW2IscixnLHddKSwKKwlcKyhYMj1YMyksCisJXCsoWDM9WDEzKSwKKwllbChYNCxbYixyLGcsd10pLAorCVwrKFgyPVg0KSwKKwlcKyhYNz1YNCksCisJXCsoWDM9WDQpLAorCWVsKFg1LFtiLHIsZyx3XSksCisJXCsoWDEzPVg1KSwKKwlcKyhYMz1YNSksCisJXCsoWDQ9WDUpLAorCWVsKFg2LFtiLHIsZyx3XSksCisJXCsoWDEzPVg2KSwKKwlcKyhYNT1YNiksCisJZWwoWDgsW2IscixnLHddKSwKKwlcKyhYNz1YOCksCisJXCsoWDEzPVg4KSwKKwllbChYOSxbYixyLGcsd10pLAorCVwrKFgxMz1YOSksCisJXCsoWDQ9WDkpLAorCVwrKFg4PVg5KSwKKwllbChYMTAsW2IscixnLHddKSwKKwlcKyhYND1YMTApLAorCVwrKFg1PVgxMCksCisJXCsoWDY9WDEwKSwKKwlcKyhYOT1YMTApLAorCWVsKFgxMSxbYixyLGcsd10pLAorCVwrKFgxMT1YMTMpLAorCVwrKFgxMT1YMTApLAorCVwrKFgxMT1YNiksCisJZWwoWDEyLFtiLHIsZyx3XSksCisJXCsoWDEyPVgxMyksCisJXCsoWDEyPVgxMSksCisJXCsoWDEyPVg5KS4KKwkld3JpdGUodXNlcl9vdXRwdXQsW1gxLFgyLFgzLFg0LFg1LFg2LFg3LFg4LFg5LFgxMCxYMTEsWDEyLFgxM10pLG5sLgorCittYXBfdG9wLgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgSGFtaWx0b25pYW4gR3JhcGhzLi4uICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRXh0cmVtZWx5IGxvbmcgKG5lYXJseSBoYWxmIGEgbWlsbGlvbiBMSSdzICEpICovCisvKiAgT25seSAxIGFkdmlzZWQgISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK21oYW0oTikgOi0gc3RhdGlzdGljcyhydW50aW1lLFtYfF9dKSwKKyAgICAgICAgICBtaGFtX2xvb3AoTiksCisgICAgICAgICAgc3RhdGlzdGljcyhydW50aW1lLFtOb3d8X10pLAorICAgICAgICAgIGNvbXBlbnNfbG9vcChOKSwKKyAgICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW018X10pLAorICAgICAgICAgIExpIGlzIDQ5MzgyNCAqIE4sCisgICAgICAgICAgcHJpbnRfdGltZXMobWhhbShOKSxYLE5vdyxNLExpKS4KKworbWhhbV9sb29wKDApLgorbWhhbV9sb29wKFgpIDotIFwrIFwrIG1oYW1fdG9wLCBZIGlzIFggLSAxLCBtaGFtX2xvb3AoWSkuCisKK21oYW1fdG9wOi0KKyAgICAgICAgY3ljbGVfaGFtKFthLGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHRdLFgpLAorICAgICAgICBmYWlsLgorbWhhbV90b3AuCisKK2N5Y2xlX2hhbShbWHxZXSxbWCxUfExdKTotCisgICAgICAgIGNoYWluX2hhbShbWHxZXSxbXSxbVHxMXSksCisgICAgICAgIGVkZ2UoVCxYKS4KKworY2hhaW5faGFtKFtYXSxMLFtYfExdKS4KK2NoYWluX2hhbShbWHxZXSxLLEwpOi0KKyAgICAgICAgZGVsZXRlKFosWSxUKSwKKyAgICAgICAgZWRnZShYLFopLAorICAgICAgICBjaGFpbl9oYW0oW1p8VF0sW1h8S10sTCkuCisKK2RlbGV0ZShYLFtYfFldLFkpLgorZGVsZXRlKFgsW1V8WV0sW1V8Wl0pOi0KKyAgICAgICAgZGVsZXRlKFgsWSxaKS4KKworZWRnZShYLFkpOi0KKyAgICAgICAgY29ubmVjdChYLEwpLAorICAgICAgICBlbChZLEwpLgorCitjb25uZWN0KDAsWzEsMiwzLDQsNSw2LDcsOCw5XSkuCitjb25uZWN0KDEsWzAsMiwzLDQsNSw2LDcsOCw5XSkuCitjb25uZWN0KDIsWzAsMSwzLDQsNSw2LDcsOCw5XSkuCitjb25uZWN0KDMsWzAsMSwyLDQsNSw2LDcsOCw5XSkuCitjb25uZWN0KDQsWzAsMSwyLDMsNSw2LDcsOCw5XSkuCitjb25uZWN0KDUsWzAsMSwyLDMsNCw2LDcsOCw5XSkuCitjb25uZWN0KDYsWzAsMSwyLDMsNCw1LDcsOCw5XSkuCitjb25uZWN0KDcsWzAsMSwyLDMsNCw1LDYsOCw5XSkuCitjb25uZWN0KDgsWzAsMSwyLDMsNCw1LDYsNyw5XSkuCitjb25uZWN0KDksWzAsMSwyLDMsNCw1LDYsNyw4XSkuCisKK2Nvbm5lY3QoYSxbYixqLGtdKS4KK2Nvbm5lY3QoYixbYSxjLHBdKS4KK2Nvbm5lY3QoYyxbYixkLGxdKS4KK2Nvbm5lY3QoZCxbYyxlLHFdKS4KK2Nvbm5lY3QoZSxbZCxmLG1dKS4KK2Nvbm5lY3QoZixbZSxnLHJdKS4KK2Nvbm5lY3QoZyxbZixoLG5dKS4KK2Nvbm5lY3QoaCxbaSxnLHNdKS4KK2Nvbm5lY3QoaSxbaixoLG9dKS4KK2Nvbm5lY3QoaixbYSxpLHRdKS4KK2Nvbm5lY3QoayxbbyxsLGFdKS4KK2Nvbm5lY3QobCxbayxtLGNdKS4KK2Nvbm5lY3QobSxbbCxuLGVdKS4KK2Nvbm5lY3QobixbbSxvLGddKS4KK2Nvbm5lY3QobyxbbixrLGldKS4KK2Nvbm5lY3QocCxbYixxLHRdKS4KK2Nvbm5lY3QocSxbcCxyLGRdKS4KK2Nvbm5lY3QocixbcSxzLGZdKS4KK2Nvbm5lY3Qocyxbcix0LGhdKS4KK2Nvbm5lY3QodCxbcCxzLGpdKS4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICBIb2ZzdGFkZXIncyBtdSBtYXRoIChtdXRlc3QpIHByb3ZpbmcgbXVpaXUgICovCisvKiAgZnJvbSBHb2RlbCBFc2NoZXIgQmFjaCAgICAgICAgICAgICAgICAgICAgICAqLworbXV0ZXN0KE4pIDotIHN0YXRpc3RpY3MocnVudGltZSxbWHxfXSksCisgICAgICAgICAgbXVfbG9vcChOKSwKKyAgICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW05vd3xfXSksCisgICAgICAgICAgY29tcGVuc19sb29wKE4pLAorICAgICAgICAgIHN0YXRpc3RpY3MocnVudGltZSxbTXxfXSksCisgICAgICAgICAgTGkgaXMgMTM2NiAqIE4sCisgICAgICAgICAgcHJpbnRfdGltZXMobXV0ZXN0KE4pLFgsTm93LE0sTGkpLgorCittdV9sb29wKDApLgorbXVfbG9vcChYKSA6LSBcKyBcKyBtdV90b3AsIFkgaXMgWCAtIDEsIG11X2xvb3AoWSkuCisKK211X3RvcDotIHRoZW9yZW0oNSxbbSx1LGksaSx1XSkuCisKK3J1bGVzKFMsIFIpIDotIHJ1bGUzKFMsUikuCitydWxlcyhTLCBSKSA6LSBydWxlNChTLFIpLgorcnVsZXMoUywgUikgOi0gcnVsZTEoUyxSKS4KK3J1bGVzKFMsIFIpIDotIHJ1bGUyKFMsUikuCisKK3J1bGUxKFMsUikgOi0KKyAgICAgICAgYXBwZW5kKFgsIFtpXSwgUyksCisgICAgICAgIGFwcGVuZChYLCBbaSx1XSwgUikuCisKK3J1bGUyKFttIHwgVF0sIFttIHwgUl0pIDotIGFwcGVuZChULCBULCBSKS4KKworcnVsZTMoW10sIC0pIDotIGZhaWwuCitydWxlMyhSLCBUKSA6LQorICAgICAgICBhcHBlbmQoW2ksaSxpXSwgUywgUiksCisgICAgICAgIGFwcGVuZChbdV0sIFMsIFQpLgorcnVsZTMoW0ggfCBUXSwgW0ggfCBSXSkgOi0gcnVsZTMoVCwgUikuCisKK3J1bGU0KFtdLCAtKSA6LSBmYWlsLgorcnVsZTQoUiwgVCkgOi0gYXBwZW5kKFt1LCB1XSwgVCwgUikuCitydWxlNChbSCB8IFRdLCBbSCB8IFJdKSA6LSBydWxlNChULCBSKS4KKwordGhlb3JlbShEZXB0aCwgW20sIGldKS4KK3RoZW9yZW0oRGVwdGgsIFtdKSA6LSBmYWlsLgorCit0aGVvcmVtKERlcHRoLCBSKSA6LQorICAgICAgICBEZXB0aCA+IDAsCisgICAgICAgIEQgaXMgRGVwdGggLSAxLAorICAgICAgICB0aGVvcmVtKEQsIFMpLAorICAgICAgICBydWxlcyhTLCBSKS4KKworYXBwZW5kKFtdLCBYLCBYKS4KK2FwcGVuZChbQSB8IEJdLCBYLCBbQSB8IEIxXSkgOi0KKyAgICAgICAgISwKKyAgICAgICAgYXBwZW5kKEIsIFgsIEIxKS4KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgKi8KKy8qICBRdWlja3NvcnQgb2YgNTAgZWxlbWVudCBsaXN0ICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworcXMoTikgOi0gIGxpc3Q1MChMKSwKKyAgICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW1h8X10pLAorICAgICAgICAgIHFzX2xvb3AoTixMKSwKKyAgICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW05vd3xfXSksCisgICAgICAgICAgY29tcGVuc19sb29wKE4pLAorICAgICAgICAgIHN0YXRpc3RpY3MocnVudGltZSxbTXxfXSksCisgICAgICAgICAgTGkgaXMgNjAxICogTiwKKyAgICAgICAgICBwcmludF90aW1lcyhxcyhOKSxYLE5vdyxNLExpKS4KKworcXNfbG9vcCgwLF8pLgorcXNfbG9vcChYLEwpIDotIHFzb3J0KEwsWixbXSksIFkgaXMgWCAtIDEscXNfbG9vcChZLEwpLgorCitxc29ydChbWHxMXSxSLFIwKSA6LQorICAgICAgcGFydGl0aW9uKEwsWCxMMSxMMiksCisgICAgICBxc29ydChMMixSMSxSMCksCisgICAgICBxc29ydChMMSxSLFtYfFIxXSkuCitxc29ydChbXSxSLFIpLgorCitwYXJ0aXRpb24oW1h8TF0sWSxbWHxMMV0sTDIpIDotIFggPTwgWSwhLAorICAgICAgcGFydGl0aW9uKEwsWSxMMSxMMikuCitwYXJ0aXRpb24oW1h8TF0sWSxMMSxbWHxMMl0pIDotCisgICAgICBwYXJ0aXRpb24oTCxZLEwxLEwyKS4KK3BhcnRpdGlvbihbXSxfLFtdLFtdKS4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgUXVlZW5zIG9uIGEgY2hlc3MgYm9hcmQgcHJvYmxlbS4uLiAgKi8KKy8qICBPbmx5IHR3byBzb2x1dGlvbiBvbiBhIDR4NCBib2FyZC4uLiAqLworLyogIGFib3V0IDUgLSAxMCBpcyBhZHZpc2VkIGZvciBOLiAgICAgICovCitxdShOKSA6LSBzdGF0aXN0aWNzKHJ1bnRpbWUsW1h8X10pLAorICAgICAgICAgIHF1X25sb29wKE4pLAorICAgICAgICAgIHN0YXRpc3RpY3MocnVudGltZSxbTm93fF9dKSwKKyAgICAgICAgICBjb21wZW5zX2xvb3AoTiksCisgICAgICAgICAgc3RhdGlzdGljcyhydW50aW1lLFtNfF9dKSwKKyAgICAgICAgICBMaSBpcyA2ODQgKiBOLAorICAgICAgICAgIHByaW50X3RpbWVzKHF1KE4pLFgsTm93LE0sTGkpLgorCitxdV9ubG9vcCgwKS4KK3F1X25sb29wKFgpIDotIHF1X3RvcCwgWSBpcyBYIC0gMSwgcXVfbmxvb3AoWSkuCisKK3F1X3RvcCA6LSAgcnVuKDQsWCksIGZhaWwuCitxdV90b3AuCisKK3NpemUoNCkuCitzbmludCgxKS4KK3NuaW50KDIpLgorc25pbnQoMykuCitzbmludCg0KS4KKworcnVuKFNpemUsIFNvbG4pIDotIGdldF9zb2x1dGlvbnMoU2l6ZSwgU29sbikuCisKK2dldF9zb2x1dGlvbnMoQm9hcmRfc2l6ZSwgU29sbikgOi0gc29sdmUoQm9hcmRfc2l6ZSwgW10sIFNvbG4pLgorCisvKiAgbmV3c3F1YXJlIGdlbmVyYXRlcyBsZWdhbCBwb3NpdGlvbnMgZm9yIG5leHQgcXVlZW4gICAgICovCisKK25ld3NxdWFyZShbXSwgc3F1YXJlKDEsIFgpKSA6LSBzbmludChYKS4KK25ld3NxdWFyZShbc3F1YXJlKEksIEopIHwgUmVzdF0sIHNxdWFyZShYLCBZKSkgOi0KKyAgICAgICAgWCBpcyBJICsgMSwKKyAgICAgICAgc25pbnQoWSksCisgICAgICAgIFwrKHRocmVhdGVuZWQoSSwgSiwgWCwgWSkpLAorICAgICAgICBzYWZlKFgsIFksIFJlc3QpLgorCisvKiAgIHNhZmUgY2hlY2tzIHdoZXRoZXIgc3F1YXJlKFgsIFkpIGlzIHRocmVhdGVuZWQgYnkgYW55ICovCisvKiAgIGV4aXN0aW5nIHF1ZWVucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3NhZmUoWCwgWSwgW10pLgorc2FmZShYLCBZLCBbc3F1YXJlKEksIEopIHwgTF0pIDotCisgICAgICAgIFwrKHRocmVhdGVuZWQoSSwgSiwgWCwgWSkpLAorICAgICAgICBzYWZlKFgsIFksIEwpLgorCisvKiAgICB0aHJlYXRlbmVkIGNoZWNrcyB3aGV0aGVyIHNxdWFyZXMgKEksIEopIGFuZCAoWCwgWSkgKi8KKy8qICAgIHRocmVhdGVuIGVhY2ggb3RoZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCit0aHJlYXRlbmVkKEksIEosIFgsIFkpIDotCisgICAgICAgIChJID0gWCksCisgICAgICAgICEuCit0aHJlYXRlbmVkKEksIEosIFgsIFkpIDotCisgICAgICAgIChKID0gWSksCisgICAgICAgICEuCit0aHJlYXRlbmVkKEksIEosIFgsIFkpIDotCisgICAgICAgIChVIGlzIEkgLSBKKSwKKyAgICAgICAgKFYgaXMgWCAtIFkpLAorICAgICAgICAoVSA9IFYpLAorICAgICAgICAhLgordGhyZWF0ZW5lZChJLCBKLCBYLCBZKSA6LQorICAgICAgICAoVSBpcyBJICsgSiksCisgICAgICAgIChWIGlzIFggKyBZKSwKKyAgICAgICAgKFUgPSBWKSwKKyAgICAgICAgIS4KKworLyogc29sdmUgYWNjdW11bGF0ZXMgdGhlIHBvc2l0aW9ucyBvZiBvY2N1cGllZCBzcXVhcmVzICovCisKK3NvbHZlKEJzLCBbc3F1YXJlKEJzLCBZKSB8IExdLCBbc3F1YXJlKEJzLCBZKSB8IExdKSA6LSBzaXplKEJzKS4KK3NvbHZlKEJvYXJkX3NpemUsIEluaXRpYWwsIEZpbmFsKSA6LQorICAgICAgICBuZXdzcXVhcmUoSW5pdGlhbCwgTmV4dCksCisgICAgICAgIHNvbHZlKEJvYXJkX3NpemUsIFtOZXh0IHwgSW5pdGlhbF0sIEZpbmFsKS4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBRdWVyeSBkb2VzIHNpbXBsZSBkYXRhYmFzZSBxdWVyaWVzLiAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitxdWVyeShOKSA6LSBzdGF0aXN0aWNzKHJ1bnRpbWUsW1h8X10pLAorICAgICAgICAgIHF1ZV9ubG9vcChOKSwKKyAgICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW05vd3xfXSksCisgICAgICAgICAgY29tcGVuc19sb29wKE4pLAorICAgICAgICAgIHN0YXRpc3RpY3MocnVudGltZSxbTXxfXSksCisgICAgICAgICAgTGkgaXMgMjI5NCAqIE4sCisgICAgICAgICAgcHJpbnRfdGltZXMocXVlcnkoTiksWCxOb3csTSxMaSkuCisKK3F1ZV9ubG9vcCgwKS4KK3F1ZV9ubG9vcChYKSA6LSBxdWVfdG9wLCBZIGlzIFggLSAxLCBxdWVfbmxvb3AoWSkuCisKK3F1ZV90b3A6LSBxdWUoWCksIGZhaWwuCitxdWVfdG9wLgorCitxdWUoW0MxLEQxLEMyLEQyXSkgOi0KKyAgICAgIGRlbnNpdHkoQzEsRDEpLAorICAgICAgZGVuc2l0eShDMixEMiksCisgICAgICBEMT5EMiwKKyAgICAgIDIwKkQxPDIxKkQyLgorCitkZW5zaXR5KEMsRCkgOi0KKyAgICAgIHBvcChDLFApLAorICAgICAgYXJlYShDLEEpLAorICAgICAgRCBpcyAoUCoxMDApL0EuCisKK3BvcChjaGluYSw4MjUwKS4KK3BvcChpbmRpYSw1ODYzKS4KK3BvcCh1c3NyLDI1MjEpLgorcG9wKHVzYSwyMTE5KS4KK3BvcChpbmRvbmVzaWEsMTI3NikuCitwb3AoamFwYW4sMTA5NykuCitwb3AoYnJhemlsLDEwNDIpLgorcG9wKGJhbmdsYWRlc2gsNzUwKS4KK3BvcChwYWtpc3Rhbiw2ODIpLgorcG9wKHdfZ2VybWFueSw2MjApLgorcG9wKG5pZ2VyaWEsNjEzKS4KK3BvcChtZXhpY28sNTgxKS4KK3BvcCh1ayw1NTkpLgorcG9wKGl0YWx5LDU1NCkuCitwb3AoZnJhbmNlLDUyNSkuCitwb3AocGhpbGlwcGluZXMsNDE1KS4KK3BvcCh0aGFpbGFuZCw0MTApLgorcG9wKHR1cmtleSwzODMpLgorcG9wKGVneXB0LDM2NCkuCitwb3Aoc3BhaW4sMzUyKS4KK3BvcChwb2xhbmQsMzM3KS4KK3BvcChzX2tvcmVhLDMzNSkuCitwb3AoaXJhbiwzMjApLgorcG9wKGV0aGlvcGlhLDI3MikuCitwb3AoYXJnZW50aW5hLDI1MSkuCisKK2FyZWEoY2hpbmEsMzM4MCkuCithcmVhKGluZGlhLDExMzkpLgorYXJlYSh1c3NyLDg3MDgpLgorYXJlYSh1c2EsMzYwOSkuCithcmVhKGluZG9uZXNpYSw1NzApLgorYXJlYShqYXBhbiwxNDgpLgorYXJlYShicmF6aWwsMzI4OCkuCithcmVhKGJhbmdsYWRlc2gsNTUpLgorYXJlYShwYWtpc3RhbiwzMTEpLgorYXJlYSh3X2dlcm1hbnksOTYpLgorYXJlYShuaWdlcmlhLDM3MykuCithcmVhKG1leGljbyw3NjQpLgorYXJlYSh1ayw4NikuCithcmVhKGl0YWx5LDExNikuCithcmVhKGZyYW5jZSwyMTMpLgorYXJlYShwaGlsaXBwaW5lcyw5MCkuCithcmVhKHRoYWlsYW5kLDIwMCkuCithcmVhKHR1cmtleSwyOTYpLgorYXJlYShlZ3lwdCwzODYpLgorYXJlYShzcGFpbiwxOTApLgorYXJlYShwb2xhbmQsMTIxKS4KK2FyZWEoc19rb3JlYSwzNykuCithcmVhKGlyYW4sNjI4KS4KK2FyZWEoZXRoaW9waWEsMzUwKS4KK2FyZWEoYXJnZW50aW5hLDEwODApLgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgICAgICBkaWZmZXJlbiAodGltZXMxMCxkaXZpZGUxMCxsb2cxMCxvcHM4KSAgICAgICovCisvKiAgICAgICBUaGVzZSA0IGV4YW1wbGVzIGFyZSBmcm9tIFdhcnJlbidzIHRoZXNpcyAgICovCisvKiAgICAgICBkaWZmZXJlbigxNTApIHdpbGwgZG8uICAgICAgICAgICAgICAgICAgICAgICovCisKK2RpZmZlcmVuKE4pIDotIHN0YXRpc3RpY3MocnVudGltZSxbWHxfXSksCisgICAgICAgICAgZGlmZmVyZW5sb29wKE4pLAorICAgICAgICAgIHN0YXRpc3RpY3MocnVudGltZSxbTm93fF9dKSwKKyAgICAgICAgICBjb21wZW5zX2xvb3AoTiksCisgICAgICAgICAgc3RhdGlzdGljcyhydW50aW1lLFtNfF9dKSwKKyAgICAgICAgICBMaSBpcyA3MSAqIE4sCisgICAgICAgICAgcHJpbnRfdGltZXMoZGlmZmVyZW4oTiksWCxOb3csTSxMaSkuCisKK2RpZmZlcmVubG9vcCgwKS4KK2RpZmZlcmVubG9vcChYKSA6LSBcKyBcKyhkaWZmZXJlbl90b3ApLCBZIGlzIFggLSAxLCBkaWZmZXJlbmxvb3AoWSkuCisKK2RpZmZlcmVuX3RvcDotCisgICAgICAgIHRpbWVzMTAoSTEpLAorICAgICAgICBkKEkxLHgsRDEpLAorICAgICAgICBkaXZpZGUxMChJMiksCisgICAgICAgIGQoSTIseCxEMiksCisgICAgICAgIGxvZzEwKEkzKSwKKyAgICAgICAgZChJMyx4LEQzKSwKKyAgICAgICAgb3BzOChJNCksCisgICAgICAgIGQoSTQseCxENCkuCisKK2QoVStWLFgsRFUrRFYpIDotICEsIGQoVSxYLERVKSwgZChWLFgsRFYpLgorZChVLVYsWCxEVS1EVikgOi0gISwgZChVLFgsRFUpLCBkKFYsWCxEVikuCitkKFUqVixYLERVKlYrVSpEVikgOi0gISwgZChVLFgsRFUpLCBkKFYsWCxEVikuCitkKFUvVixYLChEVSpWLVUqRFYpLyheKFYsMikpKSA6LSAhLCBkKFUsWCxEVSksIGQoVixYLERWKS4KK2QoXihVLE4pLFgsRFUqTiooXihVLE4xKSkpIDotICEsIGludGVnZXIoTiksIE4xIGlzIE4gLSAxLCBkKFUsWCxEVSkuCitkKC1VLFgsLURVKSA6LSAhLCBkKFUsWCxEVSkuCitkKGV4cChVKSxYLGV4cChVKSpEVSkgOi0gISwgZChVLFgsRFUpLgorZChsb2coVSksWCxEVS9VKSA6LSAhLCBkKFUsWCxEVSkuCitkKFgsWCwxKS4KK2QoQyxYLDApLgorCit0aW1lczEwKCAoKCgoKCgoKHgqeCkqeCkqeCkqeCkqeCkqeCkqeCkqeCkqeCApLgorZGl2aWRlMTAoICgoKCgoKCgoeC94KS94KS94KS94KS94KS94KS94KS94KS94ICkuCitsb2cxMCggbG9nKGxvZyhsb2cobG9nKGxvZyhsb2cobG9nKGxvZyhsb2cobG9nKHgpKSkpKSkpKSkpICkuCitvcHM4KCAoeCsxKSooKF4oeCwyKSsyKSooXih4LDMpKzMpKSApLgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICBEaWZmZXJlbmNlIExpc3RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgcXVpY2tzb3J0IG9uIDUwIGl0ZW1zIChkaWZmZXJlbmNlIGxpc3RzKSAgICAgICovCisKK2RpZmYoTikgOi0gbGlzdDUwKEwpLAorICAgICAgICAgIHN0YXRpc3RpY3MocnVudGltZSxbWHxfXSksCisgICAgICAgICAgZGlmZmxpc3Rsb29wKE4sTCksCisgICAgICAgICAgc3RhdGlzdGljcyhydW50aW1lLFtOb3d8X10pLAorICAgICAgICAgIGNvbXBlbnNfbG9vcChOKSwKKyAgICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW018X10pLAorICAgICAgICAgIExpIGlzIDYwOCAqIE4sCisgICAgICAgICAgcHJpbnRfdGltZXMoZGlmZihOKSxYLE5vdyxNLExpKS4KKworZGlmZmxpc3Rsb29wKDAsXykuCitkaWZmbGlzdGxvb3AoWCxMKSA6LSBxZHNvcnQoTCxaKSwgWSBpcyBYIC0gMSwgZGlmZmxpc3Rsb29wKFksTCkuCisKK3Fkc29ydChbWHxMXSxSLVIwKSA6LQorICAgICAgICBkcGFydGl0aW9uKEwsWCxMMSxMMiksCisgICAgICAgIHFkc29ydChMMSxSLVtYfFIxXSksCisgICAgICAgIHFkc29ydChMMixSMS1SMCkuCitxZHNvcnQoW10sUjAtUjApLgorCitkcGFydGl0aW9uKFtYfExdLFksW1h8TDFdLEwyKSA6LQorICAgICAgICBYPFksICEsCisgICAgICAgIGRwYXJ0aXRpb24oTCxZLEwxLEwyKS4KK2RwYXJ0aXRpb24oW1h8TF0sWSxMMSxbWHxMMl0pIDotCisgICAgICAgIGRwYXJ0aXRpb24oTCxZLEwxLEwyKS4KK2RwYXJ0aXRpb24oW10sXyxbXSxbXSkuCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgTmFpdmUgcmV2ZXJzZSBmb3IgdmFyaWFibGUgbGVuZ3RoIGxpc3RzLi4uICAgICAgICAqLworLyogIHRyeSB3aXRoIDEwLCAzMCwgNTAsIDEwMCwgMTUwLCAyMDAuICAgICAgICAgICAgICAgKi8KKworbnJldihYKSA6LSAKKyAgICAgICAgY29uc2xpc3QoWCwgTGlzdCksCisgICAgICAgIHN0YXRpc3RpY3MocnVudGltZSxbVDF8X10pLAorICAgICAgICBucmV2ZXJzZShMaXN0LCBfKSwKKyAgICAgICAgc3RhdGlzdGljcyhydW50aW1lLFtUMnxfXSksCisgICAgICAgIEkgaXMgKFgqKFgrMykpLzIgKyAxLAorCXByaW50X3RpbWVzKG5yZXYoWCksVDEsVDIsVDIsSSkuCisKK25yZXY6LSB3cml0ZSgnbGlzdCBsZW5ndGg6ICcpLAorICAgICAgICByZWFkKFgpLAorICAgICAgICBjb25zbGlzdChYLCBMaXN0KSwKKyAgICAgICAgc3RhdGlzdGljcyhydW50aW1lLFtUMXxfXSksCisgICAgICAgIG5yZXZlcnNlKExpc3QsIF8pLAorICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsW1QyfF9dKSwKKyAgICAgICAgVCBpcyBUMiAtIFQxLAorICAgICAgICBJIGlzIChYKihYKzMpKS8yICsgMSwKKyAgICAgICAgTElQUyBpcyBJL1QsCisgICAgICAgIHdyaXRlKCdMSVBTPSAnKSwKKyAgICAgICAgd3JpdGUoTElQUykuCisKK25yZXZlcnNlKFtdLCBbXSkuCitucmV2ZXJzZShbWHxMMF0sTCkgOi0gbnJldmVyc2UoTDAsIEwxKSwKKyAgICBjb25jYXRlbmF0ZShMMSwgW1hdLCBMKS4KKworY29uY2F0ZW5hdGUoW10sIEwsIEwpLgorY29uY2F0ZW5hdGUoW1h8TDFdLCBMMiwgW1h8TDNdKSA6LSBjb25jYXRlbmF0ZShMMSwgTDIsIEwzKS4KKworY29uc2xpc3QoMCwgW10pIDotICEuCitjb25zbGlzdChOLCBbTnxMXSkgOi0KKyAgICAgICAgTjEgaXMgTi0xLAorICAgICAgICBjb25zbGlzdChOMSwgTCkuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9NYWtlZmlsZSBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmODY1YjQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9NYWtlZmlsZQpAQCAtMCwwICsxLDk4IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICBNYWtlZmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworUExDQUZFICAgICAgID0gcGxjYWZlCitQTENBRkVPUFRTICAgPQorCitQTEpBUiAgICAgICAgPSBwbGphcgorUExKQVJPUFRTICAgID0gLXYKKworU0lDU1RVUyAgICAgID0gL3Vzci9sb2NhbC9iaW4vc2ljc3R1cworU0lDU1RVU09QVFMgID0gCisKK1NXSSAgICAgICAgICA9IC9vcHQvbG9jYWwvYmluL3N3aXBsCitTV0lPUFRTICAgICAgPSAtTDEwMG0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAucWwgLnFsZiAuamFyIC5wbCAuc2ljc3R1cyAuc3dpIC5wbGNhZmUgLmluICQoU1VGRklYRVMpCisKK3BsY2FmZTogY29tcF9wbGNhZmUgcnVuX3BsY2FmZQorCitzaWNzdHVzOiBjb21wX3NpY3N0dXMgcnVuX3NpY3N0dXMKKworc3dpOiBjb21wX3N3aSBydW5fc3dpCisKK2FsbDogY29tcCBydW4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBydW4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3BsY2FmZV9vdXRfb2JqZWN0cyAgOj0gJChwYXRzdWJzdCAlLmluLCUucGxjYWZlLCAkKHdpbGRjYXJkICouaW4pKQorc2ljc3R1c19vdXRfb2JqZWN0cyA6PSAkKHBhdHN1YnN0ICUuaW4sJS5zaWNzdHVzLCQod2lsZGNhcmQgKi5pbikpCitzd2lfb3V0X29iamVjdHMgICAgIDo9ICQocGF0c3Vic3QgJS5pbiwlLnN3aSwgICAgJCh3aWxkY2FyZCAqLmluKSkKKworLmluLnBsY2FmZToKKwktcm0gLWYgb3V0LyRACisJL2Jpbi9lY2hvICJbJyQ8J10sIGhhbHQuIiBcCisJfCAkKFBMQ0FGRSkgJChQTENBRkVPUFRTKSAtY3AgJCouamFyOmJlbmNoX3V0aWwuamFyID4gb3V0LyRACisKKy5pbi5zaWNzdHVzOgorCS1ybSAtZiBvdXQvJEAKKwkvYmluL2VjaG8gImVuc3VyZV9sb2FkZWQoJCopLCBlbnN1cmVfbG9hZGVkKGJlbmNoX3V0aWwpLCBbJyQ8J10sIGhhbHQuIiBcCisJfCAkKFNJQ1NUVVMpICQoU0lDU1RVU09QVFMpID4gb3V0LyRACisKKy5pbi5zd2k6CisJLXJtIC1mIG91dC8kQAorCS9iaW4vZWNobyAiZW5zdXJlX2xvYWRlZCgkKiksIGVuc3VyZV9sb2FkZWQoYmVuY2hfdXRpbCksIFsnJDwnXSwgaGFsdC4iIFwKKwl8ICQoU1dJKSAkKFNXSU9QVFMpID4gb3V0LyRACisKK3J1bjogcnVuX3BsY2FmZSBydW5fc2ljc3R1cyBydW5fc3dpCisKK3J1bl9wbGNhZmU6ICQocGxjYWZlX291dF9vYmplY3RzKQorCitydW5fc2ljc3R1czogJChzaWNzdHVzX291dF9vYmplY3RzKQorCitydW5fc3dpOiAkKHN3aV9vdXRfb2JqZWN0cykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBjb21waWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitqYXJfb2JqZWN0cyA6PSAkKHBhdHN1YnN0ICUucGwsJS5qYXIsJCh3aWxkY2FyZCAqLnBsKSkKK3FsX29iamVjdHMgIDo9ICQocGF0c3Vic3QgJS5wbCwlLnFsLCAkKHdpbGRjYXJkICoucGwpKQorcWxmX29iamVjdHMgOj0gJChwYXRzdWJzdCAlLnBsLCUucWxmLCQod2lsZGNhcmQgKi5wbCkpCisKKy5wbC5qYXI6CisJJChQTEpBUikgJChQTEpBUk9QVFMpICRAICQ8CisJLXJtIC1mIC1yICQqCisKKy5wbC5xbDoKKwkvYmluL2VjaG8gIlskKl0sIGZjb21waWxlKCQqKSwgaGFsdC4iIHwgJChTSUNTVFVTKSAkKFNJQ1NUVVNPUFRTKQorCisucGwucWxmOgorCS9iaW4vZWNobyAicWNvbXBpbGUoJCopLCBoYWx0LiIgfCAkKFNXSSkgJChTV0lPUFRTKQorIwkvYmluL2VjaG8gIlskKl0sIHFjb21waWxlKCQqKSwgaGFsdC4iIHwgJChTV0kpICQoU1dJT1BUUykKKworY29tcDogY29tcF9wbGNhZmUgY29tcF9zaWNzdHVzIGNvbXBfc3dpCisKK2NvbXBfcGxjYWZlOiAkKGphcl9vYmplY3RzKQorCitjb21wX3NpY3N0dXM6ICQocWxfb2JqZWN0cykKKworY29tcF9zd2k6ICQocWxmX29iamVjdHMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgY2xlYW4gdXAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2NsZWFuOgorCS1ybSAtZiBjb3JlICp+CisJLXJtIC1mIC9vdXQvY29yZSBvdXQvKn4KKwktcm0gLWYgKi5xbAorCS1ybSAtZiAqLnFsZgorCityZWFsY2xlYW46IGNsZWFuCisJLXJtIC1mICouamFyICouY2xhc3MKKwktcm0gLWYgb3V0LyoucGxjYWZlIG91dC8qLnNpY3N0dXMgb3V0Lyouc3dpCisKKyMgRU5ECisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL1JFQURNRSBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2RjM2M3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvUkVBRE1FCkBAIC0wLDAgKzEsNDggQEAKKworVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBiZW5jaG1hcmtzIHRoYXQgd2VyZSB1c2VkIGluIHRoZSBwYXBlcnM6CisKKyAgIkZhc3QgUHJvbG9nIHdpdGggYW4gRXh0ZW5kZWQgR2VuZXJhbCBQdXJwb3NlIEFyY2hpdGVjdHVyZSIsIGJ5IEJydWNlIEhvbG1lcgorICBldCBhbCAoaG9sbWVyQGVybmllLmJlcmtlbGV5LmVkdSksIDE3dGggSW50ZXJuYXRpb25hbCBTeW1wb3NpdW0gb24gQ29tcHV0ZXIKKyAgQXJjaGl0ZWN0dXJlLCBNYXkgMTk5MC4KKworICAiVGhlIEJlbmVmaXRzIG9mIEdsb2JhbCBEYXRhZmxvdyBBbmFseXNpcyBmb3IgYW4gT3B0aW1pemluZyBQcm9sb2cgQ29tcGlsZXIiLAorICBieSBQZXRlciBWYW4gUm95ICh2YW5yb3lAZXJuaWUuYmVya2VsZXkuZWR1KSBhbmQgQWx2aW4gRGVzcGFpbiwgMTk5MCBOb3J0aAorICBBbWVyaWNhbiBDb25mZXJlbmNlIG9uIExvZ2ljIFByb2dyYW1taW5nLCBPY3RvYmVyIDE5OTAuCisKK1RoZSBwYWNrYWdlIGNvbnRhaW5zIDI2IHByb2dyYW1zLCBncm91cGVkIGludG8gInNtYWxsIiBhbmQgImxhcmdlIi4gIEFsbAorcHJvZ3JhbSBzaXplcyBhcmUgaW4gbGluZXMgb2YgY29kZSBleGNsdWRpbmcgY29tbWVudHMuICBUaGUgcHJvZ3JhbXMgaGF2ZSBiZWVuCitydW4gb24gUXVpbnR1cyBQcm9sb2csIEMtUHJvbG9nLCBhbmQgQXF1YXJpdXMgUHJvbG9nLCBhIG5ldyBzeXN0ZW0gdW5kZXIKK2RldmVsb3BtZW50IGF0IEJlcmtlbGV5LiAgVGhlIHByb2dyYW1zIGFyZSB0byBiZSBydW4gYXMgaXMsIHdpdGggYWxsIGJ1aWx0LWluCitwcmVkaWNhdGVzICppbmNsdWRpbmcqIHdyaXRlLzEgYW5kIG5sLzAuCisKK1NtYWxsIFByb2dyYW0JIFNpemUJRGVzY3JpcHRpb24KKworbnJldmVyc2UucGwJICAxMAlOYWl2ZSByZXZlcnNlIG9mIGEgMzAtZWxlbWVudCBsaXN0LgordGFrLnBsCQkgIDE1CVJlY3Vyc2l2ZSBpbnRlZ2VyIGFyaXRobWV0aWMuCitxc29ydC5wbAkgIDE5CVF1aWNrc29ydCBvZiBhIDUwLWVsZW1lbnQgbGlzdC4KK2xvZzEwLnBsCSAgMjcJU3ltYm9saWMgZGlmZmVyZW50aWF0aW9uLgorb3BzOC5wbAkgIAkgIDI3CVN5bWJvbGljIGRpZmZlcmVudGlhdGlvbi4KK3RpbWVzMTAucGwJICAyNwlTeW1ib2xpYyBkaWZmZXJlbnRpYXRpb24uCitkaXZpZGUxMC5wbAkgIDI3CVN5bWJvbGljIGRpZmZlcmVudGlhdGlvbi4KK3NlcmlhbGlzZS5wbAkgIDI5CUNhbGN1bGF0ZSBzZXJpYWwgbnVtYmVycyBvZiBhIGxpc3QuCitxdWVlbnNfOC5wbAkgIDMxCVNvbHZlIHRoZSBlaWdodCBxdWVlbnMgcHV6emxlLgorbXUucGwJCSAgMzMJUHJvdmUgYSB0aGVvcmVtIG9mIEhvZnN0YWR0ZXIncyAibXUtbWF0aCIuCit6ZWJyYS5wbAkgIDM2CUEgbG9naWNhbCBwdXp6bGUgYmFzZWQgb24gY29uc3RyYWludHMuCitmYXN0X211LnBsCSAgNTQJQW4gb3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIG11LW1hdGggcHJvdmVyLgorcXVlcnkucGwJICA2OAlRdWVyeSBhIHN0YXRpYyBkYXRhYmFzZSAodXNpbmcgaW50ZWdlciBhcml0aG1ldGljKS4KK3BvbHlfMTAucGwJICA4NglTeW1ib2xpY2FsbHkgcmFpc2UgYSBwb2x5bm9taWFsIHRvIHRoZSB0ZW50aCBwb3dlci4KKworTGFyZ2UgUHJvZ3JhbQkgU2l6ZQlEZXNjcmlwdGlvbgorCitjcnlwdC5wbAkgIDY0CVNvbHZlIGEgc2ltcGxlIGNyeXB0YXJpdGhtZXRpYyBwdXp6bGUuCittZXRhX3Fzb3J0LnBsCSAgNzQJQSBtZXRhLWludGVycHJldGVyIHJ1bm5pbmcgcXNvcnQuCitwcm92ZXIucGwJICA4MQlBIHNpbXBsZSB0aGVvcmVtIHByb3Zlci4KK2Jyb3dzZS5wbAkgIDkyCUJ1aWxkIGFuZCBxdWVyeSBhIGRhdGFiYXNlLgordW5pZnkucGwJIDEyNQlBIGNvbXBpbGVyIGNvZGUgZ2VuZXJhdG9yIGZvciB1bmlmaWNhdGlvbi4KK2ZsYXR0ZW4ucGwJIDE1OAlTb3VyY2UgdHJhbnNmb3JtYXRpb24gdG8gcmVtb3ZlIGRpc2p1bmN0aW9ucy4KK3NkZGEucGwJIAkgMjczCUEgZGF0YWZsb3cgYW5hbHl6ZXIgdGhhdCByZXByZXNlbnRzIGFsaWFzaW5nLgorcmVkdWNlci5wbAkgMzAxCUEgZ3JhcGggcmVkdWNlciBiYXNlZCBvbiBjb21iaW5hdG9ycy4KK2JveWVyLnBsCSAzNzcJQW4gZXh0cmFjdCBmcm9tIGEgQm95ZXItTW9vcmUgdGhlb3JlbSBwcm92ZXIuCitzaW1wbGVfYW5hbHl6ZXIucGwgNDQzCUEgZGF0YWZsb3cgYW5hbHl6ZXIgYW5hbHl6aW5nIHFzb3J0LgorbmFuZC5wbAkJIDQ5MwlBIGxvZ2ljIHN5bnRoZXNpcyBwcm9ncmFtIGJhc2VkIG9uIGhldXJpc3RpYyBzZWFyY2guCitjaGF0X3BhcnNlci5wbAkxMTM4CVBhcnNlIGEgc2V0IG9mIEVuZ2xpc2ggc2VudGVuY2VzLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvYmVuY2hfdXRpbC5wbCBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL2JlbmNoX3V0aWwucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5MDk2MgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL2JlbmNoX3V0aWwucGwKQEAgLTAsMCArMSw0NyBAQAorJSAgIEZpbGUgICA6IGJlbmNoX3V0aWwucGwKKyUgICBBdXRob3JzOiBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCislICAgVXBkYXRlZDogMjQgRmVicnVhcnkgMjAwOAorJSAgIFB1cnBvc2U6IEJlbmNobWFyayB1dGlsaXRpZXMKKyUgICBOb3RlICAgOiBiYXNlZCBvbiBkcml2ZXIucGwgaW4gUGVyZWlyYSdzIGJlbmNobWFyaworCisnJGdldF9jcHVfdGltZScoVCkgOi0gc3RhdGlzdGljcyhydW50aW1lLCBbVCxfXSkuCisKKyckcmVwb3J0JyhOYW1lLCBOLCBUMCwgVDEsIFQyKSA6LQorICAgICAgICBUZXN0VGltZSBpcyBUMS1UMCwKKyAgICAgICAgT3ZlckhlYWQgaXMgVDItVDEsCisJVGltZSBpcyBUZXN0VGltZS1PdmVySGVhZCwKKyAgICAgICAgQXZlcmFnZSBpcyBUaW1lL04sCisJbmwsCisJd3JpdGUoJyMgTmFtZTogJyksIHdyaXRlKE5hbWUpLCBubCwKKyAgICAgICAgd3JpdGUoJyMgSXRlcmF0aW9uczogJyksIHdyaXRlKE4pLCBubCwKKwl3cml0ZSgnIyBUZXN0VGltZTogJyksIHdyaXRlKFRlc3RUaW1lKSwgd3JpdGUoJyBtc2VjLlxuJyksCisJd3JpdGUoJyMgT3ZlckhlYWQ6ICcpLCB3cml0ZShPdmVySGVhZCksIHdyaXRlKCcgbXNlYy5cbicpLAorCXdyaXRlKCcjIFRlc3RUaW1lLU92ZXJIZWFkOiAnKSwgd3JpdGUoVGltZSksIHdyaXRlKCcgbXNlYy5cbicpLAorCXdyaXRlKCcjIChUZXN0VGltZS1PdmVySGVhZCkvSXRlcmF0aW9uczogJyksIHdyaXRlKEF2ZXJhZ2UpLCB3cml0ZSgnIG1zZWMuXG4nKSwKKwknJHJlcG9ydF9jc3YnKFsnIyMjQ1NWIyMjJyxOYW1lLE4sVGVzdFRpbWUsT3ZlckhlYWQsVGltZSxBdmVyYWdlXSwgJywnKSwKKwlubC4KKworJyRyZXBvcnRfY3N2JyhbXSwgXykgOi0gIS4KKyckcmVwb3J0X2NzdicoW1hdLCBfKSA6LSAhLCB3cml0ZShYKSwgbmwuCisnJHJlcG9ydF9jc3YnKFtYfFhzXSwgRGVsaW0pIDotIHdyaXRlKFgpLCB3cml0ZShEZWxpbSksICckcmVwb3J0X2NzdicoWHMsIERlbGltKS4KKworJyRiZW5jaG1hcmsnKE5hbWUsIEl0ZXJhdGlvbnMsIEFjdGlvbiwgQ29udHJvbCkgOi0gCisgICAgICAgICckZ2V0X2NwdV90aW1lJyhUMCksCisgICAgICAgICggICAnJHJlcGVhdCcoSXRlcmF0aW9ucyksIG9uY2UoQWN0aW9uKSwgZmFpbAorICAgICAgICA7ICAgJyRnZXRfY3B1X3RpbWUnKFQxKQorICAgICAgICApLAorICAgICAgICAoICAgJyRyZXBlYXQnKEl0ZXJhdGlvbnMpLCBvbmNlKENvbnRyb2wpLCBmYWlsCisgICAgICAgIDsgICAnJGdldF9jcHVfdGltZScoVDIpCisgICAgICAgICksCisgICAgICAgICckcmVwb3J0JyhOYW1lLCBJdGVyYXRpb25zLCBUMCwgVDEsIFQyKS4KKworJyRyZXBlYXQnKE4pIDotIE4gPiAwLCAnJGZyb20nKDEsIE4pLgorCisnJGZyb20nKEksIEkpIDotICEuCisnJGZyb20nKEwsIFUpIDotIE0gaXMgKEwrVSk+PjEsICAgJyRmcm9tJyhMLCBNKS4KKyckZnJvbScoTCwgVSkgOi0gTSBpcyAoTCtVKT4+MSsxLCAnJGZyb20nKE0sIFUpLgorCisnJGR1bW15Jy4KKyckZHVtbXknKF8pLgorJyRkdW1teScoXywgXykuCisnJGR1bW15JyhfLCBfLCBfKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL2JveWVyLmluIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvYm95ZXIuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgwYTAxNwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL2JveWVyLmluCkBAIC0wLDAgKzEgQEAKKzotICckYmVuY2htYXJrJyhib3llciwgMTAwMCwgbWFpbiwgJyRkdW1teScpLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvYm95ZXIucGwgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9ib3llci5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmMwZmVjCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvYm95ZXIucGwKQEAgLTAsMCArMSwzOTEgQEAKKy8qIENIQU5HRUxPRyBieSBNLkJhbmJhcmEKKyAgIC0gcmVuYW1lIHBsdXMvMyB0byBteV9wbHVzLzMKKyovCisKKyUgZ2VuZXJhdGVkOiAyMCBOb3ZlbWJlciAxOTg5CislIG9wdGlvbihzKTogCislCislICAgYm95ZXIKKyUKKyUgICBFdmFuIFRpY2sgKGZyb20gTGlzcCB2ZXJzaW9uIGJ5IFIuIFAuIEdhYnJpZWwpCislCislICAgTm92ZW1iZXIgMTk4NQorJQorJSAgIHByb3ZlIGFyaXRobWV0aWMgdGhlb3JlbQorCittYWluIDotIHdmZihXZmYpLAorCXJld3JpdGUoV2ZmLE5ld1dmZiksCisJdGF1dG9sb2d5KE5ld1dmZixbXSxbXSkuCisKK3dmZihpbXBsaWVzKGFuZChpbXBsaWVzKFgsWSksCisgICAgICAgICAgICAgICAgYW5kKGltcGxpZXMoWSxaKSwKKyAgICAgICAgICAgICAgICAgICAgYW5kKGltcGxpZXMoWixVKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpZXMoVSxXKSkpKSwKKyAgICAgICAgICAgIGltcGxpZXMoWCxXKSkpIDotCisgICAgICAgIFggPSBmKHBsdXMocGx1cyhhLGIpLHBsdXMoYyx6ZXJvKSkpLAorICAgICAgICBZID0gZih0aW1lcyh0aW1lcyhhLGIpLHBsdXMoYyxkKSkpLAorICAgICAgICBaID0gZihyZXZlcnNlKGFwcGVuZChhcHBlbmQoYSxiKSxbXSkpKSwKKyAgICAgICAgVSA9IGVxdWFsKHBsdXMoYSxiKSxkaWZmZXJlbmNlKHgseSkpLAorICAgICAgICBXID0gbGVzc3AocmVtYWluZGVyKGEsYiksbWVtYmVyKGEsbGVuZ3RoKGIpKSkuCisKK3RhdXRvbG9neShXZmYpIDotCisgICAgICAgIHdyaXRlKCdyZXdyaXRpbmcuLi4nKSxubCwKKyAgICAgICAgcmV3cml0ZShXZmYsTmV3V2ZmKSwKKyAgICAgICAgd3JpdGUoJ3Byb3ZpbmcuLi4nKSxubCwKKyAgICAgICAgdGF1dG9sb2d5KE5ld1dmZixbXSxbXSkuCisKK3RhdXRvbG9neShXZmYsVGxpc3QsRmxpc3QpIDotCisgICAgICAgICh0cnVlcChXZmYsVGxpc3QpIC0+IHRydWUKKyAgICAgICAgO2ZhbHNlcChXZmYsRmxpc3QpIC0+IGZhaWwKKyAgICAgICAgO1dmZiA9IGlmKElmLFRoZW4sRWxzZSkgLT4KKwkJKHRydWVwKElmLFRsaXN0KSAtPiB0YXV0b2xvZ3koVGhlbixUbGlzdCxGbGlzdCkKKwkJO2ZhbHNlcChJZixGbGlzdCkgLT4gdGF1dG9sb2d5KEVsc2UsVGxpc3QsRmxpc3QpCisJCTt0YXV0b2xvZ3koVGhlbixbSWZ8VGxpc3RdLEZsaXN0KSwJJSBib3RoIG11c3QgaG9sZAorCQkgdGF1dG9sb2d5KEVsc2UsVGxpc3QsW0lmfEZsaXN0XSkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICksIS4KKworcmV3cml0ZShBdG9tLEF0b20pIDotCisgICAgICAgIGF0b21pYyhBdG9tKSwhLgorcmV3cml0ZShPbGQsTmV3KSA6LQorICAgICAgICBmdW5jdG9yKE9sZCxGLE4pLAorICAgICAgICBmdW5jdG9yKE1pZCxGLE4pLAorICAgICAgICByZXdyaXRlX2FyZ3MoTixPbGQsTWlkKSwKKyAgICAgICAgKCBlcXVhbChNaWQsTmV4dCksICAgICAgICAlIHNob3VsZCBiZSAtPiwgYnV0IGlzIGNvbXBpbGVyIHNtYXJ0CisgICAgICAgICAgcmV3cml0ZShOZXh0LE5ldykgICAgICAgJSBlbm91Z2ggdG8gZ2VuZXJhdGUgY3V0IGZvciAtPiA/CisgICAgICAgIDsgTmV3PU1pZAorICAgICAgICApLCEuCisKK3Jld3JpdGVfYXJncygwLF8sXykgOi0gIS4KK3Jld3JpdGVfYXJncyhOLE9sZCxNaWQpIDotIAorICAgICAgICBhcmcoTixPbGQsT2xkQXJnKSwKKyAgICAgICAgYXJnKE4sTWlkLE1pZEFyZyksCisgICAgICAgIHJld3JpdGUoT2xkQXJnLE1pZEFyZyksCisgICAgICAgIE4xIGlzIE4tMSwKKyAgICAgICAgcmV3cml0ZV9hcmdzKE4xLE9sZCxNaWQpLgorCit0cnVlcCh0LF8pIDotICEuCit0cnVlcChXZmYsVGxpc3QpIDotIG1lbWJlcihXZmYsVGxpc3QpLgorCitmYWxzZXAoZixfKSA6LSAhLgorZmFsc2VwKFdmZixGbGlzdCkgOi0gbWVtYmVyKFdmZixGbGlzdCkuCisKK21lbWJlcihYLFtYfF9dKSA6LSAhLgorbWVtYmVyKFgsW198VF0pIDotIG1lbWJlcihYLFQpLgorCisKK2VxdWFsKCAgYW5kKFAsUSksCisgICAgICAgIGlmKFAsaWYoUSx0LGYpLGYpCisgICAgICAgICkuCitlcXVhbCggIGFwcGVuZChhcHBlbmQoWCxZKSxaKSwKKyAgICAgICAgYXBwZW5kKFgsYXBwZW5kKFksWikpCisgICAgICAgICkuCitlcXVhbCggIGFzc2lnbm1lbnQoWCxhcHBlbmQoQSxCKSksCisgICAgICAgIGlmKGFzc2lnbmVkcChYLEEpLAorICAgICAgICAgICBhc3NpZ25tZW50KFgsQSksCisgICAgICAgICAgIGFzc2lnbm1lbnQoWCxCKSkKKyAgICAgICAgKS4KK2VxdWFsKCAgYXNzdW1lX2ZhbHNlKFZhcixBbGlzdCksCisgICAgICAgIGNvbnMoY29ucyhWYXIsZiksQWxpc3QpCisgICAgICAgICkuCitlcXVhbCggIGFzc3VtZV90cnVlKFZhcixBbGlzdCksCisgICAgICAgIGNvbnMoY29ucyhWYXIsdCksQWxpc3QpCisgICAgICAgICkuCitlcXVhbCggIGJvb2xlYW4oWCksCisgICAgICAgIG9yKGVxdWFsKFgsdCksZXF1YWwoWCxmKSkKKyAgICAgICAgKS4KK2VxdWFsKCAgY2FyKGdvcGhlcihYKSksCisgICAgICAgIGlmKGxpc3RwKFgpLAorICAgICAgICBjYXIoZmxhdHRlbihYKSksCisgICAgICAgIHplcm8pCisgICAgICAgICkuCitlcXVhbCggIGNvbXBpbGUoRm9ybSksCisgICAgICAgIHJldmVyc2UoY29kZWdlbihvcHRpbWl6ZShGb3JtKSxbXSkpCisgICAgICAgICkuCitlcXVhbCggIGNvdW50X2xpc3QoWixzb3J0X2xwKFgsWSkpLAorICAgICAgICBwbHVzKGNvdW50X2xpc3QoWixYKSwKKyAgICAgICAgICAgICBjb3VudF9saXN0KFosWSkpCisgICAgICAgICkuCitlcXVhbCggIGNvdW50cHNfKEwsUHJlZCksCisgICAgICAgIGNvdW50cHNfbG9vcChMLFByZWQsemVybykKKyAgICAgICAgKS4KK2VxdWFsKCAgZGlmZmVyZW5jZShBLEIpLAorICAgICAgICBDCisgICAgICAgICkgOi0gZGlmZmVyZW5jZShBLEIsQykuCitlcXVhbCggIGRpdmlkZXMoWCxZKSwKKyAgICAgICAgemVyb3AocmVtYWluZGVyKFksWCkpCisgICAgICAgICkuCitlcXVhbCggIGRzb3J0KFgpLAorICAgICAgICBzb3J0MihYKQorICAgICAgICApLgorZXF1YWwoICBlcXAoWCxZKSwKKyAgICAgICAgZXF1YWwoZml4KFgpLGZpeChZKSkKKyAgICAgICAgKS4KK2VxdWFsKCAgZXF1YWwoQSxCKSwKKyAgICAgICAgQworICAgICAgICApIDotIGVxKEEsQixDKS4KK2VxdWFsKCAgZXZlbjEoWCksCisgICAgICAgIGlmKHplcm9wKFgpLHQsb2RkKGRlY3IoWCkpKQorICAgICAgICApLgorZXF1YWwoICBleGVjKGFwcGVuZChYLFkpLFBkcyxFbnZybiksCisgICAgICAgIGV4ZWMoWSxleGVjKFgsUGRzLEVudnJuKSxFbnZybikKKyAgICAgICAgKS4KK2VxdWFsKCAgZXhwKEEsQiksCisgICAgICAgIEMKKyAgICAgICAgKSA6LSBleHAoQSxCLEMpLgorZXF1YWwoICBmYWN0XyhJKSwKKyAgICAgICAgZmFjdF9sb29wKEksMSkKKyAgICAgICAgKS4KK2VxdWFsKCAgZmFsc2lmeShYKSwKKyAgICAgICAgZmFsc2lmeTEobm9ybWFsaXplKFgpLFtdKQorICAgICAgICApLgorZXF1YWwoICBmaXgoWCksCisgICAgICAgIGlmKG51bWJlcnAoWCksWCx6ZXJvKQorICAgICAgICApLgorZXF1YWwoICBmbGF0dGVuKGNkcihnb3BoZXIoWCkpKSwKKyAgICAgICAgaWYobGlzdHAoWCksCisgICAgICAgICAgIGNkcihmbGF0dGVuKFgpKSwKKyAgICAgICAgICAgY29ucyh6ZXJvLFtdKSkKKyAgICAgICAgKS4KK2VxdWFsKCAgZ2NkKEEsQiksCisgICAgICAgIEMKKyAgICAgICAgKSA6LSBnY2QoQSxCLEMpLgorZXF1YWwoICBnZXQoSixzZXQoSSxWYWwsTWVtKSksCisgICAgICAgIGlmKGVxcChKLEkpLFZhbCxnZXQoSixNZW0pKQorICAgICAgICApLgorZXF1YWwoICBncmVhdGVyZXFwKFgsWSksCisgICAgICAgIG5vdChsZXNzcChYLFkpKQorICAgICAgICApLgorZXF1YWwoICBncmVhdGVyZXFwcihYLFkpLAorICAgICAgICBub3QobGVzc3AoWCxZKSkKKyAgICAgICAgKS4KK2VxdWFsKCAgZ3JlYXRlcnAoWCxZKSwKKyAgICAgICAgbGVzc3AoWSxYKQorICAgICAgICApLgorZXF1YWwoICBpZihpZihBLEIsQyksRCxFKSwKKyAgICAgICAgaWYoQSxpZihCLEQsRSksaWYoQyxELEUpKQorICAgICAgICApLgorZXF1YWwoICBpZmYoWCxZKSwKKyAgICAgICAgYW5kKGltcGxpZXMoWCxZKSxpbXBsaWVzKFksWCkpCisgICAgICAgICkuCitlcXVhbCggIGltcGxpZXMoUCxRKSwKKyAgICAgICAgaWYoUCxpZihRLHQsZiksdCkKKyAgICAgICAgKS4KK2VxdWFsKCAgbGFzdChhcHBlbmQoQSxCKSksCisgICAgICAgIGlmKGxpc3RwKEIpLAorICAgICAgICAgICBsYXN0KEIpLAorICAgICAgICAgICBpZihsaXN0cChBKSwKKyAgICAgICAgICAgICAgY29ucyhjYXIobGFzdChBKSkpLAorICAgICAgICAgICAgICBCKSkKKyAgICAgICAgKS4KK2VxdWFsKCAgbGVuZ3RoKEEpLAorICAgICAgICBCCisgICAgICAgICkgOi0gbXlsZW5ndGgoQSxCKS4KK2VxdWFsKCAgICAgICAgbGVzc2VxcChYLFkpLAorICAgICAgICBub3QobGVzc3AoWSxYKSkKKyAgICAgICAgKS4KK2VxdWFsKCAgbGVzc3AoQSxCKSwKKyAgICAgICAgQworICAgICAgICApIDotIGxlc3NwKEEsQixDKS4KK2VxdWFsKCAgbGlzdHAoZ29waGVyKFgpKSwKKyAgICAgICAgbGlzdHAoWCkKKyAgICAgICAgKS4KK2VxdWFsKCAgbWNfZmxhdHRlbihYLFkpLAorICAgICAgICBhcHBlbmQoZmxhdHRlbihYKSxZKQorICAgICAgICApLgorZXF1YWwoICBtZWFuaW5nKEEsQiksCisgICAgICAgIEMKKyAgICAgICAgKSA6LSBtZWFuaW5nKEEsQixDKS4KK2VxdWFsKCAgbWVtYmVyKEEsQiksCisgICAgICAgIEMKKyAgICAgICAgKSA6LSBteW1lbWJlcihBLEIsQykuCitlcXVhbCggIG5vdChQKSwKKyAgICAgICAgaWYoUCxmLHQpCisgICAgICAgICkuCitlcXVhbCggIG50aChBLEIpLAorICAgICAgICBDCisgICAgICAgICkgOi0gbnRoKEEsQixDKS4KK2VxdWFsKCAgbnVtYmVycChncmVhdGVzdF9mYWN0b3IoWCxZKSksCisgICAgICAgIG5vdChhbmQob3IoemVyb3AoWSksZXF1YWwoWSwxKSksCisgICAgICAgICAgICAgICAgbm90KG51bWJlcnAoWCkpKSkgICAgICAgICAgICAKKyAgICAgICAgKS4KK2VxdWFsKCAgb3IoUCxRKSwKKyAgICAgICAgaWYoUCx0LGlmKFEsdCxmKSxmKQorICAgICAgICApLgorZXF1YWwoICBwbHVzKEEsQiksCisgICAgICAgIEMKKyAgICAgICAgKSA6LSBteV9wbHVzKEEsQixDKS4KK2VxdWFsKCAgcG93ZXJfZXZhbChBLEIpLAorICAgICAgICBDCisgICAgICAgICkgOi0gcG93ZXJfZXZhbChBLEIsQykuCitlcXVhbCggIHByaW1lKFgpLAorICAgICAgICBhbmQobm90KHplcm9wKFgpKSwKKyAgICAgICAgICAgIGFuZChub3QoZXF1YWwoWCxhZGQxKHplcm8pKSksCisgICAgICAgICAgICAgICAgcHJpbWUxKFgsZGVjcihYKSkpKQorICAgICAgICApLgorZXF1YWwoICBwcmltZV9saXN0KGFwcGVuZChYLFkpKSwKKyAgICAgICAgYW5kKHByaW1lX2xpc3QoWCkscHJpbWVfbGlzdChZKSkKKyAgICAgICAgKS4KK2VxdWFsKCAgcXVvdGllbnQoQSxCKSwKKyAgICAgICAgQworICAgICAgICApIDotIHF1b3RpZW50KEEsQixDKS4KK2VxdWFsKCAgcmVtYWluZGVyKEEsQiksCisgICAgICAgIEMKKyAgICAgICAgKSA6LSByZW1haW5kZXIoQSxCLEMpLgorZXF1YWwoICByZXZlcnNlXyhYKSwKKyAgICAgICAgcmV2ZXJzZV9sb29wKFgsW10pCisgICAgICAgICkuCitlcXVhbCggIHJldmVyc2UoYXBwZW5kKEEsQikpLAorICAgICAgICBhcHBlbmQocmV2ZXJzZShCKSxyZXZlcnNlKEEpKQorICAgICAgICApLgorZXF1YWwoICByZXZlcnNlX2xvb3AoQSxCKSwKKyAgICAgICAgQworICAgICAgICApIDotIHJldmVyc2VfbG9vcChBLEIsQykuCitlcXVhbCggIHNhbWVmcmluZ2UoWCxZKSwKKyAgICAgICAgZXF1YWwoZmxhdHRlbihYKSxmbGF0dGVuKFkpKQorICAgICAgICApLgorZXF1YWwoICBzaWdtYSh6ZXJvLEkpLAorICAgICAgICBxdW90aWVudCh0aW1lcyhJLGFkZDEoSSkpLDIpCisgICAgICAgICkuCitlcXVhbCggIHNvcnQyKGRlbGV0ZShYLEwpKSwKKyAgICAgICAgZGVsZXRlKFgsc29ydDIoTCkpCisgICAgICAgICkuCitlcXVhbCggIHRhdXRvbG9neV9jaGVja2VyKFgpLAorICAgICAgICB0YXV0b2xvZ3lwKG5vcm1hbGl6ZShYKSxbXSkKKyAgICAgICAgKS4KK2VxdWFsKCAgdGltZXMoQSxCKSwKKyAgICAgICAgQworICAgICAgICApIDotIHRpbWVzKEEsQixDKS4KK2VxdWFsKCAgdGltZXNfbGlzdChhcHBlbmQoWCxZKSksCisgICAgICAgIHRpbWVzKHRpbWVzX2xpc3QoWCksdGltZXNfbGlzdChZKSkKKyAgICAgICAgKS4KK2VxdWFsKCAgdmFsdWUobm9ybWFsaXplKFgpLEEpLAorICAgICAgICB2YWx1ZShYLEEpCisgICAgICAgICkuCitlcXVhbCggIHplcm9wKFgpLAorICAgICAgICBvcihlcXVhbChYLHplcm8pLG5vdChudW1iZXJwKFgpKSkKKyAgICAgICAgKS4KKworZGlmZmVyZW5jZShYLCBYLCB6ZXJvKSA6LSAhLgorZGlmZmVyZW5jZShwbHVzKFgsWSksIFgsIGZpeChZKSkgOi0gIS4KK2RpZmZlcmVuY2UocGx1cyhZLFgpLCBYLCBmaXgoWSkpIDotICEuCitkaWZmZXJlbmNlKHBsdXMoWCxZKSwgcGx1cyhYLFopLCBkaWZmZXJlbmNlKFksWikpIDotICEuCitkaWZmZXJlbmNlKHBsdXMoQixwbHVzKEEsQykpLCBBLCBwbHVzKEIsQykpIDotICEuCitkaWZmZXJlbmNlKGFkZDEocGx1cyhZLFopKSwgWiwgYWRkMShZKSkgOi0gIS4KK2RpZmZlcmVuY2UoYWRkMShhZGQxKFgpKSwgMiwgZml4KFgpKS4KKworZXEocGx1cyhBLEIpLCB6ZXJvLCBhbmQoemVyb3AoQSksemVyb3AoQikpKSA6LSAhLgorZXEocGx1cyhBLEIpLCBwbHVzKEEsQyksIGVxdWFsKGZpeChCKSxmaXgoQykpKSA6LSAhLgorZXEoemVybywgZGlmZmVyZW5jZShYLFkpLG5vdChsZXNzcChZLFgpKSkgOi0gIS4KK2VxKFgsIGRpZmZlcmVuY2UoWCxZKSxhbmQobnVtYmVycChYKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kKG9yKGVxdWFsKFgsemVybyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvcChZKSkpKSkgOi0gIS4KK2VxKHRpbWVzKFgsWSksIHplcm8sIG9yKHplcm9wKFgpLHplcm9wKFkpKSkgOi0gIS4KK2VxKGFwcGVuZChBLEIpLCBhcHBlbmQoQSxDKSwgZXF1YWwoQixDKSkgOi0gIS4KK2VxKGZsYXR0ZW4oWCksIGNvbnMoWSxbXSksIGFuZChubGlzdHAoWCksZXF1YWwoWCxZKSkpIDotICEuCitlcShncmVhdGVzdF9mYWN0b3IoWCxZKSx6ZXJvLCBhbmQob3IoemVyb3AoWSksZXF1YWwoWSwxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWwoWCx6ZXJvKSkpIDotICEuCitlcShncmVhdGVzdF9mYWN0b3IoWCxfKSwxLCBlcXVhbChYLDEpKSA6LSAhLgorZXEoWiwgdGltZXMoVyxaKSwgYW5kKG51bWJlcnAoWiksCisgICAgICAgICAgICAgICAgICAgICAgb3IoZXF1YWwoWix6ZXJvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbChXLDEpKSkpIDotICEuCitlcShYLCB0aW1lcyhYLFkpLCBvcihlcXVhbChYLHplcm8pLAorICAgICAgICAgICAgICAgICAgICAgYW5kKG51bWJlcnAoWCksZXF1YWwoWSwxKSkpKSA6LSAhLgorZXEodGltZXMoQSxCKSwgMSwgYW5kKG5vdChlcXVhbChBLHplcm8pKSwKKyAgICAgICAgICAgICAgICAgICAgICBhbmQobm90KGVxdWFsKEIsemVybykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQobnVtYmVycChBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZChudW1iZXJwKEIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZChlcXVhbChkZWNyKEEpLHplcm8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbChkZWNyKEIpLHplcm8pKSkpKSkpIDotICEuCitlcShkaWZmZXJlbmNlKFgsWSksIGRpZmZlcmVuY2UoWixZKSxpZihsZXNzcChYLFkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90KGxlc3NwKFksWikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGVzc3AoWixZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdChsZXNzcChZLFgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFsKGZpeChYKSxmaXgoWikpKSkpIDotICEuCitlcShsZXNzcChYLFkpLCBaLCBpZihsZXNzcChYLFkpLAorICAgICAgICAgICAgICAgICAgICAgZXF1YWwodCxaKSwKKyAgICAgICAgICAgICAgICAgICAgIGVxdWFsKGYsWikpKS4KKworZXhwKEksIHBsdXMoSixLKSwgdGltZXMoZXhwKEksSiksZXhwKEksSykpKSA6LSAhLgorZXhwKEksIHRpbWVzKEosSyksIGV4cChleHAoSSxKKSxLKSkuCisKK2djZChYLCBZLCBnY2QoWSxYKSkgOi0gIS4KK2djZCh0aW1lcyhYLFopLCB0aW1lcyhZLFopLCB0aW1lcyhaLGdjZChYLFkpKSkuCisKK215bGVuZ3RoKHJldmVyc2UoWCksbGVuZ3RoKFgpKS4KK215bGVuZ3RoKGNvbnMoXyxjb25zKF8sY29ucyhfLGNvbnMoXyxjb25zKF8sY29ucyhfLFg3KSkpKSkpLAorICAgICAgICAgcGx1cyg2LGxlbmd0aChYNykpKS4KKworbGVzc3AocmVtYWluZGVyKF8sWSksIFksIG5vdCh6ZXJvcChZKSkpIDotICEuCitsZXNzcChxdW90aWVudChJLEopLCBJLCBhbmQobm90KHplcm9wKEkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcih6ZXJvcChKKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QoZXF1YWwoSiwxKSkpKSkgOi0gIS4KK2xlc3NwKHJlbWFpbmRlcihYLFkpLCBYLCBhbmQobm90KHplcm9wKFkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kKG5vdCh6ZXJvcChYKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QobGVzc3AoWCxZKSkpKSkgOi0gIS4KK2xlc3NwKHBsdXMoWCxZKSwgcGx1cyhYLFopLCBsZXNzcChZLFopKSA6LSAhLgorbGVzc3AodGltZXMoWCxaKSwgdGltZXMoWSxaKSwgYW5kKG5vdCh6ZXJvcChaKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVzc3AoWCxZKSkpIDotICEuCitsZXNzcChZLCBwbHVzKFgsWSksIG5vdCh6ZXJvcChYKSkpIDotICEuCitsZXNzcChsZW5ndGgoZGVsZXRlKFgsTCkpLCBsZW5ndGgoTCksIG1lbWJlcihYLEwpKS4KKworbWVhbmluZyhwbHVzX3RyZWUoYXBwZW5kKFgsWSkpLEEsCisgICAgICAgIHBsdXMobWVhbmluZyhwbHVzX3RyZWUoWCksQSksCisgICAgICAgICAgICAgbWVhbmluZyhwbHVzX3RyZWUoWSksQSkpKSA6LSAhLgorbWVhbmluZyhwbHVzX3RyZWUocGx1c19mcmluZ2UoWCkpLEEsCisgICAgICAgIGZpeChtZWFuaW5nKFgsQSkpKSA6LSAhLgorbWVhbmluZyhwbHVzX3RyZWUoZGVsZXRlKFgsWSkpLEEsCisgICAgICAgIGlmKG1lbWJlcihYLFkpLAorICAgICAgICAgICBkaWZmZXJlbmNlKG1lYW5pbmcocGx1c190cmVlKFkpLEEpLAorICAgICAgICAgICAgICAgICAgICAgIG1lYW5pbmcoWCxBKSksCisgICAgICAgICAgIG1lYW5pbmcocGx1c190cmVlKFkpLEEpKSkuCisKK215bWVtYmVyKFgsYXBwZW5kKEEsQiksb3IobWVtYmVyKFgsQSksbWVtYmVyKFgsQikpKSA6LSAhLgorbXltZW1iZXIoWCxyZXZlcnNlKFkpLG1lbWJlcihYLFkpKSA6LSAhLgorbXltZW1iZXIoQSxpbnRlcnNlY3QoQixDKSxhbmQobWVtYmVyKEEsQiksbWVtYmVyKEEsQykpKS4KKworbnRoKHplcm8sXyx6ZXJvKS4KK250aChbXSxJLGlmKHplcm9wKEkpLFtdLHplcm8pKS4KK250aChhcHBlbmQoQSxCKSxJLGFwcGVuZChudGgoQSxJKSxudGgoQixkaWZmZXJlbmNlKEksbGVuZ3RoKEEpKSkpKS4KKworbXlfcGx1cyhwbHVzKFgsWSksWiwKKyAgICAgcGx1cyhYLHBsdXMoWSxaKSkpIDotICEuCitteV9wbHVzKHJlbWFpbmRlcihYLFkpLAorICAgICB0aW1lcyhZLHF1b3RpZW50KFgsWSkpLAorICAgICBmaXgoWCkpIDotICEuCitteV9wbHVzKFgsYWRkMShZKSwKKyAgICAgaWYobnVtYmVycChZKSwKKyAgICAgICAgYWRkMShwbHVzKFgsWSkpLAorICAgICAgICBhZGQxKFgpKSkuCisKK3Bvd2VyX2V2YWwoYmlnX3BsdXMxKEwsSSxCYXNlKSxCYXNlLAorICAgICAgICAgICBwbHVzKHBvd2VyX2V2YWwoTCxCYXNlKSxJKSkgOi0gIS4KK3Bvd2VyX2V2YWwocG93ZXJfcmVwKEksQmFzZSksQmFzZSwKKyAgICAgICAgICAgZml4KEkpKSA6LSAhLgorcG93ZXJfZXZhbChiaWdfcGx1cyhYLFksSSxCYXNlKSxCYXNlLAorICAgICAgICAgICBwbHVzKEkscGx1cyhwb3dlcl9ldmFsKFgsQmFzZSksCisgICAgICAgICAgICAgICAgICAgICAgIHBvd2VyX2V2YWwoWSxCYXNlKSkpKSA6LSAhLgorcG93ZXJfZXZhbChiaWdfcGx1cyhwb3dlcl9yZXAoSSxCYXNlKSwKKyAgICAgICAgICAgICAgICAgICAgcG93ZXJfcmVwKEosQmFzZSksCisgICAgICAgICAgICAgICAgICAgIHplcm8sCisgICAgICAgICAgICAgICAgICAgIEJhc2UpLAorICAgICAgICAgICBCYXNlLAorICAgICAgICAgICBwbHVzKEksSikpLgorCitxdW90aWVudChwbHVzKFgscGx1cyhYLFkpKSwyLHBsdXMoWCxxdW90aWVudChZLDIpKSkuCitxdW90aWVudCh0aW1lcyhZLFgpLFksaWYoemVyb3AoWSksemVybyxmaXgoWCkpKS4KKworcmVtYWluZGVyKF8sICAgICAgICAgMSx6ZXJvKSA6LSAhLgorcmVtYWluZGVyKFgsICAgICAgICAgWCx6ZXJvKSA6LSAhLgorcmVtYWluZGVyKHRpbWVzKF8sWiksWix6ZXJvKSA6LSAhLgorcmVtYWluZGVyKHRpbWVzKFksXyksWSx6ZXJvKS4KKworcmV2ZXJzZV9sb29wKFgsWSwgIGFwcGVuZChyZXZlcnNlKFgpLFkpKSA6LSAhLgorcmV2ZXJzZV9sb29wKFgsW10sIHJldmVyc2UoWCkgICAgICAgICAgKS4KKwordGltZXMoWCwgICAgICAgICBwbHVzKFksWiksICAgICAgcGx1cyh0aW1lcyhYLFkpLHRpbWVzKFgsWikpICAgICAgKSA6LSAhLgordGltZXModGltZXMoWCxZKSxaLCAgICAgICAgICAgICAgdGltZXMoWCx0aW1lcyhZLFopKSAgICAgICAgICAgICAgKSA6LSAhLgordGltZXMoWCwgICAgICAgICBkaWZmZXJlbmNlKEMsVyksZGlmZmVyZW5jZSh0aW1lcyhDLFgpLHRpbWVzKFcsWCkpKSA6LSAhLgordGltZXMoWCwgICAgICAgICBhZGQxKFkpLCAgICAgICAgaWYobnVtYmVycChZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdXMoWCx0aW1lcyhYLFkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeChYKSkgICAgICAgICAgICAgICAgICAgICAgICkuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9icm93c2UuaW4gYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9icm93c2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMyNDZjZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL2Jyb3dzZS5pbgpAQCAtMCwwICsxIEBACis6LSAnJGJlbmNobWFyaycoYnJvd3NlLCAxMDAwLCBtYWluLCAnJGR1bW15JykuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9icm93c2UucGwgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9icm93c2UucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2MWI5OAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL2Jyb3dzZS5wbApAQCAtMCwwICsxLDEwMCBAQAorJSBnZW5lcmF0ZWQ6IDE5IEp1bmUgMTk5MAorJSBvcHRpb24ocyk6IAorJQorJSAgIGJyb3dzZQorJQorJSAgIFRlcCBEb2JyeSAoZnJvbSBMaXNwIHZlcnNpb24gYnkgUi4gUC4gR2FicmllbCkKKyUKKyUgICAobW9kaWZpZWQgSmFudWFyeSAxOTg3IGJ5IEhlcnZlJyBUb3VhdGkpCisKK21haW4gOi0gCisgICAgaW5pdCgxMDAsMTAsNCwKKyAgICAgICAgIFtbYSxhLGEsYixiLGIsYixhLGEsYSxhLGEsYixiLGEsYSxhXSwKKyAgICAgICAgICBbYSxhLGIsYixiLGIsYSxhLFthLGFdLFtiLGJdXSwKKyAgICAgICAgICBbYSxhLGEsYixbYixhXSxiLGEsYixhXQorICAgICAgICAgXSwKKyAgICAgICAgIFN5bWJvbHMpLAorICAgIHJhbmRvbWl6ZShTeW1ib2xzLFJTeW1ib2xzLDIxKSwhLAorICAgIGludmVzdGlnYXRlKFJTeW1ib2xzLAorICAgICAgICAgICAgICAgIFtbc3RhcihTQSksQixzdGFyKFNCKSxCLGEsc3RhcihTQSksYSxzdGFyKFNCKSxzdGFyKFNBKV0sCisgICAgICAgICAgICAgICAgIFtzdGFyKFNBKSxzdGFyKFNCKSxzdGFyKFNCKSxzdGFyKFNBKSxbc3RhcihTQSldLFtzdGFyKFNCKV1dLAorICAgICAgICAgICAgICAgICBbXyxfLHN0YXIoXyksW2IsYV0sc3RhcihfKSxfLF9dCisgICAgICAgICAgICAgICAgXSkuCisKKworaW5pdChOLE0sTnBhdHMsSXBhdHMsUmVzdWx0KSA6LSBpbml0KE4sTSxNLE5wYXRzLElwYXRzLFJlc3VsdCkuCisKK2luaXQoMCxfLF8sXyxfLF8pIDotICEuCitpbml0KE4sSSxNLE5wYXRzLElwYXRzLFtTeW1ifFJlc3RdKSA6LSAKKyAgICBmaWxsKEksW10sTCksCisgICAgZ2V0X3BhdHMoTnBhdHMsSXBhdHMsUHBhdHMpLAorICAgIEogaXMgTSAtIEksCisgICAgZmlsbChKLFtwYXR0ZXJuKFBwYXRzKXxMXSxTeW1iKSwKKyAgICBOMSBpcyBOIC0gMSwKKyAgICAoSSA9Oj0gMCAtPiBJMSBpcyBNOyBJMSBpcyBJIC0gMSksCisgICAgaW5pdChOMSxJMSxNLE5wYXRzLElwYXRzLFJlc3QpLgorCitmaWxsKDAsTCxMKSA6LSAhLgorZmlsbChOLEwsW2R1bW15KFtdKXxSZXN0XSkgOi0gCisgICAgTjEgaXMgTiAtIDEsCisgICAgZmlsbChOMSxMLFJlc3QpLgorCityYW5kb21pemUoW10sW10sXykgOi0gIS4KK3JhbmRvbWl6ZShJbixbWHxPdXRdLFJhbmQpIDotCisgICAgbGVuZ3RoKEluLExpbiksCisgICAgUmFuZDEgaXMgKFJhbmQgKiAxNykgbW9kIDI1MSwKKyAgICBOIGlzIFJhbmQxIG1vZCBMaW4sCisgICAgc3BsaXQoTixJbixYLEluMSksCisgICAgcmFuZG9taXplKEluMSxPdXQsUmFuZDEpLgorCitzcGxpdCgwLFtYfFhzXSxYLFhzKSA6LSAhLgorc3BsaXQoTixbWHxYc10sUmVtb3ZlZEVsdCxbWHxZc10pIDotCisgICAgTjEgaXMgTiAtIDEsCisgICAgc3BsaXQoTjEsWHMsUmVtb3ZlZEVsdCxZcykuCisKK2ludmVzdGlnYXRlKFtdLF8pIDotICEuCitpbnZlc3RpZ2F0ZShbVXxVbml0c10sUGF0dGVybnMpIDotCisgICAgcHJvcGVydHkoVSxwYXR0ZXJuLERhdGEpLAorICAgIHBfaW52ZXN0aWdhdGUoRGF0YSxQYXR0ZXJucyksCisgICAgaW52ZXN0aWdhdGUoVW5pdHMsUGF0dGVybnMpLgorCitnZXRfcGF0cyhOcGF0cyxJcGF0cyxSZXN1bHQpIDotIGdldF9wYXRzKE5wYXRzLElwYXRzLFJlc3VsdCxJcGF0cykuCisKK2dldF9wYXRzKDAsXyxbXSxfKSA6LSAhLgorZ2V0X3BhdHMoTixbWHxYc10sW1h8WXNdLElwYXRzKSA6LQorICAgIE4xIGlzIE4gLSAxLAorICAgIGdldF9wYXRzKE4xLFhzLFlzLElwYXRzKS4KK2dldF9wYXRzKE4sW10sWXMsSXBhdHMpIDotCisgICAgZ2V0X3BhdHMoTixJcGF0cyxZcyxJcGF0cykuCisKK3Byb3BlcnR5KFtdLF8sXykgOi0gZmFpbC4JLyogZG9uJ3QgcmVhbGx5IG5lZWQgdGhpcyAqLworcHJvcGVydHkoW1Byb3B8X10sUCxWYWwpIDotCisgICAgZnVuY3RvcihQcm9wLFAsXyksISwKKyAgICBhcmcoMSxQcm9wLFZhbCkuCitwcm9wZXJ0eShbX3xSUHJvcHNdLFAsVmFsKSA6LQorICAgIHByb3BlcnR5KFJQcm9wcyxQLFZhbCkuCisKK3BfaW52ZXN0aWdhdGUoW10sXykuCitwX2ludmVzdGlnYXRlKFtEfERhdGFdLFBhdHRlcm5zKSA6LQorICAgIHBfbWF0Y2goUGF0dGVybnMsRCksCisgICAgcF9pbnZlc3RpZ2F0ZShEYXRhLFBhdHRlcm5zKS4KKworcF9tYXRjaChbXSxfKS4KK3BfbWF0Y2goW1B8UGF0dGVybnNdLEQpIDotCisgICAgKG1hdGNoKEQsUCksZmFpbDsgdHJ1ZSksCisgICAgcF9tYXRjaChQYXR0ZXJucyxEKS4KKworbWF0Y2goW10sW10pIDotICEuCittYXRjaChbWHxQUmVzdF0sW1l8U1Jlc3RdKSA6LQorICAgIHZhcihZKSwhLFggPSBZLAorICAgIG1hdGNoKFBSZXN0LFNSZXN0KS4KK21hdGNoKExpc3QsW1l8UmVzdF0pIDotIAorICAgIG5vbnZhcihZKSxZID0gc3RhcihYKSwhLAorICAgIGNvbmNhdChYLFNSZXN0LExpc3QpLAorICAgIG1hdGNoKFNSZXN0LFJlc3QpLgorbWF0Y2goW1h8UFJlc3RdLFtZfFNSZXN0XSkgOi0KKyAgICAoYXRvbShYKSAtPiBYID0gWTsgbWF0Y2goWCxZKSksCisgICAgbWF0Y2goUFJlc3QsU1Jlc3QpLgorCitjb25jYXQoW10sTCxMKS4KK2NvbmNhdChbWHxMMV0sTDIsW1h8TDNdKSA6LSBjb25jYXQoTDEsTDIsTDMpLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvY2hhdF9wYXJzZXIuaW4gYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9jaGF0X3BhcnNlci5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjM2NGM5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvY2hhdF9wYXJzZXIuaW4KQEAgLTAsMCArMSBAQAorOi0gJyRiZW5jaG1hcmsnKGNoYXRfcGFyc2VyLCAxMDAwLCBjaGF0X3BhcnNlciwgJyRkdW1teScpLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvY2hhdF9wYXJzZXIucGwgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9jaGF0X3BhcnNlci5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2U0ZmUwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvY2hhdF9wYXJzZXIucGwKQEAgLTAsMCArMSwxMTgwIEBACisvKiBDSEFOR0VMT0cgYnkgTS5CYW5iYXJhCisgICAtIHJlbmFtZSBvcGVuLzQgdG8gbXlfb3Blbi80CisgICAtIHJlbmFtZSBzdHJpbmcvMSB0byBteV9zdHJpbmcvMQorICAgLSByZW5hbWUgdHJhY2UvMSB0byBteV90cmFjZS8xCisgICAtIHJlbmFtZSB0cmFjZS8yIHRvIG15X3RyYWNlLzIKKyovCisKKworJSBnZW5lcmF0ZWQ6IDE5IE5vdmVtYmVyIDE5ODkKKyUgb3B0aW9uKHMpOiAKKyUKKyUgIGNoYXRfcGFyc2VyCislCislICBGZXJuYW5kbyBDLiBOLiBQZXJlaXJhIGFuZCBEYXZpZCBILiBELiBXYXJyZW4KKworY2hhdF9wYXJzZXIgOi0gbXlfc3RyaW5nKFgpLAorICAgICAgICAgICAgICAgZGV0ZXJtaW5hdGVfc2F5KFgsXyksCisgICAgICAgICAgICAgICBmYWlsLgorY2hhdF9wYXJzZXIuCisKKworJSAgcXVlcnkgc2V0CisKK215X3N0cmluZyhbd2hhdCxyaXZlcnMsYXJlLHRoZXJlLD9dKS4KK215X3N0cmluZyhbZG9lcyxhZmdoYW5pc3Rhbixib3JkZXIsY2hpbmEsP10pLgorbXlfc3RyaW5nKFt3aGF0LGlzLHRoZSxjYXBpdGFsLG9mLHVwcGVyX3ZvbHRhLD9dKS4KK215X3N0cmluZyhbd2hlcmUsaXMsdGhlLGxhcmdlc3QsY291bnRyeSw/XSkuCitteV9zdHJpbmcoW3doaWNoLGNvdW50cnksJ2AnLHMsY2FwaXRhbCxpcyxsb25kb24sP10pLgorbXlfc3RyaW5nKFt3aGljaCxjb3VudHJpZXMsYXJlLGV1cm9wZWFuLD9dKS4KK215X3N0cmluZyhbaG93LGxhcmdlLGlzLHRoZSxzbWFsbGVzdCxhbWVyaWNhbixjb3VudHJ5LD9dKS4KK215X3N0cmluZyhbd2hhdCxpcyx0aGUsb2NlYW4sdGhhdCxib3JkZXJzLGFmcmljYW4sY291bnRyaWVzLAorCWFuZCx0aGF0LGJvcmRlcnMsYXNpYW4sY291bnRyaWVzLD9dKS4KK215X3N0cmluZyhbd2hhdCxhcmUsdGhlLGNhcGl0YWxzLG9mLHRoZSxjb3VudHJpZXMsYm9yZGVyaW5nLHRoZSxiYWx0aWMsP10pLgorbXlfc3RyaW5nKFt3aGljaCxjb3VudHJpZXMsYXJlLGJvcmRlcmVkLGJ5LHR3byxzZWFzLD9dKS4KK215X3N0cmluZyhbaG93LG1hbnksY291bnRyaWVzLGRvZXMsdGhlLGRhbnViZSxmbG93LHRocm91Z2gsP10pLgorbXlfc3RyaW5nKFt3aGF0LGlzLHRoZSx0b3RhbCxhcmVhLG9mLGNvdW50cmllcyxzb3V0aCxvZix0aGUsZXF1YXRvciwKKwlhbmQsbm90LGluLGF1c3RyYWxhc2lhLD9dKS4KK215X3N0cmluZyhbd2hhdCxpcyx0aGUsYXZlcmFnZSxhcmVhLG9mLHRoZSxjb3VudHJpZXMsaW4sZWFjaCxjb250aW5lbnQsP10pLgorbXlfc3RyaW5nKFtpcyx0aGVyZSxtb3JlLHRoYW4sb25lLGNvdW50cnksaW4sZWFjaCxjb250aW5lbnQsP10pLgorbXlfc3RyaW5nKFtpcyx0aGVyZSxzb21lLG9jZWFuLHRoYXQsZG9lcyxub3QsYm9yZGVyLGFueSxjb3VudHJ5LD9dKS4KK215X3N0cmluZyhbd2hhdCxhcmUsdGhlLGNvdW50cmllcyxmcm9tLHdoaWNoLGEscml2ZXIsZmxvd3MsCisJaW50byx0aGUsYmxhY2tfc2VhLD9dKS4KKworCislICBkZXRlcm1pbmF0ZV9zYXkKKworZGV0ZXJtaW5hdGVfc2F5KFgsWSkgOi0gCisgICBzYXkoWCxZKSwgIS4KKworCislLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUKKyUgIHhncnVuCislCislLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGVybWluYWwoVCxTLFMseChfLHRlcm1pbmFsLFQsWCksWCkuCit0ZXJtaW5hbChULFtUfFNdLFMsWCxYKSA6LQorICAgZ2FwKFgpLgorCitnYXAoeChnYXAsXyxfLF8pKS4KK2dhcChbXSkuCisKK3ZpcnR1YWwoTlQseChfLG5vbnRlcm1pbmFsLE5ULFgpLFgpLgorCisKKyUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislCislICBjbG90YWIKKyUKKyUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyUgbm9ybWFsIGZvcm0gbWFza3MKKworaXNfcHAoIygxLF8sXyxfKSkuCisKK2lzX3ByZWQoIyhfLDEsXyxfKSkuCisKK2lzX3RyYWNlKCMoXyxfLDEsXykpLgorCitpc19hZHYoIyhfLF8sXywxKSkuCisKK215X3RyYWNlKCMoXyxfLDEsXyksIygwLDAsMCwwKSkuCisKK215X3RyYWNlKCMoMCwwLDEsMCkpLgorCithZHYoIygwLDAsMCwxKSkuCisKK2VtcHR5KCMoMCwwLDAsMCkpLgorCitucF9hbGwoIygxLDEsMSwwKSkuCisKK3NfYWxsKCMoMSwwLDEsMSkpLgorCitucF9ub190cmFjZSgjKDEsMSwwLDApKS4KKworJSBtYXNrIG9wZXJhdGlvbnMKKworbXlwbHVzKCMoQjEsQjIsQjMsQjQpLCMoQzEsQzIsQzMsQzQpLCMoRDEsRDIsRDMsRDQpKSA6LQorICAgb3IoQjEsQzEsRDEpLAorICAgb3IoQjIsQzIsRDIpLAorICAgb3IoQjMsQzMsRDMpLAorICAgb3IoQjQsQzQsRDQpLgorCittaW51cygjKEIxLEIyLEIzLEI0KSwjKEMxLEMyLEMzLEM0KSwjKEQxLEQyLEQzLEQ0KSkgOi0KKyAgIGFub3QoQjEsQzEsRDEpLAorICAgYW5vdChCMixDMixEMiksCisgICBhbm90KEIzLEMzLEQzKSwKKyAgIGFub3QoQjQsQzQsRDQpLgorCitvcigxLF8sMSkuCitvcigwLDEsMSkuCitvcigwLDAsMCkuCisKK2Fub3QoWCwwLFgpLgorYW5vdChfWCwxLDApLgorCislIG5vdW4gcGhyYXNlIHBvc2l0aW9uIGZlYXR1cmVzCisKK3JvbGUoc3ViaixfLCMoMSwwLDApKS4KK3JvbGUoY29tcGwsXywjKDAsXyxfKSkuCityb2xlKHVuZGVmLG1haW4sIyhfLDAsXykpLgorcm9sZSh1bmRlZixhdXgsIygwLF8sXykpLgorcm9sZSh1bmRlZixkZWNsLF8pLgorcm9sZShuaWwsXyxfKS4KKworc3Vial9jYXNlKCMoMSwwLDApKS4KK3ZlcmJfY2FzZSgjKDAsMSwwKSkuCitwcmVwX2Nhc2UoIygwLDAsMSkpLgorY29tcGxfY2FzZSgjKDAsXyxfKSkuCisKKworJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUKKyUgIG5ld2cKKyUKKyUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3NheShYLFkpIDotCisgICBzZW50ZW5jZShZLFgsW10sW10sW10pLgorCisKK3NlbnRlbmNlKEIsQyxELEUsRikgOi0KKyAgIGRlY2xhcmF0aXZlKEIsQyxHLEUsSCksCisgICB0ZXJtaW5hdG9yKC4sRyxELEgsRikuCitzZW50ZW5jZShCLEMsRCxFLEYpIDotCisgICB3aF9xdWVzdGlvbihCLEMsRyxFLEgpLAorICAgdGVybWluYXRvcig/LEcsRCxILEYpLgorc2VudGVuY2UoQixDLEQsRSxGKSA6LQorICAgdG9waWMoQyxHLEUsSCksCisgICB3aF9xdWVzdGlvbihCLEcsSSxILEopLAorICAgdGVybWluYXRvcig/LEksRCxKLEYpLgorc2VudGVuY2UoQixDLEQsRSxGKSA6LQorICAgeW5fcXVlc3Rpb24oQixDLEcsRSxIKSwKKyAgIHRlcm1pbmF0b3IoPyxHLEQsSCxGKS4KK3NlbnRlbmNlKEIsQyxELEUsRikgOi0KKyAgIGltcGVyYXRpdmUoQixDLEcsRSxIKSwKKyAgIHRlcm1pbmF0b3IoISxHLEQsSCxGKS4KKworCitwcChCLEMsRCxFLEYsRixHLEgpIDotCisgICB2aXJ0dWFsKHBwKEIsQyxELEUpLEcsSCkuCitwcChwcChCLEMpLEQsRSxGLEcsSCxJLEopIDotCisgICBwcmVwKEIsRyxLLEksTCksCisgICBwcmVwX2Nhc2UoTSksCisgICBucChDLF9OLE0sX08sRCxFLEYsSyxILEwsSikuCisKKwordG9waWMoQixDLEQseChnYXAsbm9udGVybWluYWwscHAoRSxjb21wbCxGLEcpLEgpKSA6LQorICAgcHAoRSxjb21wbCxGLEcsQixJLEQsSiksCisgICBvcHRfY29tbWEoSSxDLEosSCkuCisKKworb3B0X2NvbW1hKEIsQyxELEUpIDotCisgICBgKCcsJyxCLEMsRCxFKS4KK29wdF9jb21tYShCLEIsQyxDKS4KKworCitkZWNsYXJhdGl2ZShkZWNsKEIpLEMsRCxFLEYpIDotCisgICBzKEIsX0csQyxELEUsRikuCisKKword2hfcXVlc3Rpb24od2hxKEIsQyksRCxFLEYsRykgOi0KKyAgIHZhcmlhYmxlX3EoQixfSCxJLEosRCxLLEYsTCksCisgICBxdWVzdGlvbihJLEosQyxLLEUsTCxHKS4KKworCitucChCLEMsRCxFLEYsRyxILEksSSxKLEspIDotCisgICB2aXJ0dWFsKG5wKEIsQyxELEUsRixHLEgpLEosSykuCitucChucChCLEMsW10pLEIsRCxkZWYsX0UsRixHLEgsSSxKLEspIDotCisgICBpc19wcChGKSwKKyAgIHBlcnNfcHJvbihDLEIsTCxILEksSixLKSwKKyAgIGVtcHR5KEcpLAorICAgcm9sZShMLGRlY2wsRCkuCitucChucChCLEMsRCksQixfRSxGLEcsSCxJLEosSyxMLE0pIDotCisgICBpc19wcChIKSwKKyAgIG5wX2hlYWQoQyxCLEYrTixPLEQsSixQLEwsUSksCisgICBucF9hbGwoUiksCisgICBucF9jb21wbHMoTixCLEcsTyxSLEksUCxLLFEsTSkuCitucChwYXJ0KEIsQyksMytELF9FLGluZGVmLEYsRyxILEksSixLLEwpIDotCisgICBpc19wcChHKSwKKyAgIGRldGVybWluZXIoQixELGluZGVmLEksTSxLLE4pLAorICAgYChvZixNLE8sTixQKSwKKyAgIHNfYWxsKFEpLAorICAgcHJlcF9jYXNlKFIpLAorICAgbnAoQywzK3BsdSxSLGRlZixGLFEsSCxPLEosUCxMKS4KKworCit2YXJpYWJsZV9xKEIsQyxELEUsRixHLEgseChnYXAsbm9udGVybWluYWwsbnAoSSxDLEUsX0osX0ssTCxNKSxOKSkgOi0KKyAgIHdocShCLEMsSSxELEYsRyxILE4pLAorICAgbXlfdHJhY2UoTCxNKS4KK3ZhcmlhYmxlX3EoQixDLGNvbXBsLEQsRSxGLEcseChnYXAsbm9udGVybWluYWwscHAocHAoSCxJKSxjb21wbCxKLEspLEwpKSA6LQorICAgcHJlcChILEUsTSxHLE4pLAorICAgd2hxKEIsQyxJLF9PLE0sRixOLEwpLAorICAgbXlfdHJhY2UoSixLKSwKKyAgIGNvbXBsX2Nhc2UoRCkuCit2YXJpYWJsZV9xKEIsQyxjb21wbCxELEUsRixHLHgoZ2FwLG5vbnRlcm1pbmFsLAorCSAgIGFkdl9waHJhc2UocHAoSCxucChDLG5wX2hlYWQoaW50X2RldChCKSxbXSxJKSxbXSkpLEosSyksTCkpIDotCisgICBjb250ZXh0X3Byb24oSCxJLEUsRixHLEwpLAorICAgbXlfdHJhY2UoSixLKSwKKyAgIHZlcmJfY2FzZShEKS4KK3ZhcmlhYmxlX3EoQixfQyxjb21wbCxELEUsRixHLAorCSAgIHgoZ2FwLG5vbnRlcm1pbmFsLHByZWRpY2F0ZShhZGosdmFsdWUoSCx3aChCKSksSSksSikpIDotCisgICBgKGhvdyxFLEssRyxMKSwKKyAgIGFkaihxdWFudCxILEssRixMLEopLAorICAgZW1wdHkoSSksCisgICB2ZXJiX2Nhc2UoRCkuCisKKworYWR2X3BocmFzZShCLEMsRCxFLEUsRixHKSA6LQorICAgdmlydHVhbChhZHZfcGhyYXNlKEIsQyxEKSxGLEcpLgorYWR2X3BocmFzZShwcChCLEMpLEQsRSxGLEcsSCxJKSA6LQorICAgbG9jX3ByZWQoQixGLEosSCxLKSwKKyAgIHBwKHBwKHByZXAob2YpLEMpLGNvbXBsLEQsRSxKLEcsSyxJKS4KKworCitwcmVkaWNhdGUoQixDLEQsRSxFLEYsRykgOi0KKyAgIHZpcnR1YWwocHJlZGljYXRlKEIsQyxEKSxGLEcpLgorcHJlZGljYXRlKF9CLEMsRCxFLEYsRyxIKSA6LQorICAgYWRqX3BocmFzZShDLEQsRSxGLEcsSCkuCitwcmVkaWNhdGUobmVnLEIsQyxELEUsRixHKSA6LQorICAgc19hbGwoSCksCisgICBwcChCLGNvbXBsLEgsQyxELEUsRixHKS4KK3ByZWRpY2F0ZShfQixDLEQsRSxGLEcsSCkgOi0KKyAgIHNfYWxsKEkpLAorICAgYWR2X3BocmFzZShDLEksRCxFLEYsRyxIKS4KKworCit3aHEoQixDLEQsdW5kZWYsRSxGLEcsSCkgOi0KKyAgIGludF9kZXQoQixDLEUsSSxHLEopLAorICAgc19hbGwoSyksCisgICBucChELEMsX0wsX00sc3ViaixLLF9OLEksRixKLEgpLgord2hxKEIsMytDLG5wKDMrQyx3aChCKSxbXSksRCxFLEYsRyxIKSA6LQorICAgaW50X3Byb24oRCxFLEYsRyxIKS4KKworCitpbnRfZGV0KEIsMytDLEQsRSxGLEcpIDotCisgICB3aG9zZShCLEMsRCxFLEYsRykuCitpbnRfZGV0KEIsMytDLEQsRSxGLEcpIDotCisgICBpbnRfYXJ0KEIsQyxELEUsRixHKS4KKworCitnZW5fbWFya2VyKEIsQixDLEQpIDotCisgICB2aXJ0dWFsKGdlbl9tYXJrZXIsQyxEKS4KK2dlbl9tYXJrZXIoQixDLEQsRSkgOi0KKyAgIGAoJ2AnLEIsRixELEcpLAorICAgYW5fcyhGLEMsRyxFKS4KKworCit3aG9zZShCLEMsRCxFLEYseChub2dhcCxub250ZXJtaW5hbCxucF9oZWFkMCh3aChCKSxDLHByb3BlciksCisgICAgICB4KG5vZ2FwLG5vbnRlcm1pbmFsLGdlbl9tYXJrZXIsRykpKSA6LQorICAgYCh3aG9zZSxELEUsRixHKS4KKworCitxdWVzdGlvbihCLEMsRCxFLEYsRyxIKSA6LQorICAgc3Vial9xdWVzdGlvbihCKSwKKyAgIHJvbGUoc3ViaixfSSxDKSwKKyAgIHMoRCxfSixFLEYsRyxIKS4KK3F1ZXN0aW9uKEIsQyxELEUsRixHLEgpIDotCisgICBmcm9udGVkX3ZlcmIoQixDLEUsSSxHLEopLAorICAgcyhELF9LLEksRixKLEgpLgorCisKK2RldChCLEMsRCxFLEUsRixHKSA6LQorICAgdmlydHVhbChkZXQoQixDLEQpLEYsRykuCitkZXQoZGV0KEIpLEMsRCxFLEYsRyxIKSA6LQorICAgdGVybWluYWwoSSxFLEYsRyxIKSwKKyAgIGRldChJLEMsQixEKS4KK2RldChnZW5lcmljLF9CLGdlbmVyaWMsQyxDLEQsRCkuCisKKworaW50X2FydChCLEMsRCxFLEYseChub2dhcCxub250ZXJtaW5hbCxkZXQoRyxDLGRlZiksSCkpIDotCisgICBpbnRfYXJ0KEIsQyxHLEQsRSxGLEgpLgorCisKK3N1YmpfcXVlc3Rpb24oc3ViaikuCitzdWJqX3F1ZXN0aW9uKHVuZGVmKS4KKworCit5bl9xdWVzdGlvbihxKEIpLEMsRCxFLEYpIDotCisgICBmcm9udGVkX3ZlcmIobmlsLF9HLEMsSCxFLEkpLAorICAgcyhCLF9KLEgsRCxJLEYpLgorCisKK3ZlcmJfZm9ybShCLEMsRCxFLEYsRixHLEgpIDotCisgICB2aXJ0dWFsKHZlcmJfZm9ybShCLEMsRCxFKSxHLEgpLgordmVyYl9mb3JtKEIsQyxELF9FLEYsRyxILEkpIDotCisgICB0ZXJtaW5hbChKLEYsRyxILEkpLAorICAgdmVyYl9mb3JtKEosQixDLEQpLgorCisKK25lZyhCLEMsRCxELEUsRikgOi0KKyAgIHZpcnR1YWwobmVnKEIsQyksRSxGKS4KK25lZyhhdXgrX0IsbmVnLEMsRCxFLEYpIDotCisgICBgKG5vdCxDLEQsRSxGKS4KK25lZyhfQixwb3MsQyxDLEQsRCkuCisKKworZnJvbnRlZF92ZXJiKEIsQyxELEUsRix4KGdhcCxub250ZXJtaW5hbCx2ZXJiX2Zvcm0oRyxILEksSiksCisJICAgICB4KG5vZ2FwLG5vbnRlcm1pbmFsLG5lZyhfSyxMKSxNKSkpIDotCisgICB2ZXJiX2Zvcm0oRyxILEksX04sRCxPLEYsUCksCisgICB2ZXJiX3R5cGUoRyxhdXgrX1EpLAorICAgcm9sZShCLEosQyksCisgICBuZWcoX1IsTCxPLEUsUCxNKS4KKworCitpbXBlcmF0aXZlKGltcChCKSxDLEQsRSxGKSA6LQorICAgaW1wZXJhdGl2ZV92ZXJiKEMsRyxFLEgpLAorICAgcyhCLF9JLEcsRCxILEYpLgorCisKK2ltcGVyYXRpdmVfdmVyYihCLEMsRCx4KG5vZ2FwLHRlcm1pbmFsLHlvdSx4KG5vZ2FwLG5vbnRlcm1pbmFsLAorCQl2ZXJiX2Zvcm0oRSxpbXArZmluLDIrc2luLG1haW4pLEYpKSkgOi0KKyAgIHZlcmJfZm9ybShFLGluZixfRyxfSCxCLEMsRCxGKS4KKworCitzKHMoQixDLEQsRSksRixHLEgsSSxKKSA6LQorICAgc3ViaihCLEssTCxHLE0sSSxOKSwKKyAgIHZlcmIoQyxLLEwsTyxNLFAsTixRKSwKKyAgIGVtcHR5KFIpLAorICAgc19hbGwoUyksCisgICB2ZXJiX2FyZ3MoTCxPLEQsUixULFAsVSxRLFYpLAorICAgbWludXMoUyxULFcpLAorICAgbXlwbHVzKFMsVCxYKSwKKyAgIHZlcmJfbW9kcyhFLFcsWCxGLFUsSCxWLEopLgorCisKK3N1YmoodGhlcmUsX0IsX0MrYmUsRCxFLEYsRykgOi0KKyAgIGAodGhlcmUsRCxFLEYsRykuCitzdWJqKEIsQyxfRCxFLEYsRyxIKSA6LQorICAgc19hbGwoSSksCisgICBzdWJqX2Nhc2UoSiksCisgICBucChCLEMsSixfSyxzdWJqLEksX0wsRSxGLEcsSCkuCisKKworbnBfaGVhZChCLEMsRCxFLEYsRyxILEksSikgOi0KKyAgIG5wX2hlYWQwKEssTCxNLEcsTixJLE8pLAorICAgcG9zc2Vzc2l2ZShLLEwsTSxQLFAsQixDLEQsRSxGLE4sSCxPLEopLgorCisKK25wX2hlYWQwKEIsQyxELEUsRSxGLEcpIDotCisgICB2aXJ0dWFsKG5wX2hlYWQwKEIsQyxEKSxGLEcpLgorbnBfaGVhZDAobmFtZShCKSwzK3NpbixkZWYrcHJvcGVyLEMsRCxFLEYpIDotCisgICBuYW1lKEIsQyxELEUsRikuCitucF9oZWFkMChucF9oZWFkKEIsQyxEKSwzK0UsRitjb21tb24sRyxILEksSikgOi0KKyAgIGRldGVybWluZXIoQixFLEYsRyxLLEksTCksCisgICBhZGpzKEMsSyxNLEwsTiksCisgICBub3VuKEQsRSxNLEgsTixKKS4KK25wX2hlYWQwKEIsQyxkZWYrcHJvcGVyLEQsRSxGLHgobm9nYXAsbm9udGVybWluYWwsZ2VuX21hcmtlcixHKSkgOi0KKyAgIHBvc3NfcHJvbihCLEMsRCxFLEYsRykuCitucF9oZWFkMChucF9oZWFkKEIsW10sQyksMytzaW4saW5kZWYrY29tbW9uLEQsRSxGLEcpIDotCisgICBxdWFudGlmaWVyX3Byb24oQixDLEQsRSxGLEcpLgorCisKK25wX2NvbXBscyhwcm9wZXIsX0IsX0MsW10sX0QsRSxGLEYsRyxHKSA6LQorICAgZW1wdHkoRSkuCitucF9jb21wbHMoY29tbW9uLEIsQyxELEUsRixHLEgsSSxKKSA6LQorICAgbnBfYWxsKEspLAorICAgbnBfbW9kcyhCLEMsTCxELEUsTSxLLE4sRyxPLEksUCksCisgICByZWxhdGl2ZShCLEwsTSxOLEYsTyxILFAsSikuCisKKworcG9zc2Vzc2l2ZShCLEMsX0QsW10sRSxGLEcsSCxJLEosSyxMLE0sTikgOi0KKyAgIGdlbl9jYXNlKEssTyxNLFApLAorICAgbnBfaGVhZDAoUSxSLFMsTyxULFAsVSksCisgICBwb3NzZXNzaXZlKFEsUixTLFYsW3BwKHBvc3MsbnAoQyxCLEUpKXxWXSxGLEcsSCxJLEosVCxMLFUsTikuCitwb3NzZXNzaXZlKEIsQyxELEUsRixCLEMsRCxFLEYsRyxHLEgsSCkuCisKKworZ2VuX2Nhc2UoQixDLEQseChub2dhcCx0ZXJtaW5hbCx0aGUsRSkpIDotCisgICBnZW5fbWFya2VyKEIsQyxELEUpLgorCisKK2FuX3MoQixDLEQsRSkgOi0KKyAgIGAocyxCLEMsRCxFKS4KK2FuX3MoQixCLEMsQykuCisKKworZGV0ZXJtaW5lcihCLEMsRCxFLEYsRyxIKSA6LQorICAgZGV0KEIsQyxELEUsRixHLEgpLgorZGV0ZXJtaW5lcihCLEMsRCxFLEYsRyxIKSA6LQorICAgcXVhbnRfcGhyYXNlKEIsQyxELEUsRixHLEgpLgorCisKK3F1YW50X3BocmFzZShxdWFudChCLEMpLEQsRSxGLEcsSCxJKSA6LQorICAgcXVhbnQoQixFLEYsSixILEspLAorICAgbnVtYmVyKEMsRCxKLEcsSyxJKS4KKworCitxdWFudChCLGluZGVmLEMsRCxFLEYpIDotCisgICBuZWdfYWR2KEcsQixDLEgsRSxJKSwKKyAgIGNvbXBfYWR2KEcsSCxKLEksSyksCisgICBgKHRoYW4sSixELEssRikuCitxdWFudChCLGluZGVmLEMsRCxFLEYpIDotCisgICBgKGF0LEMsRyxFLEgpLAorICAgc3VwX2FkdihJLEcsRCxILEYpLAorICAgc3VwX29wKEksQikuCitxdWFudCh0aGUsZGVmLEIsQyxELEUpIDotCisgICBgKHRoZSxCLEMsRCxFKS4KK3F1YW50KHNhbWUsaW5kZWYsQixCLEMsQykuCisKKworbmVnX2FkdihCLG5vdCtCLEMsRCxFLEYpIDotCisgICBgKG5vdCxDLEQsRSxGKS4KK25lZ19hZHYoQixCLEMsQyxELEQpLgorCisKK3N1cF9vcChsZWFzdCxub3QrbGVzcykuCitzdXBfb3AobW9zdCxub3QrbW9yZSkuCisKKworbnBfbW9kcyhCLEMsRCxbRXxGXSxHLEgsX0ksSixLLEwsTSxOKSA6LQorICAgbnBfbW9kKEIsQyxFLEcsTyxLLFAsTSxRKSwKKyAgIG15X3RyYWNlKFIpLAorICAgbXlwbHVzKFIsTyxTKSwKKyAgIG1pbnVzKEcsUyxUKSwKKyAgIG15cGx1cyhPLEcsVSksCisgICBucF9tb2RzKEIsQyxELEYsVCxILFUsSixQLEwsUSxOKS4KK25wX21vZHMoX0IsX0MsRCxELEUsRSxGLEYsRyxHLEgsSCkuCisKKworbnBfbW9kKF9CLEMsRCxFLEYsRyxILEksSikgOi0KKyAgIHBwKEQsQyxFLEYsRyxILEksSikuCitucF9tb2QoQixfQyxELEUsRixHLEgsSSxKKSA6LQorICAgcmVkdWNlZF9yZWxhdGl2ZShCLEQsRSxGLEcsSCxJLEopLgorCisKK3ZlcmJfbW9kcyhbQnxDXSxELF9FLEYsRyxILEksSikgOi0KKyAgIHZlcmJfbW9kKEIsRCxLLEcsTCxJLE0pLAorICAgbXlfdHJhY2UoTiksCisgICBteXBsdXMoTixLLE8pLAorICAgbWludXMoRCxPLFApLAorICAgbXlwbHVzKEssRCxRKSwKKyAgIHZlcmJfbW9kcyhDLFAsUSxGLEwsSCxNLEopLgordmVyYl9tb2RzKFtdLF9CLEMsQyxELEQsRSxFKS4KKworCit2ZXJiX21vZChCLEMsRCxFLEYsRyxIKSA6LQorICAgYWR2X3BocmFzZShCLEMsRCxFLEYsRyxIKS4KK3ZlcmJfbW9kKEIsQyxELEUsRixHLEgpIDotCisgICBpc19hZHYoQyksCisgICBhZHZlcmIoQixFLEYsRyxIKSwKKyAgIGVtcHR5KEQpLgordmVyYl9tb2QoQixDLEQsRSxGLEcsSCkgOi0KKyAgIHBwKEIsY29tcGwsQyxELEUsRixHLEgpLgorCisKK2FkanMoW0J8Q10sRCxFLEYsRykgOi0KKyAgIHByZV9hZGooQixELEgsRixJKSwKKyAgIGFkanMoQyxILEUsSSxHKS4KK2FkanMoW10sQixCLEMsQykuCisKKworcHJlX2FkaihCLEMsRCxFLEYpIDotCisgICBhZGooX0csQixDLEQsRSxGKS4KK3ByZV9hZGooQixDLEQsRSxGKSA6LQorICAgc3VwX3BocmFzZShCLEMsRCxFLEYpLgorCisKK3N1cF9waHJhc2Uoc3VwKG1vc3QsQiksQyxELEUsRikgOi0KKyAgIHN1cF9hZGooQixDLEQsRSxGKS4KK3N1cF9waHJhc2Uoc3VwKEIsQyksRCxFLEYsRykgOi0KKyAgIHN1cF9hZHYoQixELEksRixKKSwKKyAgIGFkaihxdWFudCxDLEksRSxKLEcpLgorCisKK2NvbXBfcGhyYXNlKGNvbXAoQixDLEQpLEUsRixHLEgsSSkgOi0KKyAgIGNvbXAoQixDLEYsSixILEspLAorICAgbnBfbm9fdHJhY2UoTCksCisgICBwcmVwX2Nhc2UoTSksCisgICBucChELF9OLE0sX08sY29tcGwsTCxFLEosRyxLLEkpLgorCisKK2NvbXAoQixDLEQsRSxGLEcpIDotCisgICBjb21wX2FkdihCLEQsSCxGLEkpLAorICAgYWRqKHF1YW50LEMsSCxKLEksSyksCisgICBgKHRoYW4sSixFLEssRykuCitjb21wKG1vcmUsQixDLEQsRSxGKSA6LQorICAgcmVsX2FkaihCLEMsRyxFLEgpLAorICAgYCh0aGFuLEcsRCxILEYpLgorY29tcChzYW1lLEIsQyxELEUsRikgOi0KKyAgIGAoYXMsQyxHLEUsSCksCisgICBhZGoocXVhbnQsQixHLEksSCxKKSwKKyAgIGAoYXMsSSxELEosRikuCisKKworcmVsYXRpdmUoQixbQ10sRCxfRSxGLEcsSCxJLEopIDotCisgICBpc19wcmVkKEQpLAorICAgcmVsX2NvbmooQixfSyxDLEYsRyxILEksSikuCityZWxhdGl2ZShfQixbXSxfQyxELEQsRSxFLEYsRikuCisKKworcmVsX2NvbmooQixDLEQsRSxGLEcsSCxJKSA6LQorICAgcmVsKEIsSixLLEYsTCxILE0pLAorICAgcmVsX3Jlc3QoQixDLEosRCxLLEUsTCxHLE0sSSkuCisKKworcmVsX3Jlc3QoQixDLEQsRSxfRixHLEgsSSxKLEspIDotCisgICBjb25qKEMsTCxELE0sRSxILE4sSixPKSwKKyAgIHJlbF9jb25qKEIsTCxNLEcsTixJLE8sSykuCityZWxfcmVzdChfQixfQyxELEQsRSxFLEYsRixHLEcpLgorCisKK3JlbChCLHJlbChDLEQpLEUsRixHLEgsSSkgOi0KKyAgIG15X29wZW4oRixKLEgsSyksCisgICB2YXJpYWJsZShCLEMsSixMLEssTSksCisgICBzKEQsTixMLE8sTSxQKSwKKyAgIG15X3RyYWNlKFEpLAorICAgbWludXMoTixRLEUpLAorICAgY2xvc2UoTyxHLFAsSSkuCisKKwordmFyaWFibGUoQixDLEQsRSxGLHgoZ2FwLG5vbnRlcm1pbmFsLG5wKG5wKEIsd2goQyksW10pLEIsX0csX0gsX0ksSixLKSxMKSkgOi0KKyAgIGAodGhhdCxELEUsRixMKSwKKyAgIG15X3RyYWNlKEosSykuCit2YXJpYWJsZShCLEMsRCxFLEYseChnYXAsbm9udGVybWluYWwsbnAoRyxILEksX0osX0ssTCxNKSxOKSkgOi0KKyAgIHdoKEMsQixHLEgsSSxELEUsRixOKSwKKyAgIG15X3RyYWNlKEwsTSkuCit2YXJpYWJsZShCLEMsRCxFLEYseChnYXAsbm9udGVybWluYWwscHAocHAoRyxIKSxjb21wbCxJLEopLEspKSA6LQorICAgcHJlcChHLEQsTCxGLE0pLAorICAgd2goQyxCLEgsX04sTyxMLEUsTSxLKSwKKyAgIG15X3RyYWNlKEksSiksCisgICBjb21wbF9jYXNlKE8pLgorCisKK3doKEIsQyxucChDLHdoKEIpLFtdKSxDLEQsRSxGLEcsSCkgOi0KKyAgIHJlbF9wcm9uKEksRSxGLEcsSCksCisgICByb2xlKEksZGVjbCxEKS4KK3doKEIsQyxucChELEUsW3BwKEYsRyldKSxELF9ILEksSixLLEwpIDotCisgICBucF9oZWFkMChFLEQsX00rY29tbW9uLEksTixLLE8pLAorICAgcHJlcChGLE4sUCxPLFEpLAorICAgd2goQixDLEcsX1IsX1MsUCxKLFEsTCkuCit3aChCLEMsRCxFLEYsRyxILEksSikgOi0KKyAgIHdob3NlKEIsQyxHLEssSSxMKSwKKyAgIHNfYWxsKE0pLAorICAgbnAoRCxFLEYsZGVmLHN1YmosTSxfTixLLEgsTCxKKS4KKworCityZWR1Y2VkX3JlbGF0aXZlKEIsQyxELEUsRixHLEgsSSkgOi0KKyAgIGlzX3ByZWQoRCksCisgICByZWR1Y2VkX3JlbF9jb25qKEIsX0osQyxFLEYsRyxILEkpLgorCisKK3JlZHVjZWRfcmVsX2NvbmooQixDLEQsRSxGLEcsSCxJKSA6LQorICAgcmVkdWNlZF9yZWwoQixKLEssRixMLEgsTSksCisgICByZWR1Y2VkX3JlbF9yZXN0KEIsQyxKLEQsSyxFLEwsRyxNLEkpLgorCisKK3JlZHVjZWRfcmVsX3Jlc3QoQixDLEQsRSxfRixHLEgsSSxKLEspIDotCisgICBjb25qKEMsTCxELE0sRSxILE4sSixPKSwKKyAgIHJlZHVjZWRfcmVsX2NvbmooQixMLE0sRyxOLEksTyxLKS4KK3JlZHVjZWRfcmVsX3Jlc3QoX0IsX0MsRCxELEUsRSxGLEYsRyxHKS4KKworCityZWR1Y2VkX3JlbChCLHJlZHVjZWRfcmVsKEMsRCksRSxGLEcsSCxJKSA6LQorICAgbXlfb3BlbihGLEosSCxLKSwKKyAgIHJlZHVjZWRfd2goQixDLEosTCxLLE0pLAorICAgcyhELE4sTCxPLE0sUCksCisgICBteV90cmFjZShRKSwKKyAgIG1pbnVzKE4sUSxFKSwKKyAgIGNsb3NlKE8sRyxQLEkpLgorCisKK3JlZHVjZWRfd2goQixDLEQsRSxGLHgobm9nYXAsbm9udGVybWluYWwsCisJICAgbnAobnAoQix3aChDKSxbXSksQixHLF9ILF9JLEosSykseChub2dhcCxub250ZXJtaW5hbCwKKwkgICB2ZXJiX2Zvcm0oYmUscHJlcytmaW4sQixtYWluKSx4KG5vZ2FwLG5vbnRlcm1pbmFsLAorCSAgIG5lZyhfTCxNKSx4KG5vZ2FwLG5vbnRlcm1pbmFsLHByZWRpY2F0ZShNLE4sTyksUCkpKSkpIDotCisgICBuZWcoX1EsTSxELFIsRixTKSwKKyAgIHByZWRpY2F0ZShNLE4sTyxSLEUsUyxQKSwKKyAgIG15X3RyYWNlKEosSyksCisgICBzdWJqX2Nhc2UoRykuCityZWR1Y2VkX3doKEIsQyxELEUsRix4KG5vZ2FwLG5vbnRlcm1pbmFsLAorCSAgIG5wKG5wKEIsd2goQyksW10pLEIsRyxfSCxfSSxKLEspLHgobm9nYXAsbm9udGVybWluYWwsCisJICAgdmVyYihMLF9NLE4sTyksUCkpKSA6LQorICAgcGFydGljaXBsZShMLE4sTyxELEUsRixQKSwKKyAgIG15X3RyYWNlKEosSyksCisgICBzdWJqX2Nhc2UoRykuCityZWR1Y2VkX3doKEIsQyxELEUsRix4KG5vZ2FwLG5vbnRlcm1pbmFsLAorCSAgIG5wKEcsSCxJLEosX0ssTCxNKSx4KGdhcCxub250ZXJtaW5hbCwKKwkgICBucChucChCLHdoKEMpLFtdKSxCLE4sX08sX1AsUSxSKSxTKSkpIDotCisgICBzX2FsbChUKSwKKyAgIHN1YmpfY2FzZShJKSwKKyAgIHZlcmJfY2FzZShOKSwKKyAgIG5wKEcsSCxfVSxKLHN1YmosVCxfVixELEUsRixTKSwKKyAgIG15X3RyYWNlKEwsTSksCisgICBteV90cmFjZShRLFIpLgorCisKK3ZlcmIoQixDLEQsRSxGLEYsRyxIKSA6LQorICAgdmlydHVhbCh2ZXJiKEIsQyxELEUpLEcsSCkuCit2ZXJiKHZlcmIoQixDLEQrZmluLEUsRiksRyxILEMsSSxKLEssTCkgOi0KKyAgIHZlcmJfZm9ybShNLEQrZmluLEcsTixJLE8sSyxQKSwKKyAgIHZlcmJfdHlwZShNLFEpLAorICAgbmVnKFEsRixPLFIsUCxTKSwKKyAgIHJlc3RfdmVyYihOLE0sQixDLEUsUixKLFMsTCksCisgICB2ZXJiX3R5cGUoQixIKS4KKworCityZXN0X3ZlcmIoYXV4LGhhdmUsQixDLFtwZXJmfERdLEUsRixHLEgpIDotCisgICB2ZXJiX2Zvcm0oSSxwYXN0K3BhcnQsX0osX0ssRSxMLEcsTSksCisgICBoYXZlKEksQixDLEQsTCxGLE0sSCkuCityZXN0X3ZlcmIoYXV4LGJlLEIsQyxELEUsRixHLEgpIDotCisgICB2ZXJiX2Zvcm0oSSxKLF9LLF9MLEUsTSxHLE4pLAorICAgYmUoSixJLEIsQyxELE0sRixOLEgpLgorcmVzdF92ZXJiKGF1eCxkbyxCLGFjdGl2ZSxbXSxDLEQsRSxGKSA6LQorICAgdmVyYl9mb3JtKEIsaW5mLF9HLF9ILEMsRCxFLEYpLgorcmVzdF92ZXJiKG1haW4sQixCLGFjdGl2ZSxbXSxDLEMsRCxEKS4KKworCitoYXZlKGJlLEIsQyxELEUsRixHLEgpIDotCisgICB2ZXJiX2Zvcm0oSSxKLF9LLF9MLEUsTSxHLE4pLAorICAgYmUoSixJLEIsQyxELE0sRixOLEgpLgoraGF2ZShCLEIsYWN0aXZlLFtdLEMsQyxELEQpLgorCisKK2JlKHBhc3QrcGFydCxCLEIscGFzc2l2ZSxbXSxDLEMsRCxEKS4KK2JlKHByZXMrcGFydCxCLEMsRCxbcHJvZ10sRSxGLEcsSCkgOi0KKyAgIHBhc3NpdmUoQixDLEQsRSxGLEcsSCkuCisKKworcGFzc2l2ZShiZSxCLHBhc3NpdmUsQyxELEUsRikgOi0KKyAgIHZlcmJfZm9ybShCLHBhc3QrcGFydCxfRyxfSCxDLEQsRSxGKSwKKyAgIHZlcmJfdHlwZShCLEkpLAorICAgcGFzc2l2ZShJKS4KK3Bhc3NpdmUoQixCLGFjdGl2ZSxDLEMsRCxEKS4KKworCitwYXJ0aWNpcGxlKHZlcmIoQixDLGluZixELEUpLEYsQyxHLEgsSSxKKSA6LQorICAgbmVnKF9LLEUsRyxMLEksTSksCisgICB2ZXJiX2Zvcm0oQixOLF9PLF9QLEwsSCxNLEopLAorICAgcGFydGljaXBsZShOLEMsRCksCisgICB2ZXJiX3R5cGUoQixGKS4KKworCitwYXNzaXZlKF9CK3RyYW5zKS4KK3Bhc3NpdmUoX0IrZGl0cmFucykuCisKKworcGFydGljaXBsZShwcmVzK3BhcnQsYWN0aXZlLFtwcm9nXSkuCitwYXJ0aWNpcGxlKHBhc3QrcGFydCxwYXNzaXZlLFtdKS4KKworCitjbG9zZShCLEIsQyxEKSA6LQorICAgdmlydHVhbChjbG9zZSxDLEQpLgorCisKK215X29wZW4oQixCLEMseChnYXAsbm9udGVybWluYWwsY2xvc2UsQykpLgorCisKK3ZlcmJfYXJncyhfQitDLEQsRSxGLEcsSCxJLEosSykgOi0KKyAgIGFkdnMoRSxMLF9NLEgsTixKLE8pLAorICAgdmVyYl9hcmdzKEMsRCxMLEYsRyxOLEksTyxLKS4KK3ZlcmJfYXJncyh0cmFucyxhY3RpdmUsW2FyZyhkaXIsQildLF9DLEQsRSxGLEcsSCkgOi0KKyAgIHZlcmJfYXJnKG5wLEIsRCxFLEYsRyxIKS4KK3ZlcmJfYXJncyhkaXRyYW5zLF9CLFthcmcoQyxEKXxFXSxfRixHLEgsSSxKLEspIDotCisgICB2ZXJiX2FyZyhucCxELEwsSCxNLEosTiksCisgICBvYmplY3QoQyxFLEwsRyxNLEksTixLKS4KK3ZlcmJfYXJncyhiZSxfQixbdm9pZF0sQyxDLEQsRSxGLEcpIDotCisgICB0ZXJtaW5hbCh0aGVyZSxELEUsRixHKS4KK3ZlcmJfYXJncyhiZSxfQixbYXJnKHByZWRpY2F0ZSxDKV0sX0QsRSxGLEcsSCxJKSA6LQorICAgcHJlZF9jb25qKF9KLEMsRSxGLEcsSCxJKS4KK3ZlcmJfYXJncyhiZSxfQixbYXJnKGRpcixDKV0sX0QsRSxGLEcsSCxJKSA6LQorICAgdmVyYl9hcmcobnAsQyxFLEYsRyxILEkpLgordmVyYl9hcmdzKGhhdmUsYWN0aXZlLFthcmcoZGlyLEIpXSxfQyxELEUsRixHLEgpIDotCisgICB2ZXJiX2FyZyhucCxCLEQsRSxGLEcsSCkuCit2ZXJiX2FyZ3MoQixfQyxbXSxELEQsRSxFLEYsRikgOi0KKyAgIG5vX2FyZ3MoQikuCisKKworb2JqZWN0KEIsQyxELEUsRixHLEgsSSkgOi0KKyAgIGFkdihKKSwKKyAgIG1pbnVzKEosRCxLKSwKKyAgIGFkdnMoQyxMLEssRixNLEgsTiksCisgICBvYmooQixMLEQsRSxNLEcsTixJKS4KKworCitvYmooaW5kLFthcmcoZGlyLEIpXSxfQyxELEUsRixHLEgpIDotCisgICB2ZXJiX2FyZyhucCxCLEQsRSxGLEcsSCkuCitvYmooZGlyLFtdLEIsQixDLEMsRCxEKS4KKworCitwcmVkX2NvbmooQixDLEQsRSxGLEcsSCkgOi0KKyAgIHByZWRpY2F0ZShfSSxKLEssRSxMLEcsTSksCisgICBwcmVkX3Jlc3QoQixKLEMsSyxELEwsRixNLEgpLgorCisKK3ByZWRfcmVzdChCLEMsRCxfRSxGLEcsSCxJLEopIDotCisgICBjb25qKEIsSyxDLEwsRCxHLE0sSSxOKSwKKyAgIHByZWRfY29uaihLLEwsRixNLEgsTixKKS4KK3ByZWRfcmVzdChfQixDLEMsRCxELEUsRSxGLEYpLgorCisKK3ZlcmJfYXJnKG5wLEIsQyxELEUsRixHKSA6LQorICAgc19hbGwoSCksCisgICB2ZXJiX2Nhc2UoSSksCisgICBucChCLF9KLEksX0ssY29tcGwsSCxDLEQsRSxGLEcpLgorCisKK2FkdnMoW0J8Q10sRCxFLEYsRyxILEkpIDotCisgICBpc19hZHYoRSksCisgICBhZHZlcmIoQixGLEosSCxLKSwKKyAgIGFkdnMoQyxELEUsSixHLEssSSkuCithZHZzKEIsQixfQyxELEQsRSxFKS4KKworCithZGpfcGhyYXNlKEIsQyxELEUsRixHKSA6LQorICAgYWRqKF9ILEIsRCxFLEYsRyksCisgICBlbXB0eShDKS4KK2Fkal9waHJhc2UoQixDLEQsRSxGLEcpIDotCisgICBjb21wX3BocmFzZShCLEMsRCxFLEYsRykuCisKKworbm9fYXJncyh0cmFucykuCitub19hcmdzKGRpdHJhbnMpLgorbm9fYXJncyhpbnRyYW5zKS4KKworCitjb25qKGNvbmooQixDKSxjb25qKEIsRCksRSxGLGNvbmooQixFLEYpLEcsSCxJLEopIDotCisgICBjb25qKEIsQyxELEcsSCxJLEopLgorCisKK25vdW4oQixDLEQsRSxGLEcpIDotCisgICB0ZXJtaW5hbChILEQsRSxGLEcpLAorICAgbm91bl9mb3JtKEgsQixDKS4KKworCithZGooQixhZGooQyksRCxFLEYsRykgOi0KKyAgIHRlcm1pbmFsKEMsRCxFLEYsRyksCisgICBhZGooQyxCKS4KKworCitwcmVwKHByZXAoQiksQyxELEUsRikgOi0KKyAgIHRlcm1pbmFsKEIsQyxELEUsRiksCisgICBwcmVwKEIpLgorCisKK3JlbF9hZGooYWRqKEIpLEMsRCxFLEYpIDotCisgICB0ZXJtaW5hbChHLEMsRCxFLEYpLAorICAgcmVsX2FkaihHLEIpLgorCisKK3N1cF9hZGooYWRqKEIpLEMsRCxFLEYpIDotCisgICB0ZXJtaW5hbChHLEMsRCxFLEYpLAorICAgc3VwX2FkaihHLEIpLgorCisKK2NvbXBfYWR2KGxlc3MsQixDLEQsRSkgOi0KKyAgIGAobGVzcyxCLEMsRCxFKS4KK2NvbXBfYWR2KG1vcmUsQixDLEQsRSkgOi0KKyAgIGAobW9yZSxCLEMsRCxFKS4KKworCitzdXBfYWR2KGxlYXN0LEIsQyxELEUpIDotCisgICBgKGxlYXN0LEIsQyxELEUpLgorc3VwX2Fkdihtb3N0LEIsQyxELEUpIDotCisgICBgKG1vc3QsQixDLEQsRSkuCisKKworcmVsX3Byb24oQixDLEQsRSxGKSA6LQorICAgdGVybWluYWwoRyxDLEQsRSxGKSwKKyAgIHJlbF9wcm9uKEcsQikuCisKKworbmFtZShCLEMsRCxFLEYpIDotCisgICBvcHRfdGhlKEMsRyxFLEgpLAorICAgdGVybWluYWwoQixHLEQsSCxGKSwKKyAgIG5hbWUoQikuCisKKworaW50X2FydChCLHBsdSxxdWFudChzYW1lLHdoKEIpKSxDLEQsRSxGKSA6LQorICAgYChob3csQyxHLEUsSCksCisgICBgKG1hbnksRyxELEgsRikuCitpbnRfYXJ0KEIsQyxELEUsRixHLEgpIDotCisgICB0ZXJtaW5hbChJLEUsRixHLEgpLAorICAgaW50X2FydChJLEIsQyxEKS4KKworCitpbnRfcHJvbihCLEMsRCxFLEYpIDotCisgICB0ZXJtaW5hbChHLEMsRCxFLEYpLAorICAgaW50X3Byb24oRyxCKS4KKworCithZHZlcmIoYWR2KEIpLEMsRCxFLEYpIDotCisgICB0ZXJtaW5hbChCLEMsRCxFLEYpLAorICAgYWR2ZXJiKEIpLgorCisKK3Bvc3NfcHJvbihwcm9ub3VuKEIpLEMrRCxFLEYsRyxIKSA6LQorICAgdGVybWluYWwoSSxFLEYsRyxIKSwKKyAgIHBvc3NfcHJvbihJLEIsQyxEKS4KKworCitwZXJzX3Byb24ocHJvbm91bihCKSxDK0QsRSxGLEcsSCxJKSA6LQorICAgdGVybWluYWwoSixGLEcsSCxJKSwKKyAgIHBlcnNfcHJvbihKLEIsQyxELEUpLgorCisKK3F1YW50aWZpZXJfcHJvbihCLEMsRCxFLEYsRykgOi0KKyAgIHRlcm1pbmFsKEgsRCxFLEYsRyksCisgICBxdWFudGlmaWVyX3Byb24oSCxCLEMpLgorCisKK2NvbnRleHRfcHJvbihwcmVwKGluKSxwbGFjZSxCLEMsRCxFKSA6LQorICAgYCh3aGVyZSxCLEMsRCxFKS4KK2NvbnRleHRfcHJvbihwcmVwKGF0KSx0aW1lLEIsQyxELEUpIDotCisgICBgKHdoZW4sQixDLEQsRSkuCisKKworbnVtYmVyKG5iKEIpLEMsRCxFLEYsRykgOi0KKyAgIHRlcm1pbmFsKEgsRCxFLEYsRyksCisgICBudW1iZXIoSCxCLEMpLgorCisKK3Rlcm1pbmF0b3IoQixDLEQsRSxGKSA6LQorICAgdGVybWluYWwoRyxDLEQsRSxGKSwKKyAgIHRlcm1pbmF0b3IoRyxCKS4KKworCitvcHRfdGhlKEIsQixDLEMpLgorb3B0X3RoZShCLEMsRCxFKSA6LQorICAgYCh0aGUsQixDLEQsRSkuCisKKworY29uaihfQixsaXN0LGxpc3QsQyxELEUsRikgOi0KKyAgIHRlcm1pbmFsKCcsJyxDLEQsRSxGKS4KK2NvbmooQixsaXN0LCdlbmQnLEMsRCxFLEYpIDotCisgICB0ZXJtaW5hbChCLEMsRCxFLEYpLAorICAgY29uaihCKS4KKworCitsb2NfcHJlZChCLEMsRCxFLEYpIDotCisgICB0ZXJtaW5hbChHLEMsRCxFLEYpLAorICAgbG9jX3ByZWQoRyxCKS4KKworCitgKEIsQyxELEUsRikgOi0KKyAgIHRlcm1pbmFsKEIsQyxELEUsRiksCisgICBgKEIpLgorCisKKyUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislCislICBuZXdkaWMKKyUKKyUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dvcmQoV29yZCkgOi0gYChXb3JkKS4KK3dvcmQoV29yZCkgOi0gY29uaihXb3JkKS4KK3dvcmQoV29yZCkgOi0gYWR2ZXJiKFdvcmQpLgord29yZChXb3JkKSA6LSBzdXBfYWRqKFdvcmQsXykuCit3b3JkKFdvcmQpIDotIHJlbF9hZGooV29yZCxfKS4KK3dvcmQoV29yZCkgOi0gYWRqKFdvcmQsXykuCit3b3JkKFdvcmQpIDotIG5hbWUoV29yZCkuCit3b3JkKFdvcmQpIDotIHRlcm1pbmF0b3IoV29yZCxfKS4KK3dvcmQoV29yZCkgOi0gcGVyc19wcm9uKFdvcmQsXyxfLF8sXykuCit3b3JkKFdvcmQpIDotIHBvc3NfcHJvbihXb3JkLF8sXyxfKS4KK3dvcmQoV29yZCkgOi0gcmVsX3Byb24oV29yZCxfKS4KK3dvcmQoV29yZCkgOi0gdmVyYl9mb3JtKFdvcmQsXyxfLF8pLgord29yZChXb3JkKSA6LSBub3VuX2Zvcm0oV29yZCxfLF8pLgord29yZChXb3JkKSA6LSBwcmVwKFdvcmQpLgord29yZChXb3JkKSA6LSBxdWFudGlmaWVyX3Byb24oV29yZCxfLF8pLgord29yZChXb3JkKSA6LSBudW1iZXIoV29yZCxfLF8pLgord29yZChXb3JkKSA6LSBkZXQoV29yZCxfLF8sXykuCit3b3JkKFdvcmQpIDotIGludF9hcnQoV29yZCxfLF8sXykuCit3b3JkKFdvcmQpIDotIGludF9wcm9uKFdvcmQsXykuCit3b3JkKFdvcmQpIDotIGxvY19wcmVkKFdvcmQsXykuCisKK2AoaG93KS4KK2Aod2hvc2UpLgorYCh0aGVyZSkuCitgKG9mKS4KK2AoJ2AnKS4JCSUgdXNlIGAgaW5zdGVhZCBvZiAnIHRvIGhlbHAgYXNzZW1ibGVyCitgKCcsJykuCQorYChzKS4KK2AodGhhbikuCitgKGF0KS4KK2AodGhlKS4KK2Aobm90KS4KK2AoYXMpLgorYCh0aGF0KS4KK2AobGVzcykuCitgKG1vcmUpLgorYChsZWFzdCkuCitgKG1vc3QpLgorYChtYW55KS4KK2Aod2hlcmUpLgorYCh3aGVuKS4KKworY29uaihhbmQpLgorY29uaihvcikuCisKK2ludF9wcm9uKHdoYXQsdW5kZWYpLgoraW50X3Byb24od2hpY2gsdW5kZWYpLgoraW50X3Byb24od2hvLHN1YmopLgoraW50X3Byb24od2hvbSxjb21wbCkuCisKK2ludF9hcnQod2hhdCxYLF8saW50X2RldChYKSkuCitpbnRfYXJ0KHdoaWNoLFgsXyxpbnRfZGV0KFgpKS4KKworZGV0KHRoZSxObyx0aGUoTm8pLGRlZikuCitkZXQoYSxzaW4sYSxpbmRlZikuCitkZXQoYW4sc2luLGEsaW5kZWYpLgorZGV0KGV2ZXJ5LHNpbixldmVyeSxpbmRlZikuCitkZXQoc29tZSxfLHNvbWUsaW5kZWYpLgorZGV0KGFueSxfLGFueSxpbmRlZikuCitkZXQoYWxsLHBsdSxhbGwsaW5kZWYpLgorZGV0KGVhY2gsc2luLGVhY2gsaW5kZWYpLgorZGV0KG5vLF8sbm8saW5kZWYpLgorCitudW1iZXIoVyxJLE5iKSA6LQorICAgdHJfbnVtYmVyKFcsSSksCisgICBhZ19udW1iZXIoSSxOYikuCisKK3RyX251bWJlcihuYihJKSxJKS4KK3RyX251bWJlcihvbmUsMSkuCit0cl9udW1iZXIodHdvLDIpLgordHJfbnVtYmVyKHRocmVlLDMpLgordHJfbnVtYmVyKGZvdXIsNCkuCit0cl9udW1iZXIoZml2ZSw1KS4KK3RyX251bWJlcihzaXgsNikuCit0cl9udW1iZXIoc2V2ZW4sNykuCit0cl9udW1iZXIoZWlnaHQsOCkuCit0cl9udW1iZXIobmluZSw5KS4KK3RyX251bWJlcih0ZW4sMTApLgorCithZ19udW1iZXIoMSxzaW4pLgorYWdfbnVtYmVyKE4scGx1KSA6LSBOPjEuCisKK3F1YW50aWZpZXJfcHJvbihldmVyeWJvZHksZXZlcnkscGVyc29uKS4KK3F1YW50aWZpZXJfcHJvbihldmVyeW9uZSxldmVyeSxwZXJzb24pLgorcXVhbnRpZmllcl9wcm9uKGV2ZXJ5dGhpbmcsZXZlcnksdGhpbmcpLgorcXVhbnRpZmllcl9wcm9uKHNvbWVib2R5LHNvbWUscGVyc29uKS4KK3F1YW50aWZpZXJfcHJvbihzb21lb25lLHNvbWUscGVyc29uKS4KK3F1YW50aWZpZXJfcHJvbihzb21ldGhpbmcsc29tZSx0aGluZykuCitxdWFudGlmaWVyX3Byb24oYW55Ym9keSxhbnkscGVyc29uKS4KK3F1YW50aWZpZXJfcHJvbihhbnlvbmUsYW55LHBlcnNvbikuCitxdWFudGlmaWVyX3Byb24oYW55dGhpbmcsYW55LHRoaW5nKS4KK3F1YW50aWZpZXJfcHJvbihub2JvZHksbm8scGVyc29uKS4KK3F1YW50aWZpZXJfcHJvbihub3RoaW5nLG5vLHRoaW5nKS4KKworcHJlcChhcykuCitwcmVwKGF0KS4KK3ByZXAob2YpLgorcHJlcCh0bykuCitwcmVwKGJ5KS4KK3ByZXAod2l0aCkuCitwcmVwKGluKS4KK3ByZXAob24pLgorcHJlcChmcm9tKS4KK3ByZXAoaW50bykuCitwcmVwKHRocm91Z2gpLgorCitub3VuX2Zvcm0oUGx1LFNpbixwbHUpIDotIG5vdW5fcGx1KFBsdSxTaW4pLgorbm91bl9mb3JtKFNpbixTaW4sc2luKSA6LSBub3VuX3NpbihTaW4pLgorbm91bl9mb3JtKHByb3BvcnRpb24scHJvcG9ydGlvbixfKS4KK25vdW5fZm9ybShwZXJjZW50YWdlLHBlcmNlbnRhZ2UsXykuCisKK3Jvb3RfZm9ybSgxK3NpbikuCityb290X2Zvcm0oMitfKS4KK3Jvb3RfZm9ybSgxK3BsdSkuCityb290X2Zvcm0oMytwbHUpLgorCit2ZXJiX3Jvb3QoYmUpLgordmVyYl9yb290KGhhdmUpLgordmVyYl9yb290KGRvKS4KK3ZlcmJfcm9vdChib3JkZXIpLgordmVyYl9yb290KGNvbnRhaW4pLgordmVyYl9yb290KGRyYWluKS4KK3ZlcmJfcm9vdChleGNlZWQpLgordmVyYl9yb290KGZsb3cpLgordmVyYl9yb290KHJpc2UpLgorCityZWd1bGFyX3ByZXMoaGF2ZSkuCityZWd1bGFyX3ByZXMoZG8pLgorcmVndWxhcl9wcmVzKHJpc2UpLgorcmVndWxhcl9wcmVzKGJvcmRlcikuCityZWd1bGFyX3ByZXMoY29udGFpbikuCityZWd1bGFyX3ByZXMoZHJhaW4pLgorcmVndWxhcl9wcmVzKGV4Y2VlZCkuCityZWd1bGFyX3ByZXMoZmxvdykuCisKK3JlZ3VsYXJfcGFzdChoYWQsaGF2ZSkuCityZWd1bGFyX3Bhc3QoYm9yZGVyZWQsYm9yZGVyKS4KK3JlZ3VsYXJfcGFzdChjb250YWluZWQsY29udGFpbikuCityZWd1bGFyX3Bhc3QoZHJhaW5lZCxkcmFpbikuCityZWd1bGFyX3Bhc3QoZXhjZWVkZWQsZXhjZWVkKS4KK3JlZ3VsYXJfcGFzdChmbG93ZWQsZmxvdykuCisKK3JlbF9wcm9uKHdobyxzdWJqKS4KK3JlbF9wcm9uKHdob20sY29tcGwpLgorcmVsX3Byb24od2hpY2gsdW5kZWYpLgorCitwb3NzX3Byb24obXksXywxLHNpbikuCitwb3NzX3Byb24oeW91cixfLDIsXykuCitwb3NzX3Byb24oaGlzLG1hc2MsMyxzaW4pLgorcG9zc19wcm9uKGhlcixmZW0sMyxzaW4pLgorcG9zc19wcm9uKGl0cyxuZXV0LDMsc2luKS4KK3Bvc3NfcHJvbihvdXIsXywxLHBsdSkuCitwb3NzX3Byb24odGhlaXIsXywzLHBsdSkuCisKK3BlcnNfcHJvbihpLF8sMSxzaW4sc3ViaikuCitwZXJzX3Byb24oeW91LF8sMixfLF8pLgorcGVyc19wcm9uKGhlLG1hc2MsMyxzaW4sc3ViaikuCitwZXJzX3Byb24oc2hlLGZlbSwzLHNpbixzdWJqKS4KK3BlcnNfcHJvbihpdCxuZXV0LDMsc2luLF8pLgorcGVyc19wcm9uKHdlLF8sMSxwbHUsc3ViaikuCitwZXJzX3Byb24odGhlbSxfLDMscGx1LHN1YmopLgorcGVyc19wcm9uKG1lLF8sMSxzaW4sY29tcGwoXykpLgorcGVyc19wcm9uKGhpbSxtYXNjLDMsc2luLGNvbXBsKF8pKS4KK3BlcnNfcHJvbihoZXIsZmVtLDMsc2luLGNvbXBsKF8pKS4KK3BlcnNfcHJvbih1cyxfLDEscGx1LGNvbXBsKF8pKS4KK3BlcnNfcHJvbih0aGVtLF8sMyxwbHUsY29tcGwoXykpLgorCit0ZXJtaW5hdG9yKC4sXykuCit0ZXJtaW5hdG9yKD8sPykuCit0ZXJtaW5hdG9yKCEsISkuCisKK25hbWUoXykuCisKKyUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyUgc3BlY2lhbGlzZWQgZGljdGlvbmFyeQorCitsb2NfcHJlZChlYXN0LHByZXAoZWFzdG9mKSkuCitsb2NfcHJlZCh3ZXN0LHByZXAod2VzdG9mKSkuCitsb2NfcHJlZChub3J0aCxwcmVwKG5vcnRob2YpKS4KK2xvY19wcmVkKHNvdXRoLHByZXAoc291dGhvZikpLgorCithZGoobWluaW11bSxyZXN0cikuCithZGoobWF4aW11bSxyZXN0cikuCithZGooYXZlcmFnZSxyZXN0cikuCithZGoodG90YWwscmVzdHIpLgorYWRqKGFmcmljYW4scmVzdHIpLgorYWRqKGFtZXJpY2FuLHJlc3RyKS4KK2Fkaihhc2lhbixyZXN0cikuCithZGooZXVyb3BlYW4scmVzdHIpLgorYWRqKGdyZWF0LHF1YW50KS4KK2FkaihiaWcscXVhbnQpLgorYWRqKHNtYWxsLHF1YW50KS4KK2FkaihsYXJnZSxxdWFudCkuCithZGoob2xkLHF1YW50KS4KK2FkaihuZXcscXVhbnQpLgorYWRqKHBvcHVsb3VzLHF1YW50KS4KKworcmVsX2FkaihncmVhdGVyLGdyZWF0KS4KK3JlbF9hZGoobGVzcyxzbWFsbCkuCityZWxfYWRqKGJpZ2dlcixiaWcpLgorcmVsX2FkaihzbWFsbGVyLHNtYWxsKS4KK3JlbF9hZGoobGFyZ2VyLGxhcmdlKS4KK3JlbF9hZGoob2xkZXIsb2xkKS4KK3JlbF9hZGoobmV3ZXIsbmV3KS4KKworc3VwX2FkaihiaWdnZXN0LGJpZykuCitzdXBfYWRqKHNtYWxsZXN0LHNtYWxsKS4KK3N1cF9hZGoobGFyZ2VzdCxsYXJnZSkuCitzdXBfYWRqKG9sZGVzdCxvbGQpLgorc3VwX2FkaihuZXdlc3QsbmV3KS4KKworbm91bl9zaW4oYXZlcmFnZSkuCitub3VuX3Npbih0b3RhbCkuCitub3VuX3NpbihzdW0pLgorbm91bl9zaW4oZGVncmVlKS4KK25vdW5fc2luKHNxbWlsZSkuCitub3VuX3Npbihrc3FtaWxlKS4KK25vdW5fc2luKHRob3VzYW5kKS4KK25vdW5fc2luKG1pbGxpb24pLgorbm91bl9zaW4odGltZSkuCitub3VuX3NpbihwbGFjZSkuCitub3VuX3NpbihhcmVhKS4KK25vdW5fc2luKGNhcGl0YWwpLgorbm91bl9zaW4oY2l0eSkuCitub3VuX3Npbihjb250aW5lbnQpLgorbm91bl9zaW4oY291bnRyeSkuCitub3VuX3NpbihsYXRpdHVkZSkuCitub3VuX3Npbihsb25naXR1ZGUpLgorbm91bl9zaW4ob2NlYW4pLgorbm91bl9zaW4ocGVyc29uKS4KK25vdW5fc2luKHBvcHVsYXRpb24pLgorbm91bl9zaW4ocmVnaW9uKS4KK25vdW5fc2luKHJpdmVyKS4KK25vdW5fc2luKHNlYSkuCitub3VuX3NpbihzZWFtYXNzKS4KK25vdW5fc2luKG51bWJlcikuCisKK25vdW5fcGx1KGF2ZXJhZ2VzLGF2ZXJhZ2UpLgorbm91bl9wbHUodG90YWxzLHRvdGFsKS4KK25vdW5fcGx1KHN1bXMsc3VtKS4KK25vdW5fcGx1KGRlZ3JlZXMsZGVncmVlKS4KK25vdW5fcGx1KHNxbWlsZXMsc3FtaWxlKS4KK25vdW5fcGx1KGtzcW1pbGVzLGtzcW1pbGUpLgorbm91bl9wbHUobWlsbGlvbixtaWxsaW9uKS4KK25vdW5fcGx1KHRob3VzYW5kLHRob3VzYW5kKS4KK25vdW5fcGx1KHRpbWVzLHRpbWUpLgorbm91bl9wbHUocGxhY2VzLHBsYWNlKS4KK25vdW5fcGx1KGFyZWFzLGFyZWEpLgorbm91bl9wbHUoY2FwaXRhbHMsY2FwaXRhbCkuCitub3VuX3BsdShjaXRpZXMsY2l0eSkuCitub3VuX3BsdShjb250aW5lbnRzLGNvbnRpbmVudCkuCitub3VuX3BsdShjb3VudHJpZXMsY291bnRyeSkuCitub3VuX3BsdShsYXRpdHVkZXMsbGF0aXR1ZGUpLgorbm91bl9wbHUobG9uZ2l0dWRlcyxsb25naXR1ZGUpLgorbm91bl9wbHUob2NlYW5zLG9jZWFuKS4KK25vdW5fcGx1KHBlcnNvbnMscGVyc29uKS4gIG5vdW5fcGx1KHBlb3BsZSxwZXJzb24pLgorbm91bl9wbHUocG9wdWxhdGlvbnMscG9wdWxhdGlvbikuCitub3VuX3BsdShyZWdpb25zLHJlZ2lvbikuCitub3VuX3BsdShyaXZlcnMscml2ZXIpLgorbm91bl9wbHUoc2VhcyxzZWEpLgorbm91bl9wbHUoc2VhbWFzc2VzLHNlYW1hc3MpLgorbm91bl9wbHUobnVtYmVycyxudW1iZXIpLgorCit2ZXJiX2Zvcm0oVixWLGluZixfKSA6LSB2ZXJiX3Jvb3QoVikuCit2ZXJiX2Zvcm0oVixWLHByZXMrZmluLEFnbXQpIDotCisgICByZWd1bGFyX3ByZXMoViksCisgICByb290X2Zvcm0oQWdtdCksCisgICB2ZXJiX3Jvb3QoVikuCit2ZXJiX2Zvcm0oUGFzdCxSb290LHBhc3QrXyxfKSA6LQorICAgcmVndWxhcl9wYXN0KFBhc3QsUm9vdCkuCisKK3ZlcmJfZm9ybShhbSxiZSxwcmVzK2ZpbiwxK3NpbikuCit2ZXJiX2Zvcm0oYXJlLGJlLHByZXMrZmluLDIrc2luKS4KK3ZlcmJfZm9ybShpcyxiZSxwcmVzK2ZpbiwzK3NpbikuCit2ZXJiX2Zvcm0oYXJlLGJlLHByZXMrZmluLF8rcGx1KS4KK3ZlcmJfZm9ybSh3YXMsYmUscGFzdCtmaW4sMStzaW4pLgordmVyYl9mb3JtKHdlcmUsYmUscGFzdCtmaW4sMitzaW4pLgordmVyYl9mb3JtKHdhcyxiZSxwYXN0K2ZpbiwzK3NpbikuCit2ZXJiX2Zvcm0od2VyZSxiZSxwYXN0K2ZpbixfK3BsdSkuCit2ZXJiX2Zvcm0oYmVlbixiZSxwYXN0K3BhcnQsXykuCit2ZXJiX2Zvcm0oYmVpbmcsYmUscHJlcytwYXJ0LF8pLgordmVyYl9mb3JtKGhhcyxoYXZlLHByZXMrZmluLDMrc2luKS4KK3ZlcmJfZm9ybShoYXZpbmcsaGF2ZSxwcmVzK3BhcnQsXykuCit2ZXJiX2Zvcm0oZG9lcyxkbyxwcmVzK2ZpbiwzK3NpbikuCit2ZXJiX2Zvcm0oZGlkLGRvLHBhc3QrZmluLF8pLgordmVyYl9mb3JtKGRvaW5nLGRvLHByZXMrcGFydCxfKS4KK3ZlcmJfZm9ybShkb25lLGRvLHBhc3QrcGFydCxfKS4KK3ZlcmJfZm9ybShmbG93cyxmbG93LHByZXMrZmluLDMrc2luKS4KK3ZlcmJfZm9ybShmbG93aW5nLGZsb3cscHJlcytwYXJ0LF8pLgordmVyYl9mb3JtKHJpc2VzLHJpc2UscHJlcytmaW4sMytzaW4pLgordmVyYl9mb3JtKHJvc2UscmlzZSxwYXN0K2ZpbixfKS4KK3ZlcmJfZm9ybShyaXNlbixyaXNlLHBhc3QrcGFydCxfKS4KK3ZlcmJfZm9ybShib3JkZXJzLGJvcmRlcixwcmVzK2ZpbiwzK3NpbikuCit2ZXJiX2Zvcm0oYm9yZGVyaW5nLGJvcmRlcixwcmVzK3BhcnQsXykuCit2ZXJiX2Zvcm0oY29udGFpbnMsY29udGFpbixwcmVzK2ZpbiwzK3NpbikuCit2ZXJiX2Zvcm0oY29udGFpbmluZyxjb250YWluLHByZXMrcGFydCxfKS4KK3ZlcmJfZm9ybShkcmFpbnMsZHJhaW4scHJlcytmaW4sMytzaW4pLgordmVyYl9mb3JtKGRyYWluaW5nLGRyYWluLHByZXMrcGFydCxfKS4KK3ZlcmJfZm9ybShleGNlZWRzLGV4Y2VlZCxwcmVzK2ZpbiwzK3NpbikuCit2ZXJiX2Zvcm0oZXhjZWVkaW5nLGV4Y2VlZCxwcmVzK3BhcnQsXykuCisKK3ZlcmJfdHlwZShoYXZlLGF1eCtoYXZlKS4KK3ZlcmJfdHlwZShiZSxhdXgrYmUpLgordmVyYl90eXBlKGRvLGF1eCtkaXRyYW5zKS4KK3ZlcmJfdHlwZShyaXNlLG1haW4raW50cmFucykuCit2ZXJiX3R5cGUoYm9yZGVyLG1haW4rdHJhbnMpLgordmVyYl90eXBlKGNvbnRhaW4sbWFpbit0cmFucykuCit2ZXJiX3R5cGUoZHJhaW4sbWFpbitpbnRyYW5zKS4KK3ZlcmJfdHlwZShleGNlZWQsbWFpbit0cmFucykuCit2ZXJiX3R5cGUoZmxvdyxtYWluK2ludHJhbnMpLgorCithZHZlcmIoeWVzdGVyZGF5KS4KK2FkdmVyYih0b21vcnJvdykuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9jcnlwdC5pbiBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL2NyeXB0LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYWZhYTEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9jcnlwdC5pbgpAQCAtMCwwICsxIEBACis6LSAnJGJlbmNobWFyaycoY3J5cHQsIDEwMDAsIG1haW4sICckZHVtbXknKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL2NyeXB0LnBsIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvY3J5cHQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxMjFiNgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL2NyeXB0LnBsCkBAIC0wLDAgKzEsODQgQEAKKworJSBDcnlwdG9tdWx0aXBsaWNhdGlvbjoKKyUgRmluZCB0aGUgdW5pcXVlIGFuc3dlciB0bzoKKyUJT0VFCislCSBFRQorJSAJLS0tCislICAgICAgRU9FRQorJSAgICAgIEVPRQorJSAgICAgIC0tLS0KKyUgICAgICBPT0VFCislCislIHdoZXJlIEU9ZXZlbiwgTz1vZGQuCislIFRoaXMgcHJvZ3JhbSBnZW5lcmFsaXplcyBlYXNpbHkgdG8gYW55IHN1Y2ggcHJvYmxlbS4KKyUgV3JpdHRlbiBieSBQZXRlciBWYW4gUm95CisKK21haW4gOi0KKwlvZGQoQSksIGV2ZW4oQiksIGV2ZW4oQyksCisJZXZlbihFKSwKKwltdWx0KFtDLEIsQV0sIEUsIFtJLEgsRyxGfFhdKSwKKwlsZWZ0ZXZlbihGKSwgb2RkKEcpLCBldmVuKEgpLCBldmVuKEkpLCB6ZXJvKFgpLAorCWxlZnRldmVuKEQpLAorCW11bHQoW0MsQixBXSwgRCwgW0wsSyxKfFldKSwKKwlsZWZ0ZXZlbihKKSwgb2RkKEspLCBldmVuKEwpLCB6ZXJvKFkpLAorCXN1bShbSSxILEcsRl0sIFswLEwsSyxKXSwgW1AsTyxOLE18Wl0pLAorCW9kZChNKSwgb2RkKE4pLCBldmVuKE8pLCBldmVuKFApLCB6ZXJvKFopLgorCSUgd3JpdGUoJyAnKSwgd3JpdGUoQSksIHdyaXRlKEIpLCB3cml0ZShDKSwgbmwsCisJJSB3cml0ZSgnICAnKSwgd3JpdGUoRCksIHdyaXRlKEUpLCBubCwKKwklIHdyaXRlKEYpLCB3cml0ZShHKSwgd3JpdGUoSCksIHdyaXRlKEkpLCBubCwKKwklIHdyaXRlKEopLCB3cml0ZShLKSwgd3JpdGUoTCksIG5sLAorCSUgd3JpdGUoTSksIHdyaXRlKE4pLCB3cml0ZShPKSwgd3JpdGUoUCksIG5sLgorCislIEFkZGl0aW9uIG9mIHR3byBudW1iZXJzCitzdW0oQUwsIEJMLCBDTCkgOi0gc3VtKEFMLCBCTCwgMCwgQ0wpLgorCitzdW0oW0F8QUxdLCBbQnxCTF0sIENhcnJ5LCBbQ3xDTF0pIDotICEsCisJWCBpcyAoQStCK0NhcnJ5KSwKKwlDIGlzIFggbW9kIDEwLAorCU5ld0NhcnJ5IGlzIFggLy8gMTAsCisJc3VtKEFMLCBCTCwgTmV3Q2FycnksIENMKS4KK3N1bShbXSwgQkwsIDAsIEJMKSA6LSAhLgorc3VtKEFMLCBbXSwgMCwgQUwpIDotICEuCitzdW0oW10sIFtCfEJMXSwgQ2FycnksIFtDfENMXSkgOi0gISwKKwlYIGlzIEIrQ2FycnksCisJTmV3Q2FycnkgaXMgWCAvLyAxMCwKKwlDIGlzIFggbW9kIDEwLAorCXN1bShbXSwgQkwsIE5ld0NhcnJ5LCBDTCkuCitzdW0oW0F8QUxdLCBbXSwgQ2FycnksIFtDfENMXSkgOi0gISwKKwlYIGlzIEErQ2FycnksCisJTmV3Q2FycnkgaXMgWCAvLyAxMCwKKwlDIGlzIFggbW9kIDEwLAorCXN1bShbXSwgQUwsIE5ld0NhcnJ5LCBDTCkuCitzdW0oW10sIFtdLCBDYXJyeSwgW0NhcnJ5XSkuCisKKyUgTXVsdGlwbGljYXRpb24KK211bHQoQUwsIEQsIEJMKSA6LSBtdWx0KEFMLCBELCAwLCBCTCkuCisKK211bHQoW0F8QUxdLCBELCBDYXJyeSwgW0J8QkxdICkgOi0KKwlYIGlzIEEqRCtDYXJyeSwKKwlCIGlzIFggbW9kIDEwLAorCU5ld0NhcnJ5IGlzIFggLy8gMTAsCisJbXVsdChBTCwgRCwgTmV3Q2FycnksIEJMKS4KK211bHQoW10sIF8sIENhcnJ5LCBbQyxDZW5kXSkgOi0KKwlDIGlzIENhcnJ5IG1vZCAxMCwKKwlDZW5kIGlzIENhcnJ5IC8vIDEwLgorCit6ZXJvKFtdKS4KK3plcm8oWzB8TF0pIDotIHplcm8oTCkuCisKK29kZCgxKS4KK29kZCgzKS4KK29kZCg1KS4KK29kZCg3KS4KK29kZCg5KS4KKworZXZlbigwKS4KK2V2ZW4oMikuCitldmVuKDQpLgorZXZlbig2KS4KK2V2ZW4oOCkuCisKK2xlZnRldmVuKDIpLgorbGVmdGV2ZW4oNCkuCitsZWZ0ZXZlbig2KS4KK2xlZnRldmVuKDgpLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvZGl2aWRlMTAuaW4gYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9kaXZpZGUxMC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjc0MDAyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvZGl2aWRlMTAuaW4KQEAgLTAsMCArMSBAQAorOi0gJyRiZW5jaG1hcmsnKGRpdmlkZTEwLCAxMDAwLCBkaXZpZGUxMCwgJyRkdW1teScpLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvZGl2aWRlMTAucGwgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9kaXZpZGUxMC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODEyYzI4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvZGl2aWRlMTAucGwKQEAgLTAsMCArMSwzNSBAQAorJSBnZW5lcmF0ZWQ6IDcgTWFyY2ggMTk5MAorJSBvcHRpb24ocyk6IAorJQorJSAgIChkZXJpdikgZGl2aWRlMTAKKyUKKyUgICBEYXZpZCBILiBELiBXYXJyZW4KKyUKKyUgICBzeW1ib2xpYyBkZXJpdmF0aXZlIG9mICgoKCgoKCgoeC94KS94KS94KS94KS94KS94KS94KS94KS94CisKK2RpdmlkZTEwIDotIGQoKCgoKCgoKCh4L3gpL3gpL3gpL3gpL3gpL3gpL3gpL3gpL3gseCxfKS4KKworZChVK1YsWCxEVStEVikgOi0gISwgCisgICAgZChVLFgsRFUpLAorICAgIGQoVixYLERWKS4KK2QoVS1WLFgsRFUtRFYpIDotICEsCisgICAgZChVLFgsRFUpLAorICAgIGQoVixYLERWKS4KK2QoVSpWLFgsRFUqVitVKkRWKSA6LSAhLAorICAgIGQoVSxYLERVKSwKKyAgICBkKFYsWCxEVikuCitkKFUvVixYLChEVSpWLVUqRFYpLyheKFYsMikpKSA6LSAhLAorICAgIGQoVSxYLERVKSwKKyAgICBkKFYsWCxEVikuCitkKF4oVSxOKSxYLERVKk4qKF4oVSxOMSkpKSA6LSAhLCAKKyAgICBpbnRlZ2VyKE4pLAorICAgIE4xIGlzIE4tMSwKKyAgICBkKFUsWCxEVSkuCitkKC1VLFgsLURVKSA6LSAhLAorICAgIGQoVSxYLERVKS4KK2QoZXhwKFUpLFgsZXhwKFUpKkRVKSA6LSAhLAorICAgIGQoVSxYLERVKS4KK2QobG9nKFUpLFgsRFUvVSkgOi0gISwKKyAgICBkKFUsWCxEVSkuCitkKFgsWCwxKSA6LSAhLgorZChfLF8sMCkuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9mYXN0X211LmluIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvZmFzdF9tdS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjliZjdhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvZmFzdF9tdS5pbgpAQCAtMCwwICsxIEBACis6LSAnJGJlbmNobWFyaycoZmFzdF9tdSwgMTAwMCwgbWFpbiwgJyRkdW1teScpLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvZmFzdF9tdS5wbCBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL2Zhc3RfbXUucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk3NjMyZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL2Zhc3RfbXUucGwKQEAgLTAsMCArMSwxMDAgQEAKKyUKKyUJVGhlIE1VLXB1enpsZQorJQkJZnJvbSBIb2ZzdGFkdGVyJ3MgIkdvZGVsLCBFc2NoZXIsIEJhY2giIChwcC4gMzMtNikuCislCQl3cml0dGVuIGJ5IEJydWNlIEhvbG1lcgorJQorJQlUbyBmaW5kIGEgZGVyaXZhdGlvbiB0eXBlLCBmb3IgZXhhbXBsZTogCislCQl0aGVvcmVtKFttLHUsaSxpLHVdKS4KKyUJQWxzbyB0cnkgJ21paWlpaScgKHVzZXMgYWxsIHJ1bGVzKSBhbmQgJ211dWknIChyZXF1aXJlcyAxMSBzdGVwcykuCislCU5vdGUgdGhhdCBpdCBjYW4gYmUgc2hvd24gdGhhdCAoIyBvZiBpJ3MpIGNhbm5vdCBiZSBhIG11bHRpcGxlCislCW9mIHRocmVlICh3aGljaCBpbmNsdWRlcyAwKS4KKyUJU29tZSByZXN1bHRzOgorJQorJQlzdHJpbmcJCSMgc3RlcHMKKyUJLS0tLS0tCQktLS0tLS0tCislCW1pdWkJCTgKKyUJbXVpaQkJOAorJQltdXVpCQkxMQorJQltdWlpdQkJNgorJQltaXV1dQkJOQorJQltdWl1dQkJOQorJQltdXVpdQkJOQorJQltdXV1aQkJOQorCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorCittYWluIDotIHRoZW9yZW0oW20sdSxpLGksdV0pLgorCislIEZpcnN0IGJyZWFrIGdvYWwgYXRvbSBpbnRvIGEgbGlzdCBvZiBjaGFyYWN0ZXJzLAorJSBmaW5kIHRoZSBkZXJpdmF0aW9uLCBhbmQgdGhlbiBwcmludCB0aGUgcmVzdWx0cy4KK3RoZW9yZW0oRykgOi0KKwlsZW5ndGgoRywgR0wxKSwKKwlHTCBpcyBHTDEgLSAxLAorCWRlcml2ZShbbSxpXSwgRywgMSwgR0wsIERlcml2YXRpb24sIDApLgorCSUgbmwsIHByaW50X3Jlc3VsdHMoW3J1bGUoMCxbbSxpXSl8RGVyaXZhdGlvbl0sIDApLgorCislIGRlcml2ZShTdGFydFN0cmluZywgR29hbFN0cmluZywgU3RhcnRTdHJpbmdMZW5ndGgsIEdvYWxTdHJpbmdMZW5ndGgsCislCQlEZXJpdmF0aW9uLCBJbml0Qm91bmQpLgorZGVyaXZlKFMsIEcsIFNMLCBHTCwgRCwgQikgOi0gCisJJSBCMSBpcyBCICsgMSwKKwklIHdyaXRlKCdkZXB0aCAnKSwgd3JpdGUoQjEpLCBubCwKKwlkZXJpdmUyKFMsIEcsIFNMLCBHTCwgMSwgRCwgQikuCitkZXJpdmUoUywgRywgU0wsIEdMLCBELCBCKSA6LSAKKwlCMSBpcyBCICsgMSwKKwlkZXJpdmUoUywgRywgU0wsIEdMLCBELCBCMSkuCisKKyUgZGVyaXZlMihTdGFydFN0cmluZywgR29hbFN0cmluZywgU3RhcnRTdHJpbmdMZW5ndGgsIEdvYWxTdHJpbmdMZW5ndGgsCislCQlTY2FuUG9pbnRlciwgRGVyaXZhdGlvbiwgTnVtUmVtYWluaW5nU3RlcHMpLgorZGVyaXZlMihTLCBTLCBTTCwgU0wsIF8sICAgW10sIF8pLgorZGVyaXZlMihTLCBHLCBTTCwgR0wsIFBpbiwgW3J1bGUoTixJKXxEXSwgUikgOi0KKwlsb3dlcl9ib3VuZChTTCwgR0wsIEIpLAorCVIgPj0gQiwKKwlSMSBpcyBSIC0gMSwKKwlydWxlKFMsIEksIFNMLCBJTCwgUGluLCBQb3V0LCBOKSwKKwlkZXJpdmUyKEksIEcsIElMLCBHTCwgUG91dCwgRCwgUjEpLgorCitydWxlKFttfFQxXSwgW218VDJdLCBMMSwgTDIsIFBpbiwgUG91dCwgTikgOi0KKwlydWxlKFQxLCBUMiwgTDEsIEwyLCBQaW4sIFBvdXQsIDEsIGksIE4sIFgsIFgpLgorCislIHJ1bGUoSW5pdGlhbFN0cmluZywgRmluYWxTdHJpbmcsIEluaXRTdHJMZW5ndGgsIEZpblN0ckxlbmd0aCwKKyUJCVNjYW5QdHJJbiwgU2NhblB0ck91dCwgU3RyUG9zaXRpb24sIFByZXZpb3VzQ2hhciwKKyUJCVJ1bGVOdW1iZXIsIERpZmZMaXN0LCBEaWZmTGluaykuCislICAgVGhlIGRpZmZlcmVuY2UgbGlzdCBpcyB1c2VkIGZvciBkb2luZyBhIGxpc3QgY29uY2F0ZW5hdGUgaW4gcnVsZSAyLgorcnVsZShbaV0sICAgICAgIFtpLHVdLCAgTDEsIEwyLCBQaW4sIFBvdXQsIFBvcywgXywgMSwgXywgXykgOi0gCisJCQkJCQkJUG9zID49IFBpbiwKKwkJCQkJCQlQb3V0IGlzIFBvcyAtIDIsCisJCQkJCQkJTDIgaXMgTDEgKyAxLgorcnVsZShbXSwgICAgICAgIEwsICAgICAgTDEsIEwyLCBfLCAgIDEsICAgIF8sICAgXywgMiwgTCwgW10pIDotCisJCQkJCQkJTDIgaXMgTDEgKyBMMS4KK3J1bGUoW2ksaSxpfFRdLCBbdXxUXSwgIEwxLCBMMiwgUGluLCBQb3V0LCBQb3MsIF8sIDMsIF8sIF8pIDotIAorCQkJCQkJCVBvcyA+PSBQaW4sCisJCQkJCQkJUG91dCBpcyBQb3MgLSAxLAorCQkJCQkJCUwyIGlzIEwxIC0gMi4KK3J1bGUoW3UsdXxUXSwgICBULCAgICAgIEwxLCBMMiwgUGluLCBQb3V0LCBQb3MsIGksIDQsIF8sIF8pIDotCisJCQkJCQkJUG9zID49IFBpbiwKKwkJCQkJCQlQb3V0IGlzIFBvcyAtIDIsCisJCQkJCQkJTDIgaXMgTDEgLSAyLgorcnVsZShbSHxUMV0sICAgIFtIfFQyXSwgTDEsIEwyLCBQaW4sIFBvdXQsIFBvcywgXywgTiwgTCwgW0h8WF0pIDotCisJUG9zMSBpcyBQb3MgKyAxLAorCXJ1bGUoVDEsICBUMiwgIEwxLCBMMiwgUGluLCBQb3V0LCBQb3MxLCBILCBOLCBMLCBYKS4KKworJSBwcmludF9yZXN1bHRzKFtdLCBfKS4KKyUgcHJpbnRfcmVzdWx0cyhbcnVsZShOLEcpfFRdLCBNKSA6LQorJSAJTTEgaXMgTSArIDEsCislIAl3cml0ZShNMSksIHdyaXRlKCcgICcpLCBwcmludF9ydWxlKE4pLCB3cml0ZShHKSwgbmwsCislIAlwcmludF9yZXN1bHRzKFQsIE0xKS4KKyUgCislIHByaW50X3J1bGUoMCkgOi0gd3JpdGUoJ2F4aW9tICAgICcpLgorJSBwcmludF9ydWxlKE4pIDotIE4gPVw9IDAsIHdyaXRlKCdydWxlICcpLCB3cml0ZShOKSwgd3JpdGUoJyAgICcpLgorJSAKK2xvd2VyX2JvdW5kKE4sIE0sIDEpIDotIE4gPCBNLgorbG93ZXJfYm91bmQoTiwgTiwgMikuCitsb3dlcl9ib3VuZChOLCBNLCBCKSA6LQorICAgICAgICBOID4gTSwKKyAgICAgICAgRGlmZiBpcyBOIC0gTSwKKwlQIGlzIERpZmYvXDEsICAgICAgICAgICAgICUgdXNlIGFuZCB0byBkbyBldmVuIHRlc3QKKyAgICAgICAgKFAgPTo9IDAgLT4KKyAgICAgICAgICAgICAgICBCIGlzIERpZmYgPj4gMTsgICAlIHVzZSBzaGlmdHMgdG8gZGl2aWRlIGJ5IDIKKyAgICAgICAgICAgICAgICBCIGlzICgoRGlmZiArIDEpID4+IDEpICsgMSkuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9mbGF0dGVuLmluIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvZmxhdHRlbi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTdkMTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvZmxhdHRlbi5pbgpAQCAtMCwwICsxIEBACis6LSAnJGJlbmNobWFyaycoZmxhdHRlbiwgMTAwMCwgbWFpbiwgJyRkdW1teScpLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvZmxhdHRlbi5wbCBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL2ZsYXR0ZW4ucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1ODQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL2ZsYXR0ZW4ucGwKQEAgLTAsMCArMSwxOTEgQEAKKy8qIENIQU5HRUxPRyBieSBNLkJhbmJhcmEKKyAgIC0gbmFtZS8yIC0tPiAgYXRvbV9jb2Rlcy8yIG9yIG51bWJlcl9jb2Rlcy8yCisgICAtIGNvbW1lbnQgb3V0IHdyaXRlLzEKKyovCisKKyUgcHJlcHJvY2Vzc2luZyBwaGFzZSB0byBlbGltaW5hdGUgZGlzanVuY3Rpb25zIGZyb20gdGhlIGNvZGUKKworJSB0YWtlcyBhIGxpc3Qgb2YgY2xhdXNlcyBvZiB0aGUgZm9ybSBzb3VyY2UoTmFtZSxDbGF1c2UpCislIHJldHVybnMgdGhlc2UgY2xhdXNlcyB3aXRoIGRpc2p1bmN0aW9ucyByZXBsYWNlZCBieSBkdW1teSBjYWxscworJSBhbmQgYSBsaXN0IG9mIE5ld0NsYXVzZXMgY29ycmVzcG9uZGluZyB0byB0aG9zZSBkdW1teSBjYWxscworJSBMaW5rIGlzIHRoZSB1bmluc3RhbnRpYXRlZCBsYXN0IGNkciBvZiB0aGlzIGxpc3QKKworbWFpbiA6LSAKKwllbGltaW5hdGVfZGlzanVuY3Rpb25zKFsoYShBLEIsQyk6LShiKEEpO2MoQykpKV0sWCxZLFtdKSwKKwlpbnN0X3ZhcnMoKFgsWSkpLgorCSV3cml0ZSgoWCxZKSksIG5sLAorCSUgKFgsWSkgPT0gKFsoYTotJ19kdW1teV8wJyldLFsoJ19kdW1teV8wJzotYiksKCdfZHVtbXlfMCc6LWMpXSksCisJJXdyaXRlKG9rKSwgbmwuCittYWluLgorJW1haW4gOi0gd3JpdGUod3JvbmcpLCBubC4KKworZWxpbWluYXRlX2Rpc2p1bmN0aW9ucyhPbmVQcm9jLE5ld1Byb2MsTmV3Q2xhdXNlcyxMaW5rKSA6LQorCWdhdGhlcl9kaXNqKE9uZVByb2MsTmV3UHJvYyxEaXNqLFtdKSwKKwl0cmVhdF9kaXNqKERpc2osTmV3Q2xhdXNlcyxMaW5rKS4KKworZ2F0aGVyX2Rpc2ooW10sW10sTGluayxMaW5rKS4KK2dhdGhlcl9kaXNqKFtDfENzXSxOZXdQcm9jLERpc2osTGluaykgOi0KKwlleHRyYWN0X2Rpc2ooQywgTmV3QywgRGlzaiwgUmVzdCksCisJTmV3UHJvYyA9IFtOZXdDfE5ld0NzXSwKKwlnYXRoZXJfZGlzaihDcyxOZXdDcyxSZXN0LExpbmspLgorCislIGdpdmVuIGEgY2xhdXNlLCBmaW5kIGluIERpc2ogdGhlIGxpc3Qgb2YgZGlzaigoQTtCKSxOLFgsQykKKyUgd2hlcmUgTiBpcyBhIHVuaXF1ZSBJRCwgWCBpcyBhIHZhciB0aGF0IHRha2VzIHRoZSBwbGFjZSBvZgorJSAoQTtCKSBpbiB0aGUgY29kZSwgTmV3QyBpcyB0aGUgY2xhdXNlIG1vZGlmaWVkIGluIHN1Y2ggYSB3YXkgdGhhdAorJSB0aGUgZGlzanVuY3Rpb25zIGFyZSByZXBsYWNlZCBieSB0aGUgY29ycmVzcG9uZGluZyB2YXJzCislIExpbmsgaXMgdGhlIGxhc3QgKHVuaW5zdGFudGlhdGVkKSBjZHIgb2YgdGhlIGxpc3QgRGlzai4KKyUgZG8gdGhlIHdvcmsgb2YgcHJldHJhbnMgZm9yIG5vdHMsIC0+IGV0Yy4uLgorJSBwdXQgYWxsIHRob3NlIGd1eXMgaW5zaWRlIGRpc2p1bmN0aW9ucyAKK2V4dHJhY3RfZGlzaihDLCAoSGVhZDotTmV3Qm9keSksIERpc2osIExpbmspIDotCisJQyA9IChIZWFkOi1Cb2R5KSwgISwKKwlDdHJJbiA9IDAsCisJZXh0cmFjdF9kaXNqKEJvZHksIE5ld0JvZHksIERpc2osIExpbmssIEMsIEN0ckluLCBDdHJPdXQpLgorZXh0cmFjdF9kaXNqKEhlYWQsIEhlYWQsIExpbmssIExpbmspLgorCitleHRyYWN0X2Rpc2ooKEMxLEMyKSwgKE5ld0MxLE5ld0MyKSwgRGlzaiwgTGluaywgQywgQ3RySW4sIEN0ck91dCkgOi0KKwlleHRyYWN0X2Rpc2ooQzEsIE5ld0MxLCBEaXNqLCBMaW5rMSwgQywgQ3RySW4sIEN0ciksCisJZXh0cmFjdF9kaXNqKEMyLCBOZXdDMiwgTGluazEsIExpbmssIEMsIEN0ciwgQ3RyT3V0KS4KKwkKK2V4dHJhY3RfZGlzaihHb2FsLCBYLCBEaXNqLCBMaW5rLCBDLCBDdHJJbiwgQ3RyT3V0KSA6LQorCWlzX2Rpc2ooR29hbCxOZXdHb2FsKSwgISwKKwlEaXNqID0gW2Rpc2ooTmV3R29hbCxDdHJJbixYLEMpfExpbmtdLAorCUN0ck91dCBpcyBDdHJJbiArIDEuCitleHRyYWN0X2Rpc2ooR29hbCwgR29hbCwgTGluaywgTGluaywgXywgQ3RySW4sIEN0ckluKS4KKworaXNfZGlzaigoKEMxIC0+IEMyKTsgQzMpLCgoQzEsICEsIEMyKTsgQzMpKSA6LSAhLgoraXNfZGlzaigoQzE7QzIpLChDMTtDMikpLgoraXNfZGlzaihub3QoQyksKChDLCEsZmFpbCk7dHJ1ZSkpLgoraXNfZGlzaihcKyhDKSwoKEMsISxmYWlsKTt0cnVlKSkuCitpc19kaXNqKCdcPScoQzEsQzIpLCgoQzEgPSBDMiwhLGZhaWwpO3RydWUpKS4KKworJSBnaXZlbiBhIGxpc3Qgb2YgZGlzaigoQTtCKSxOLFgsQyksIGZvciBlYWNoLCBkbyB0aGUgZm9sbG93aW5nOgorJSAxKSBmaW5kIHZhcnMgaW4gKEE7QikKKyUgMikgZmluZCB0aGUgdmFycyBpbiBDCislIDMpIGludGVyc2VjdCB0aGUgdHdvIHNldHMgb2YgdmFycyBpbnRvIG9uZSBsaXN0CislIDQpIG1ha2UgYSBwcmVkaWNhdGUgbmFtZSB1c2luZyBOIGFzIGEgcGFydCBvZiBpdCAoJ2R1bW15X2Rpc2pOJykKKyUgNSkgcHV0IGEgc3RydWN0dXJlIHdpdGggdGhhdCBuYW1lIGFuZCB0aG9zZSB2YXJzIGFzIGFyZ3MKKyUgNikgYmluZHMgWCB0byB0aGlzIGNhbGwKKyUgNykgYWRkIG5ldyBjbGF1c2VzIFsoZHVtbXk6LUEpKSwoZHVtbXk6LUIpKV0KK3RyZWF0X2Rpc2ooW10sIExpbmssIExpbmspLgordHJlYXRfZGlzaihbZGlzaigoQTtCKSxOLFgsQyl8RGlzanNdLCBEdW1teUNsYXVzZXMsIExpbmspIDotCisJZmluZF92YXJzKChBO0IpLFZhcnMpLAorCWZpbmRfdmFycyhDLENWYXJzKSwKKwlpbnRlcnNlY3RfdmFycyhWYXJzLENWYXJzLEFyZ3MpLAorCW1ha2VfZHVtbXlfbmFtZShOLE5hbWUpLAorCVggPS4uIFtOYW1lfEFyZ3NdLAorCW1ha2VfZHVtbXlfY2xhdXNlcygoQTtCKSxYLER1bW15Q2xhdXNlcyxSZXN0KSwKKwl0cmVhdF9kaXNqKERpc2pzLCBSZXN0LCBMaW5rKS4KKworbWFrZV9kdW1teV9jbGF1c2VzKChBO0IpLFgsW05ld0N8Q3NdLExpbmspIDotIAorCSEsCisJY29weSgoWDotQSksIE5ld0MpLAorCW1ha2VfZHVtbXlfY2xhdXNlcyhCLFgsQ3MsTGluaykuCittYWtlX2R1bW15X2NsYXVzZXMoQSxYLFtOZXdDfExpbmtdLExpbmspIDotIGNvcHkoKFg6LUEpLE5ld0MpLgorCitmaW5kX3ZhcnMoWCxZKSA6LSBmaW5kX3ZhcnMoWCxZLExpbmspLCBMaW5rID0gW10uCisKK2ZpbmRfdmFycyhWYXIsW1ZhcnxMaW5rXSxMaW5rKSA6LSB2YXIoVmFyKSwgIS4KK2ZpbmRfdmFycyhDc3QsTGluayxMaW5rKSA6LSBhdG9taWMoQ3N0KSwgIS4KK2ZpbmRfdmFycyhbVHxUc10sVmFycyxOZXdMaW5rKSA6LSAhLAorCWZpbmRfdmFycyhULFZhcnMsTGluayksCisJZmluZF92YXJzKFRzLExpbmssTmV3TGluaykuCitmaW5kX3ZhcnMoVGVybSxWYXJzLExpbmspIDotCisJVGVybSA9Li4gW198QXJnc10sCisJZmluZF92YXJzKEFyZ3MsVmFycyxMaW5rKS4KKworaW50ZXJzZWN0X3ZhcnMoVjEsVjIsT3V0KSA6LQorCXNvcnRfdmFycyhWMSxTb3J0ZWQxKSwKKwlzb3J0X3ZhcnMoVjIsU29ydGVkMiksCisJaW50ZXJzZWN0X3NvcnRlZF92YXJzKFNvcnRlZDEsU29ydGVkMixPdXQpLgorCitzb3J0X3ZhcnMoVixPdXQpIDotIHNvcnRfdmFycyhWLE91dCxbXSkuCitzb3J0X3ZhcnMoW10sTGluayxMaW5rKS4KK3NvcnRfdmFycyhbVnxWc10sUmVzdWx0LExpbmspIDotCisJc3BsaXRfdmFycyhWcyxWLFNtYWxsZXIsQmlnZ2VyKSwKKwlzb3J0X3ZhcnMoU21hbGxlcixSZXN1bHQsW1Z8U0xpbmtdKSwKKwlzb3J0X3ZhcnMoQmlnZ2VyLFNMaW5rLExpbmspLgorCitzcGxpdF92YXJzKFtdLF8sW10sW10pLgorc3BsaXRfdmFycyhbVnxWc10sQSxbVnxTc10sQnMpIDotCisJViBAPCBBLCAhLAorCXNwbGl0X3ZhcnMoVnMsQSxTcyxCcykuCitzcGxpdF92YXJzKFtWfFZzXSxBLFNzLEJzKSA6LQorCVYgPT0gQSwgISwKKwlzcGxpdF92YXJzKFZzLEEsU3MsQnMpLgorc3BsaXRfdmFycyhbVnxWc10sQSxTcyxbVnxCc10pIDotCisJViBAPiBBLCAhLAorCXNwbGl0X3ZhcnMoVnMsQSxTcyxCcykuCisKK2ludGVyc2VjdF9zb3J0ZWRfdmFycyhbXSxfLFtdKSA6LSAhLgoraW50ZXJzZWN0X3NvcnRlZF92YXJzKF8sW10sW10pLgoraW50ZXJzZWN0X3NvcnRlZF92YXJzKFtYfFhzXSxbWXxZc10sW1h8UnNdKSA6LQorCVggPT0gWSwgISwKKwlpbnRlcnNlY3Rfc29ydGVkX3ZhcnMoWHMsWXMsUnMpLgoraW50ZXJzZWN0X3NvcnRlZF92YXJzKFtYfFhzXSxbWXxZc10sUnMpIDotCisJWCBAPCBZLCAhLAorCWludGVyc2VjdF9zb3J0ZWRfdmFycyhYcyxbWXxZc10sUnMpLgoraW50ZXJzZWN0X3NvcnRlZF92YXJzKFtYfFhzXSxbWXxZc10sUnMpIDotCisJWCBAPiBZLCAhLAorCWludGVyc2VjdF9zb3J0ZWRfdmFycyhbWHxYc10sWXMsUnMpLgorCittYWtlX2R1bW15X25hbWUoTixOYW1lKSA6LQorCSVuYW1lKCdfZHVtbXlfJyxMMSksCisJYXRvbV9jb2RlcygnX2R1bW15XycsTDEpLAorCSVuYW1lKE4sTDIpLAorCW51bWJlcl9jb2RlcyhOLEwyKSwKKwlhcHBlbmQoTDEsTDIsTCksCisJJW5hbWUoTmFtZSxMKS4KKwlhdG9tX2NvZGVzKE5hbWUsTCkuCisKK2FwcGVuZChbXSwgTCwgTCkuCithcHBlbmQoW0h8TDFdLCBMMiwgW0h8UmVzXSkgOi0gYXBwZW5kKEwxLCBMMiwgUmVzKS4KKworJSBjb3B5X3Rlcm0gdXNpbmcgYSBzeW1ib2wgdGFibGUuCitjb3B5KFRlcm0xLCBUZXJtMikgOi0KKyAgICAgICAgdmFyc2V0KFRlcm0xLCBTZXQpLCBtYWtlX3N5bShTZXQsIFN5bSksCisgICAgICAgIGNvcHkyKFRlcm0xLCBUZXJtMiwgU3ltKSwgIS4KKworY29weTIoVjEsIFYyLCBTeW0pIDotIHZhcihWMSksICEsIHJldHJpZXZlX3N5bShWMSwgU3ltLCBWMikuCitjb3B5MihYMSwgWDIsIFN5bSkgOi0gbm9udmFyKFgxKSwgISwKKyAgICAgICAgZnVuY3RvcihYMSxOYW1lLEFyaXR5KSwKKyAgICAgICAgZnVuY3RvcihYMixOYW1lLEFyaXR5KSwKKyAgICAgICAgY29weTIoWDEsIFgyLCBTeW0sIDEsIEFyaXR5KS4KKworY29weTIoX1gxLF9YMixfU3ltLCBOLCBBcml0eSkgOi0gTj5Bcml0eSwgIS4KK2NvcHkyKFgxLCBYMiwgU3ltLCBOLCBBcml0eSkgOi0gTj08QXJpdHksICEsCisgICAgICAgIGFyZyhOLCBYMSwgQXJnMSksCisgICAgICAgIGFyZyhOLCBYMiwgQXJnMiksCisgICAgICAgIGNvcHkyKEFyZzEsIEFyZzIsIFN5bSksCisgICAgICAgIE4xIGlzIE4rMSwKKyAgICAgICAgY29weTIoWDEsIFgyLCBTeW0sIE4xLCBBcml0eSkuCisKK3JldHJpZXZlX3N5bShWLCBbcChXLFgpfF9TeW1dLCBYKSA6LSBWPT1XLCAhLgorcmV0cmlldmVfc3ltKFYsIFtffFN5bV0sIFgpIDotIHJldHJpZXZlX3N5bShWLCBTeW0sIFgpLgorCittYWtlX3N5bShbXSwgW10pLgorbWFrZV9zeW0oW1Z8TF0sIFtwKFYsXyl8U10pIDotIG1ha2Vfc3ltKEwsIFMpLgorCislICoqKiBHYXRoZXIgYWxsIHZhcmlhYmxlcyB1c2VkIGluIGEgdGVybTogKGluIGEgc2V0IG9yIGEgYmFnKQordmFyc2V0KFRlcm0sIFZhclNldCkgOi0gdmFyYmFnKFRlcm0sIFZCKSwgc29ydChWQiwgVmFyU2V0KS4KK3ZhcmJhZyhUZXJtLCBWYXJCYWcpIDotIHZhcmJhZyhUZXJtLCBWYXJCYWcsIFtdKS4KKwordmFyYmFnKFZhcikgLS0+IHt2YXIoVmFyKX0sICEsIFtWYXJdLgordmFyYmFnKFN0cikgLS0+IHtub252YXIoU3RyKSwgISwgZnVuY3RvcihTdHIsXyxBcml0eSl9LCB2YXJiYWcoU3RyLCAxLCBBcml0eSkuCisKK3ZhcmJhZyhfU3RyLCBOLCBBcml0eSkgLS0+IHtOPkFyaXR5fSwgIS4KK3ZhcmJhZyhTdHIsIE4sIEFyaXR5KSAtLT4ge049PEFyaXR5fSwgISwKKyAgICAgICAge2FyZyhOLCBTdHIsIEFyZyl9LCB2YXJiYWcoQXJnKSwKKyAgICAgICAge04xIGlzIE4rMX0sCisgICAgICAgIHZhcmJhZyhTdHIsIE4xLCBBcml0eSkuCisKK2luc3RfdmFycyhUZXJtKSA6LQorCXZhcnNldChUZXJtLCBWYXJzKSwKKwlBIGlzICJBIiwKKwlpbnN0X3ZhcnNfbGlzdChWYXJzLCBBKS4KKworaW5zdF92YXJzX2xpc3QoW10sIF8pLgoraW5zdF92YXJzX2xpc3QoW1R8TF0sIE4pIDotCisJJW5hbWUoVCwgW05dKSwKKwlhdG9tX2NvZGVzKFQsIFtOXSksCisJTjEgaXMgTisxLAorCWluc3RfdmFyc19saXN0KEwsIE4xKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL2xvZzEwLmluIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvbG9nMTAuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcyYTQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL2xvZzEwLmluCkBAIC0wLDAgKzEgQEAKKzotICckYmVuY2htYXJrJyhsb2cxMCwgMTAwMCwgbG9nMTAsICckZHVtbXknKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL2xvZzEwLnBsIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvbG9nMTAucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1NTYyZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL2xvZzEwLnBsCkBAIC0wLDAgKzEsMzUgQEAKKyUgZ2VuZXJhdGVkOiAyNSBPY3RvYmVyIDE5ODkKKyUgb3B0aW9uKHMpOiAKKyUKKyUgICAoZGVyaXYpIGxvZzEwCislCislICAgRGF2aWQgSC4gRC4gV2FycmVuCislCislICAgc3ltYm9saWMgZGVyaXZhdGl2ZSBvZiBsb2cobG9nKGxvZyhsb2cobG9nKGxvZyhsb2cobG9nKGxvZyhsb2coeCkpKSkpKSkpKSkKKworbG9nMTAgOi0gZChsb2cobG9nKGxvZyhsb2cobG9nKGxvZyhsb2cobG9nKGxvZyhsb2coeCkpKSkpKSkpKSkseCxfKS4KKworZChVK1YsWCxEVStEVikgOi0gISwgCisgICAgZChVLFgsRFUpLAorICAgIGQoVixYLERWKS4KK2QoVS1WLFgsRFUtRFYpIDotICEsCisgICAgZChVLFgsRFUpLAorICAgIGQoVixYLERWKS4KK2QoVSpWLFgsRFUqVitVKkRWKSA6LSAhLAorICAgIGQoVSxYLERVKSwKKyAgICBkKFYsWCxEVikuCitkKFUvVixYLChEVSpWLVUqRFYpLyheKFYsMikpKSA6LSAhLAorICAgIGQoVSxYLERVKSwKKyAgICBkKFYsWCxEVikuCitkKF4oVSxOKSxYLERVKk4qKF4oVSxOMSkpKSA6LSAhLCAKKyAgICBpbnRlZ2VyKE4pLAorICAgIE4xIGlzIE4tMSwKKyAgICBkKFUsWCxEVSkuCitkKC1VLFgsLURVKSA6LSAhLAorICAgIGQoVSxYLERVKS4KK2QoZXhwKFUpLFgsZXhwKFUpKkRVKSA6LSAhLAorICAgIGQoVSxYLERVKS4KK2QobG9nKFUpLFgsRFUvVSkgOi0gISwKKyAgICBkKFUsWCxEVSkuCitkKFgsWCwxKSA6LSAhLgorZChfLF8sMCkuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9tZXRhX3Fzb3J0LmluIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvbWV0YV9xc29ydC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmMyNGYzCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvbWV0YV9xc29ydC5pbgpAQCAtMCwwICsxIEBACis6LSAnJGJlbmNobWFyaycobWV0YV9xc29ydCwgMTAwMCwgbWV0YV9xc29ydCwgJyRkdW1teScpLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvbWV0YV9xc29ydC5wbCBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL21ldGFfcXNvcnQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhMjc3YgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL21ldGFfcXNvcnQucGwKQEAgLTAsMCArMSwxMDIgQEAKKyUgZ2VuZXJhdGVkOiA4IE1hcmNoIDE5OTAKKyUgb3B0aW9uKHMpOiAKKyUKKyUgICBtZXRhX3Fzb3J0CislCislICAgUmFscGggTS4gSGF5Z29vZAorJQorJSAgIG1ldGEtaW50ZXJwcmV0IFdhcnJlbiBiZW5jaG1hcmsgcXNvcnQKKyUKKyUgRm9yIGFueSBtZXRhLXZhcmlhYmxlIH5YfiwgaW50ZXJwcmV0KH5YfikgYmVoYXZlcyBhcyBpZgorJSAgIAorJSAgaW50ZXJwcmV0KH5YfikgOi0gflh+LgorJSAgCislICBUaHVzLCBmb3IgZXhhbXBsZSwgaW50ZXJwcmV0KChmb28oWCksIGJhcihYKSwgISkpIGJlaGF2ZXMgYXMgaWYKKyUgIAorJSAgaW50ZXJwcmV0KChmb28oWCksIGJhcihYKSwgISkpIDotIGZvbyhYKSwgYmFyKFgpLCAhLgorJSAgCislICBOb3RlIHRoYXQgdGhvdWdoIH5YfiBtYXkgY29udGFpbiBjdXRzLCB0aG9zZSBjdXRzIGNhbm5vdCBlc2NhcGUgZnJvbQorJSAgaW50ZXJwcmV0KH5YfikgdG8gZWZmZWN0IHRoZSBwYXJlbnQgZ29hbDsgaW50ZXJwcmV0KCEpIGlzIGVxdWl2YWxlbnQKKyUgIHRvIHRydWUuCislICAKKyUgIEN1dHMgaW5zaWRlIH5YfiBhcmUgZXhlY3V0ZWQgYWNjb3JkaW5nIHRvIHRoZSBydWxlIHRoYXQgY29uanVuY3Rpb24sCislICBkaXNqdW5jdGlvbiwgYW5kIGlmLXRoZW4tZWxzZSBhcmUgdHJhbnNwYXJlbnQgdG8gY3V0cywgYW5kIGFueSBvdGhlcgorJSAgZm9ybSBpcyB0cmFuc3BhcmVudCB0byBjdXRzIGlmIGFuZCBvbmx5IGlmIGl0IGNhbiBiZSBtYWNyby1leHBhbmRlZAorJSAgaW50byBhIGZvcm0gaW52b2x2aW5nIG9ubHkgdGhlc2UgdGhyZWUgd2l0aG91dCBpbnRlcnByZXQvMS4gIElmLXRoZW4KKyUgIGFuZCBuZWdhdGlvbiBhcmUgdGhlIG9ubHkgc3VjaCBvdGhlciBmb3JtcyBjdXJyZW50bHkgcmVjb2duaXplZDsgKCBBCislICAtPiBCKSBpcyBlcXVpdmFsZW50IHRvICggQSAtPiBCIDsgZmFpbCApLCBhbmQgXCsgQSBpcyBlcXVpdmFsZW50IHRvCislICAoIEEgLT4gZmFpbCA7IHRydWUgKS4KKworbWV0YV9xc29ydCA6LSBpbnRlcnByZXQocXNvcnQpLgorCitpbnRlcnByZXQoR29hbCkgOi0KKwlpbnRlcnByZXQoR29hbCwgUmVzdCksCisJKCBub252YXIoUmVzdCksICEsCisJICBpbnRlcnByZXQoUmVzdCkgCisJOyB0cnVlIAorCSkuCisKK2ludGVycHJldChHLCBfKSA6LQorCXZhcihHKSwgISwKKwlmYWlsLgoraW50ZXJwcmV0KChBLCBCKSwgUmVzdCkgOi0gISwKKwlpbnRlcnByZXQoQSwgUmVzdDApLAorCSggbm9udmFyKFJlc3QwKSAtPgorCSAgICBSZXN0ID0gKFJlc3QwLCBCKQorCTsgaW50ZXJwcmV0KEIsIFJlc3QpCisJKS4KK2ludGVycHJldCgoQSA7IEIpLCBSZXN0KSA6LSAhLAorCWludGVycHJldF9kaXNqdW5jdGlvbihBLCBCLCBSZXN0KS4KK2ludGVycHJldCgoQSAtPiBCKSwgUmVzdCkgOi0gISwKKwlpbnRlcnByZXRfZGlzanVuY3Rpb24oKEEgLT4gQiksIGZhaWwsIFJlc3QpLgoraW50ZXJwcmV0KFwrQSwgUmVzdCkgOi0gISwKKwlpbnRlcnByZXRfZGlzanVuY3Rpb24oKEEgLT4gZmFpbCksIHRydWUsIFJlc3QpLgoraW50ZXJwcmV0KCEsIHRydWUpIDotICEuCitpbnRlcnByZXQoRywgXykgOi0KKwludW1iZXIoRyksICEsCisJZmFpbC4KK2ludGVycHJldChHLCBfKSA6LQorCWlzX2J1aWx0X2luKEcpLCAhLAorCWludGVycHJldF9idWlsdF9pbihHKS4KK2ludGVycHJldChHLCBfKSA6LQorCWRlZmluZShHLCBCb2R5KSwKKwlpbnRlcnByZXQoQm9keSkuCisKK2ludGVycHJldF9kaXNqdW5jdGlvbigoQSAtPiBCKSwgXywgUmVzdCkgOi0KKwlpbnRlcnByZXQoQSwgUmVzdDApLCAhLAorCSggbm9udmFyKFJlc3QwKSAtPgorCSAgICBSZXN0ID0gKFJlc3QwIC0+IEIpCisJOyBpbnRlcnByZXQoQiwgUmVzdCkKKwkpLgoraW50ZXJwcmV0X2Rpc2p1bmN0aW9uKChfIC0+IF8pLCBDLCBSZXN0KSA6LSAhLAorCWludGVycHJldChDLCBSZXN0KS4KK2ludGVycHJldF9kaXNqdW5jdGlvbihBLCBfLCBSZXN0KSA6LQorCWludGVycHJldChBLCBSZXN0KS4KK2ludGVycHJldF9kaXNqdW5jdGlvbihfLCBCLCBSZXN0KSA6LQorCWludGVycHJldChCLCBSZXN0KS4KKworaXNfYnVpbHRfaW4odHJ1ZSkuCitpc19idWlsdF9pbihfPTxfKS4KKworaW50ZXJwcmV0X2J1aWx0X2luKHRydWUpLgoraW50ZXJwcmV0X2J1aWx0X2luKFg9PFkpIDotIFggPTwgWS4KKworZGVmaW5lKHFzb3J0LCgKKyAgICAgICBxc29ydChbMjcsNzQsMTcsMzMsOTQsMTgsNDYsODMsNjUsIDIsCisgICAgICAgICAgICAgIDMyLDUzLDI4LDg1LDk5LDQ3LDI4LDgyLCA2LDExLAorICAgICAgICAgICAgICA1NSwyOSwzOSw4MSw5MCwzNywxMCwgMCw2Niw1MSwKKyAgICAgICAgICAgICAgIDcsMjEsODUsMjcsMzEsNjMsNzUsIDQsOTUsOTksCisgICAgICAgICAgICAgIDExLDI4LDYxLDc0LDE4LDkyLDQwLDUzLDU5LCA4XSxfLFtdKSkpLgorCitkZWZpbmUocXNvcnQoW1h8TF0sUixSMCksKAorICAgICAgIHBhcnRpdGlvbihMLFgsTDEsTDIpLAorICAgICAgIHFzb3J0KEwyLFIxLFIwKSwKKyAgICAgICBxc29ydChMMSxSLFtYfFIxXSkpKS4KK2RlZmluZShxc29ydChbXSxSLFIpLHRydWUpLgorCitkZWZpbmUocGFydGl0aW9uKFtYfExdLFksW1h8TDFdLEwyKSwoCisgICAgICAgWD08WSwhLAorICAgICAgIHBhcnRpdGlvbihMLFksTDEsTDIpKSkuCitkZWZpbmUocGFydGl0aW9uKFtYfExdLFksTDEsW1h8TDJdKSwoCisgICAgICAgcGFydGl0aW9uKEwsWSxMMSxMMikpKS4KK2RlZmluZShwYXJ0aXRpb24oW10sXyxbXSxbXSksdHJ1ZSkuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9tdS5pbiBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL211LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MDlkOGEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9tdS5pbgpAQCAtMCwwICsxIEBACis6LSAnJGJlbmNobWFyaycobXUsIDEwMDAsIG11LCAnJGR1bW15JykuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9tdS5wbCBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL211LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNzNkMGQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9tdS5wbApAQCAtMCwwICsxLDQxIEBACislIGdlbmVyYXRlZDogOSBOb3ZlbWJlciAxOTg5CislIG9wdGlvbihzKTogCislCislICAgbXUKKyUKKyUgICBkZXJpdmVkIGZyb20gRG91Z2xhcyBSLiBIb2ZzdGFkdGVyLCAiR29kZWwsIEVzY2hlciwgQmFjaCwiIHBhZ2VzIDMzLTM1LgorJQorJSAgIHByb3ZlICJtdS1tYXRoIiB0aGVvcmVtIG11aWl1CisKK211IDotIHRoZW9yZW0oW20sdSxpLGksdV0sIDUsIF8pLCAhLgorCit0aGVvcmVtKFttLGldLCBfLCBbW2F8W20saV1dXSkuCit0aGVvcmVtKFIsIERlcHRoLCBbW058Ul18UF0pIDotCisgICAgRGVwdGggPiAwLAorICAgIEQgaXMgRGVwdGgtMSwKKyAgICB0aGVvcmVtKFMsIEQsIFApLAorICAgIHJ1bGUoTiwgUywgUikuCisKK3J1bGUoMSwgUywgUikgOi0gcnVsZTEoUywgUikuCitydWxlKDIsIFMsIFIpIDotIHJ1bGUyKFMsIFIpLgorcnVsZSgzLCBTLCBSKSA6LSBydWxlMyhTLCBSKS4KK3J1bGUoNCwgUywgUikgOi0gcnVsZTQoUywgUikuCisKK3J1bGUxKFtpXSwgW2ksdV0pLgorcnVsZTEoW0h8WF0sIFtIfFldKSA6LQorICAgIHJ1bGUxKFgsIFkpLgorCitydWxlMihbbXxYXSwgW218WV0pIDotIAorICAgIGFwcGVuZChYLCBYLCBZKS4KKworcnVsZTMoW2ksaSxpfFhdLCBbdXxYXSkuCitydWxlMyhbSHxYXSwgW0h8WV0pIDotCisgICAgcnVsZTMoWCwgWSkuCisKK3J1bGU0KFt1LHV8WF0sIFgpLgorcnVsZTQoW0h8WF0sIFtIfFldKSA6LQorICAgIHJ1bGU0KFgsIFkpLgorCithcHBlbmQoW10sIFgsIFgpLgorYXBwZW5kKFtBfEJdLCBYLCBbQXxCMV0pIDotCisgICAgYXBwZW5kKEIsIFgsIEIxKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL25hbmQucGwuYmFrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvbmFuZC5wbC5iYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4Nzk1MwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL25hbmQucGwuYmFrCkBAIC0wLDAgKzEsNTYyIEBACislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJQorJSAgVGhpcyBpcyBhIHJvdWdoIGFwcHJveGltYXRpb24gdG8gdGhlIGFsZ29yaXRobSBwcmVzZW50ZWQgaW46CislCislCSJBbiBBbGdvcml0aG0gZm9yIE5BTkQgRGVjb21wb3NpdGlvbiBVbmRlciBOZXR3b3JrIENvbnN0cmFpbnRzLCIKKyUJSUVFRSBUcmFucy4gQ29tcC4sIHZvbCBDLTE4LCBuby4gMTIsIERlYy4gMTk2OSwgcC4gMTA5OAorJQlieSBFLiBTLiBEYXZpZHNvbi4KKyUKKyUgIFdyaXR0ZW4gYnkgQnJ1Y2UgSG9sbWVyCislCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJQorJSAgSSBoYXZlIHVzZWQgdGhlIHBhcGVyJ3MgdGVybWlub2xvZ3kgZm9yIG5hbWVzIHVzZWQgaW4gdGhlIHByb2dyYW0uCislCislICBUaGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHJlcHJlc2VudGluZyBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBpcworJQkJZnVuY3Rpb24oRnVuY3Rpb25OdW1iZXIsIFRydWVTZXQsIEZhbHNlU2V0LAorJQkJCUNvbmNlaXZhYmxlSW5wdXRzLAorJQkJCUltbWVkaWF0ZVByZWRlY2Vzc29ycywgSW1tZWRpYXRlU3VjY2Vzc29ycywKKyUJCQlQcmVkZWNlc3NvcnMsIFN1Y2Nlc3NvcnMpCislCislCislICBDb21tb24gbmFtZXMgdXNlZCBpbiB0aGUgcHJvZ3JhbToKKyUKKyUJTnVtVmFycwkJbnVtYmVyIG9mIHZhcmlhYmxlcyAoc2lnbmFsIGlucHV0cykKKyUJTnVtR3MJCWN1cnJlbnQgbnVtYmVyIG9mIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zCislCUdzCQlsaXN0IG9mIHZhcmlhYmxlIGFuZCBmdW5jdGlvbiBkYXRhCislCUdpLEdqLEdrLEdsCWluZGl2aWR1YWwgdmFyaWFibGUgb3IgZnVuY3Rpb24tLWxldHRlciBjb3JyZXNwb25kcyB0bworJQkJCXRoZSBzdWJzY3JpcHQgaW4gdGhlIHBhcGVyIChtb3N0IG9mIHRoZSB0aW1lKQorJQlWZWN0b3IsVgl2ZWN0b3IgZnJvbSBhIGZ1bmN0aW9uJ3MgdHJ1ZSBzZXQKKyUKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCisKK21haW4gOi0gbWFpbigwKS4KKworbWFpbihOKSA6LQorCWluaXRfc3RhdGUoTiwgTnVtVmFycywgTnVtR3MsIEdzKSwKKwlhZGRfbmVjZXNzYXJ5X2Z1bmN0aW9ucyhOdW1WYXJzLCBOdW1HcywgR3MsIE51bUdzMiwgR3MyKSwKKwl0ZXN0X2JvdW5kcyhOdW1WYXJzLCBOdW1HczIsIEdzMiksCisJc2VhcmNoKE51bVZhcnMsIE51bUdzMiwgR3MyKS4KK21haW4oXykgOi0KKwl3cml0ZSgnU2VhcmNoIGNvbXBsZXRlZCcpLCBubC4KKworJSAgVGVzdCBpbnB1dAorJSAgaW5pdF9zdGF0ZShjaXJjdWl0KE51bUlucHV0cywgTnVtT3V0cHV0cywgRnVuY3Rpb25MaXN0KSkKK2luaXRfc3RhdGUoMCwgMiwgMywgWwkJJSAyIGlucHV0IHhvcgorCQlmdW5jdGlvbigyLCBbMSwyXSwgWzAsM10sIFtdLCBbXSwgW10sIFtdLCBbXSksCisJCWZ1bmN0aW9uKDEsIFsyLDNdLCBbMCwxXSwgW10sIFtdLCBbXSwgW10sIFtdKSwKKwkJZnVuY3Rpb24oMCwgWzEsM10sIFswLDJdLCBbXSwgW10sIFtdLCBbXSwgW10pCisJCV0pIDotCisJdXBkYXRlX2JvdW5kcyhfLCAxMDAsIF8pLgoraW5pdF9zdGF0ZSgxLCAzLCA0LCBbCQklIGNhcnJ5IGNpcmN1aXQKKwkJZnVuY3Rpb24oMywgWzMsNSw2LDddLCBbMCwxLDIsNF0sIFtdLCBbXSwgW10sIFtdLCBbXSksCisJCWZ1bmN0aW9uKDIsIFs0LDUsNiw3XSwgWzAsMSwyLDNdLCBbXSwgW10sIFtdLCBbXSwgW10pLAorCQlmdW5jdGlvbigxLCBbMiwzLDYsN10sIFswLDEsNCw1XSwgW10sIFtdLCBbXSwgW10sIFtdKSwKKwkJZnVuY3Rpb24oMCwgWzEsMyw1LDddLCBbMCwyLDQsNl0sIFtdLCBbXSwgW10sIFtdLCBbXSkKKwkJXSkgOi0KKwl1cGRhdGVfYm91bmRzKF8sIDEwMCwgXykuCitpbml0X3N0YXRlKDIsIDMsIDQsIFsJCSUgZXhhbXBsZSBpbiBwYXBlcgorCQlmdW5jdGlvbigzLCBbMSwyLDQsNiw3XSwgWzAsMyw1XSwgW10sIFtdLCBbXSwgW10sIFtdKSwKKwkJZnVuY3Rpb24oMiwgWzQsNSw2LDddLCBbMCwxLDIsM10sIFtdLCBbXSwgW10sIFtdLCBbXSksCisJCWZ1bmN0aW9uKDEsIFsyLDMsNiw3XSwgWzAsMSw0LDVdLCBbXSwgW10sIFtdLCBbXSwgW10pLAorCQlmdW5jdGlvbigwLCBbMSwzLDUsN10sIFswLDIsNCw2XSwgW10sIFtdLCBbXSwgW10sIFtdKQorCQldKSA6LQorCXVwZGF0ZV9ib3VuZHMoXywgMTAwLCBfKS4KK2luaXRfc3RhdGUoMywgMywgNCwgWwkJJSBzdW0gKDMgaW5wdXQgeG9yKQorCQlmdW5jdGlvbigzLCBbMSwyLDQsN10sIFswLDMsNSw2XSwgW10sIFtdLCBbXSwgW10sIFtdKSwKKwkJZnVuY3Rpb24oMiwgWzQsNSw2LDddLCBbMCwxLDIsM10sIFtdLCBbXSwgW10sIFtdLCBbXSksCisJCWZ1bmN0aW9uKDEsIFsyLDMsNiw3XSwgWzAsMSw0LDVdLCBbXSwgW10sIFtdLCBbXSwgW10pLAorCQlmdW5jdGlvbigwLCBbMSwzLDUsN10sIFswLDIsNCw2XSwgW10sIFtdLCBbXSwgW10sIFtdKQorCQldKSA6LQorCXVwZGF0ZV9ib3VuZHMoXywgMTAwLCBfKS4KK2luaXRfc3RhdGUoNCwgMywgNSwgWwkJJSBkbyBzdW0gYW5kIGNhcnJ5IHRvZ2V0aGVyCisJCWZ1bmN0aW9uKDQsIFszLDUsNiw3XSwgWzAsMSwyLDRdLCBbXSwgW10sIFtdLCBbXSwgW10pLAorCQlmdW5jdGlvbigzLCBbMSwyLDQsN10sIFswLDMsNSw2XSwgW10sIFtdLCBbXSwgW10sIFtdKSwKKwkJZnVuY3Rpb24oMiwgWzQsNSw2LDddLCBbMCwxLDIsM10sIFtdLCBbXSwgW10sIFtdLCBbXSksCisJCWZ1bmN0aW9uKDEsIFsyLDMsNiw3XSwgWzAsMSw0LDVdLCBbXSwgW10sIFtdLCBbXSwgW10pLAorCQlmdW5jdGlvbigwLCBbMSwzLDUsN10sIFswLDIsNCw2XSwgW10sIFtdLCBbXSwgW10sIFtdKQorCQldKSA6LQorCXVwZGF0ZV9ib3VuZHMoXywgMTAwLCBfKS4KK2luaXRfc3RhdGUoNSwgNSwgOCwgWwkJJSAyIGJpdCBmdWxsIGFkZGVyCisJCWZ1bmN0aW9uKDcsCQklIEEyIChvdXRwdXQpCisJCQlbMSwzLDQsNiw5LDExLDEyLDE0LDE2LDE4LDIxLDIzLDI0LDI2LDI5LDMxXSwKKwkJCVswLDIsNSw3LDgsMTAsMTMsMTUsMTcsMTksMjAsMjIsMjUsMjcsMjgsMzBdLAorCQkJW10sIFtdLCBbXSwgW10sIFtdKSwKKwkJZnVuY3Rpb24oNiwJCSUgQjIgKG91dHB1dCkKKwkJCVsyLDMsNSw2LDgsOSwxMiwxNSwxNywxOCwyMCwyMSwyNCwyNywzMCwzMV0sCisJCQlbMCwxLDQsNywxMCwxMSwxMywxNCwxNiwxOSwyMiwyMywyNSwyNiwyOCwyOV0sCisJCQlbXSwgW10sIFtdLCBbXSwgW10pLAorCQlmdW5jdGlvbig1LAkJJSBjYXJyeS1vdXQgKG91dHB1dCkKKwkJCVs3LDEwLDExLDEzLDE0LDE1LDE5LDIyLDIzLDI1LDI2LDI3LDI4LDI5LDMwLDMxXSwKKwkJCVswLDEsMiwzLDQsNSw2LDgsOSwxMiwxNiwxNywxOCwyMCwyMSwyNF0sCisJCQlbXSwgW10sIFtdLCBbXSwgW10pLAorCQlmdW5jdGlvbig0LAkJJSBjYXJyeS1pbgorCQkJWzE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxXSwKKwkJCVswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1XSwKKwkJCVtdLCBbXSwgW10sIFtdLCBbXSksCisJCWZ1bmN0aW9uKDMsCQklIEIxIGlucHV0CisJCQlbOCw5LDEwLDExLDEyLDEzLDE0LDE1LDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxXSwKKwkJCVswLDEsMiwzLDQsNSw2LDcsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjNdLAorCQkJW10sIFtdLCBbXSwgW10sIFtdKSwKKwkJZnVuY3Rpb24oMiwJCSUgQjAgaW5wdXQKKwkJCVs0LDUsNiw3LDEyLDEzLDE0LDE1LDIwLDIxLDIyLDIzLDI4LDI5LDMwLDMxXSwKKwkJCVswLDEsMiwzLDgsOSwxMCwxMSwxNiwxNywxOCwxOSwyNCwyNSwyNiwyN10sCisJCQlbXSwgW10sIFtdLCBbXSwgW10pLAorCQlmdW5jdGlvbigxLCAJCSUgQTEgaW5wdXQKKwkJCVsyLDMsNiw3LDEwLDExLDE0LDE1LDE4LDE5LDIyLDIzLDI2LDI3LDMwLDMxXSwKKwkJCVswLDEsNCw1LDgsOSwxMiwxMywxNiwxNywyMCwyMSwyNCwyNSwyOCwyOV0sCisJCQlbXSwgW10sIFtdLCBbXSwgW10pLAorCQlmdW5jdGlvbigwLAkJJSBBMCBpbnB1dAorCQkJWzEsMyw1LDcsOSwxMSwxMywxNSwxNywxOSwyMSwyMywyNSwyNywyOSwzMV0sCisJCQlbMCwyLDQsNiw4LDEwLDEyLDE0LDE2LDE4LDIwLDIyLDI0LDI2LDI4LDMwXSwKKwkJCVtdLCBbXSwgW10sIFtdLCBbXSkKKwkJXSkgOi0KKwl1cGRhdGVfYm91bmRzKF8sIDIxLCBfKS4KKworCislICBJdGVyYXRlIG92ZXIgYWxsIHRoZSBUUlVFIHZlY3RvcnMgdGhhdCBuZWVkIHRvIGJlIGNvdmVyZWQuCislICBJZiBubyB2ZWN0b3JzIHJlbWFpbiB0byBiZSBjb3ZlcmVkIChzZWxlY3RfdmVjdG9yIGZhaWxzKSwgdGhlbgorJSAgdGhlIGNpcmN1aXQgaXMgY29tcGxldGUgKHByaW50b3V0IHJlc3VsdHMsIHVwZGF0ZSBib3VuZHMsIGFuZAorJSAgY29udGludWUgc2VhcmNoIGZvciBhIGxvd2VyIGNvc3QgY2lyY3VpdCkuCitzZWFyY2goTnVtVmFycywgTnVtR3NJbiwgR3NJbikgOi0KKwlzZWxlY3RfdmVjdG9yKE51bVZhcnMsIE51bUdzSW4sIEdzSW4sIEdqLCBWZWN0b3IpLCAhLAorCWNvdmVyX3ZlY3RvcihOdW1WYXJzLCBOdW1Hc0luLCBHc0luLCBHaiwgVmVjdG9yLCBOdW1HcywgR3MpLAorCWFkZF9uZWNlc3NhcnlfZnVuY3Rpb25zKE51bVZhcnMsIE51bUdzLCBHcywgTnVtR3NPdXQsIEdzT3V0KSwKKwl0ZXN0X2JvdW5kcyhOdW1WYXJzLCBOdW1Hc091dCwgR3NPdXQpLAorCXNlYXJjaChOdW1WYXJzLCBOdW1Hc091dCwgR3NPdXQpLgorc2VhcmNoKE51bVZhcnMsIE51bUdzLCBHcykgOi0KKwlvdXRwdXRfcmVzdWx0cyhOdW1WYXJzLCBOdW1HcywgR3MpLAorCXVwZGF0ZV9ib3VuZHMoTnVtVmFycywgTnVtR3MsIEdzKSwKKwlmYWlsLgorCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSAgR2l2ZW4gdGhlIGN1cnJlbnQgc29sdXRpb24sIHBpY2sgdGhlIGJlc3QgdW5jb3ZlcmVkIFRSVUUgdmVjdG9yCislICBmb3IgY292ZXJpbmcgbmV4dC4KKyUgIFRoZSBzZWxlY3RlZCB2ZWN0b3IgaXMgc3BlY2lmaWVkIGJ5IGl0cyB2ZWN0b3IgbnVtYmVyIGFuZCBmdW5jdGlvbi4KKyUgIFNlbGVjdF92ZWN0b3IgZmFpbHMgaWYgYWxsIFRSVUUgdmVjdG9ycyBhcmUgY292ZXJlZC4KKyUgIFNlbGVjdF92ZWN0b3IgaXMgZGV0ZXJtaW5hbnQgKGdpdmVzIG9ubHkgb25lIHNvbHV0aW9uKS4KK3NlbGVjdF92ZWN0b3IoTnVtVmFycywgTnVtR3MsIEdzLCBHaiwgVmVjdG9yKSA6LQorCXNlbGVjdF92ZWN0b3IoR3MsIE51bVZhcnMsIE51bUdzLCBHcywKKwkJZHVtbXksIDAsIG5mLCA5OTksIEdqLCBWZWN0b3IsIFR5cGUsIF8pLCAhLAorCVwrIFR5cGUgPSBjb3YsCisJXCsgVHlwZSA9IG5mLgorCislIGxvb3Agb3ZlciBmdW5jdGlvbnMKK3NlbGVjdF92ZWN0b3IoW0drfF9dLCBOdW1WYXJzLCBfLCBfLCBHaiwgViwgVHlwZSwgTiwgR2osIFYsIFR5cGUsIE4pIDotCisJZnVuY3Rpb25fbnVtYmVyKEdrLCBLKSwKKwlLIDwgTnVtVmFycy4KK3NlbGVjdF92ZWN0b3IoW0drfEdrc10sIE51bVZhcnMsIE51bUdzLCBHcywKKwkJR2pJbiwgVmluLCBUeXBlSW4sIE5pbiwgR2pPdXQsIFZvdXQsIFR5cGVPdXQsIE5vdXQpIDotCisJZnVuY3Rpb25fbnVtYmVyKEdrLCBLKSwKKwlLID49IE51bVZhcnMsCisJdHJ1ZV9zZXQoR2ssIFRrKSwKKwlzZWxlY3RfdmVjdG9yKFRrLCBHaywgTnVtVmFycywgTnVtR3MsIEdzLAorCQlHakluLCBWaW4sIFR5cGVJbiwgTmluLCBHaiwgViwgVHlwZSwgTiksCisJc2VsZWN0X3ZlY3RvcihHa3MsIE51bVZhcnMsIE51bUdzLCBHcywKKwkJR2osIFYsIFR5cGUsIE4sIEdqT3V0LCBWb3V0LCBUeXBlT3V0LCBOb3V0KS4KKwkKKyUgbG9vcCBvdmVyIHZlY3RvcnMKK3NlbGVjdF92ZWN0b3IoW10sIF8sIF8sIF8sIF8sIEdqLCBWLCBUeXBlLCBOLCBHaiwgViwgVHlwZSwgTikuCitzZWxlY3RfdmVjdG9yKFtWfFZzXSwgR2ssIE51bVZhcnMsIE51bUdzLCBHcywKKwkJR2pJbiwgVmluLCBUeXBlSW4sIE5pbiwgR2pPdXQsIFZvdXQsIFR5cGVPdXQsIE5vdXQpIDotCisJdmVjdG9yX2NvdmVyX3R5cGUoTnVtVmFycywgR3MsIEdrLCBWLCBUeXBlLCBOKSwKKwliZXN0X3ZlY3RvcihHakluLCBWaW4sIFR5cGVJbiwgTmluLAorCQkJR2ssIFYsIFR5cGUsIE4sCisJCQlHajIsIFYyLCBUeXBlMiwgTjIpLAorCXNlbGVjdF92ZWN0b3IoVnMsIEdrLCBOdW1WYXJzLCBOdW1HcywgR3MsCisJCUdqMiwgVjIsIFR5cGUyLCBOMiwgR2pPdXQsIFZvdXQsIFR5cGVPdXQsIE5vdXQpLgorCit2ZWN0b3JfY292ZXJfdHlwZShOdW1WYXJzLCBHcywgR2osIFZlY3RvciwgVHlwZSwgTnVtQ292ZXJzKSA6LQorCWltbWVkaWF0ZV9wcmVkZWNlc3NvcnMoR2osIElQcyksCisJY29uY2VpdmFibGVfaW5wdXRzKEdqLCBDSXMpLAorCWZhbHNlX3NldChHaiwgRmopLAorCWNvdmVyX3R5cGUxKElQcywgR3MsIFZlY3RvciwgbmYsIDAsIFQsIE4pLAorCWNvdmVyX3R5cGUyKENJcywgR3MsIE51bVZhcnMsIEZqLCBWZWN0b3IsIFQsIE4sIFR5cGUsIE51bUNvdmVycykuCisKK2NvdmVyX3R5cGUxKFtdLCBfLCBfLCBULCBOLCBULCBOKS4KK2NvdmVyX3R5cGUxKFtJfElQc10sIEdzLCBWLCBUeXBlSW4sIE5pbiwgVHlwZU91dCwgTm91dCkgOi0KKwlmdW5jdGlvbihJLCBHcywgR2kpLAorCXRydWVfc2V0KEdpLCBUaSksCisJXCsgc2V0X21lbWJlcihWLCBUaSksICEsCisJZmFsc2Vfc2V0KEdpLCBGaSksCisJKHNldF9tZW1iZXIoViwgRmkpIC0+CisJCW1heF90eXBlKFR5cGVJbiwgY292LCBUeXBlKTsKKwkJbWF4X3R5cGUoVHlwZUluLCBleHAsIFR5cGUpKSwKKwlOIGlzIE5pbiArIDEsCisJY292ZXJfdHlwZTEoSVBzLCBHcywgViwgVHlwZSwgTiwgVHlwZU91dCwgTm91dCkuCitjb3Zlcl90eXBlMShbX3xJUHNdLCBHcywgViwgVHlwZUluLCBOaW4sIFR5cGVPdXQsIE5vdXQpIDotCisJY292ZXJfdHlwZTEoSVBzLCBHcywgViwgVHlwZUluLCBOaW4sIFR5cGVPdXQsIE5vdXQpLgorCitjb3Zlcl90eXBlMihbXSwgXywgXywgXywgXywgVCwgTiwgVCwgTikuCitjb3Zlcl90eXBlMihbSXxDSXNdLCBHcywgTnVtVmFycywgRmosIFYsIFR5cGVJbiwgTmluLCBUeXBlT3V0LCBOb3V0KSA6LQorCUkgPCBOdW1WYXJzLAorCWZ1bmN0aW9uKEksIEdzLCBHaSksCisJZmFsc2Vfc2V0KEdpLCBGaSksCisJc2V0X21lbWJlcihWLCBGaSksICEsCisJbWF4X3R5cGUoVHlwZUluLCB2YXIsIFR5cGUpLAorCU4gaXMgTmluICsgMSwKKwljb3Zlcl90eXBlMihDSXMsIEdzLCBOdW1WYXJzLCBGaiwgViwgVHlwZSwgTiwgVHlwZU91dCwgTm91dCkuCitjb3Zlcl90eXBlMihbSXxDSXNdLCBHcywgTnVtVmFycywgRmosIFYsIFR5cGVJbiwgTmluLCBUeXBlT3V0LCBOb3V0KSA6LQorCUkgPj0gTnVtVmFycywKKwlmdW5jdGlvbihJLCBHcywgR2kpLAorCXRydWVfc2V0KEdpLCBUaSksCisJXCsgc2V0X21lbWJlcihWLCBUaSksICEsCisJZmFsc2Vfc2V0KEdpLCBGaSksCisJKHNldF9tZW1iZXIoViwgRmkpIC0+CisJCShzZXRfc3Vic2V0KEZqLCBUaSkgLT4KKwkJCW1heF90eXBlKFR5cGVJbiwgZmNuLCBUeXBlKTsKKwkJCW1heF90eXBlKFR5cGVJbiwgbWNmLCBUeXBlKSk7CisJCShzZXRfc3Vic2V0KEZqLCBUaSkgLT4KKwkJCW1heF90eXBlKFR5cGVJbiwgZXhmLCBUeXBlKTsKKwkJCW1heF90eXBlKFR5cGVJbiwgZXhtY2YsIFR5cGUpKSksCisJTiBpcyBOaW4gKyAxLAorCWNvdmVyX3R5cGUyKENJcywgR3MsIE51bVZhcnMsIEZqLCBWLCBUeXBlLCBOLCBUeXBlT3V0LCBOb3V0KS4KK2NvdmVyX3R5cGUyKFtffENJc10sIEdzLCBOdW1WYXJzLCBGaiwgViwgVHlwZUluLCBOaW4sIFR5cGVPdXQsIE5vdXQpIDotCisJY292ZXJfdHlwZTIoQ0lzLCBHcywgTnVtVmFycywgRmosIFYsIFR5cGVJbiwgTmluLCBUeXBlT3V0LCBOb3V0KS4KKworJSAgVGhlIGJlc3QgdmVjdG9yIHRvIGNvdmVyIGlzIHRoZSBvbmUgd2l0aCB3b3JzdCB0eXBlLCBvciwgaWYgdHlwZXMKKyUgIGFyZSBlcXVhbCwgd2l0aCB0aGUgbGVhc3QgbnVtYmVyIG9mIHBvc3NpYmxlIGNvdmVycy4KK2Jlc3RfdmVjdG9yKGR1bW15LCBfLCBfLCBfLCBHajIsIFYyLCBUeXBlMiwgTjIsIEdqMiwgVjIsIFR5cGUyLCBOMikgOi0gIS4KK2Jlc3RfdmVjdG9yKEdqMSwgVjEsIFR5cGUxLCBOMSwgZHVtbXksIF8sIF8sIF8sIEdqMSwgVjEsIFR5cGUxLCBOMSkgOi0gIS4KK2Jlc3RfdmVjdG9yKEdqMSwgVjEsIFR5cGUsIE4xLCBHajIsIF8sIFR5cGUsIE4yLCBHajEsIFYxLCBUeXBlLCBOMSkgOi0KKwlmdW5jdGlvbl9udW1iZXIoR2oxLCBKKSwgZnVuY3Rpb25fbnVtYmVyKEdqMiwgSiksCisJTjEgPCBOMiwgIS4KK2Jlc3RfdmVjdG9yKEdqMSwgXywgVHlwZSwgTjEsIEdqMiwgVjIsIFR5cGUsIE4yLCBHajIsIFYyLCBUeXBlLCBOMikgOi0KKwlmdW5jdGlvbl9udW1iZXIoR2oxLCBKKSwgZnVuY3Rpb25fbnVtYmVyKEdqMiwgSiksCisJTjEgPj0gTjIsICEuCitiZXN0X3ZlY3RvcihHajEsIFYxLCBUeXBlLCBOMSwgR2oyLCBfLCBUeXBlLCBfLCBHajEsIFYxLCBUeXBlLCBOMSkgOi0KKwkoVHlwZSA9IGV4cCA7IFR5cGUgPSB2YXIpLAorCWZ1bmN0aW9uX251bWJlcihHajEsIEoxKSwgZnVuY3Rpb25fbnVtYmVyKEdqMiwgSjIpLAorCUoxID4gSjIsICEuCitiZXN0X3ZlY3RvcihHajEsIF8sIFR5cGUsIF8sIEdqMiwgVjIsIFR5cGUsIE4yLCBHajIsIFYyLCBUeXBlLCBOMikgOi0KKwkoVHlwZSA9IGV4cCA7IFR5cGUgPSB2YXIpLAorCWZ1bmN0aW9uX251bWJlcihHajEsIEoxKSwgZnVuY3Rpb25fbnVtYmVyKEdqMiwgSjIpLAorCUoxIDwgSjIsICEuCitiZXN0X3ZlY3RvcihHajEsIFYxLCBUeXBlLCBOMSwgR2oyLCBfLCBUeXBlLCBfLCBHajEsIFYxLCBUeXBlLCBOMSkgOi0KKwlcKyAoVHlwZSA9IGV4cCA7IFR5cGUgPSB2YXIpLAorCWZ1bmN0aW9uX251bWJlcihHajEsIEoxKSwgZnVuY3Rpb25fbnVtYmVyKEdqMiwgSjIpLAorCUoxIDwgSjIsICEuCitiZXN0X3ZlY3RvcihHajEsIF8sIFR5cGUsIF8sIEdqMiwgVjIsIFR5cGUsIE4yLCBHajIsIFYyLCBUeXBlLCBOMikgOi0KKwlcKyAoVHlwZSA9IGV4cCA7IFR5cGUgPSB2YXIpLAorCWZ1bmN0aW9uX251bWJlcihHajEsIEoxKSwgZnVuY3Rpb25fbnVtYmVyKEdqMiwgSjIpLAorCUoxID4gSjIsICEuCitiZXN0X3ZlY3RvcihHajEsIFYxLCBUeXBlMSwgTjEsIF8sIF8sIFR5cGUyLCBfLCBHajEsIFYxLCBUeXBlMSwgTjEpIDotCisJdHlwZV9vcmRlcihUeXBlMiwgVHlwZTEpLCAhLgorYmVzdF92ZWN0b3IoXywgXywgVHlwZTEsIF8sIEdqMiwgVjIsIFR5cGUyLCBOMiwgR2oyLCBWMiwgVHlwZTIsIE4yKSA6LQorCXR5cGVfb3JkZXIoVHlwZTEsIFR5cGUyKSwgIS4KKworbWF4X3R5cGUoVDEsIFQyLCBUMSkgOi0gdHlwZV9vcmRlcihUMSwgVDIpLCAhLgorbWF4X3R5cGUoVDEsIFQyLCBUMikgOi0gXCsgdHlwZV9vcmRlcihUMSwgVDIpLCAhLgorCislICBPcmRlciBvZiB0eXBlcworCit0eXBlX29yZGVyKGNvdiwgZXhwKS4KK3R5cGVfb3JkZXIoY292LCB2YXIpLgordHlwZV9vcmRlcihjb3YsIGZjbikuCit0eXBlX29yZGVyKGNvdiwgbWNmKS4KK3R5cGVfb3JkZXIoY292LCBleGYpLgordHlwZV9vcmRlcihjb3YsIGV4bWNmKS4KK3R5cGVfb3JkZXIoY292LCBuZikuCit0eXBlX29yZGVyKGV4cCwgdmFyKS4KK3R5cGVfb3JkZXIoZXhwLCBmY24pLgordHlwZV9vcmRlcihleHAsIG1jZikuCit0eXBlX29yZGVyKGV4cCwgZXhmKS4KK3R5cGVfb3JkZXIoZXhwLCBleG1jZikuCit0eXBlX29yZGVyKGV4cCwgbmYpLgordHlwZV9vcmRlcih2YXIsIGZjbikuCit0eXBlX29yZGVyKHZhciwgbWNmKS4KK3R5cGVfb3JkZXIodmFyLCBleGYpLgordHlwZV9vcmRlcih2YXIsIGV4bWNmKS4KK3R5cGVfb3JkZXIodmFyLCBuZikuCit0eXBlX29yZGVyKGZjbiwgbWNmKS4KK3R5cGVfb3JkZXIoZmNuLCBleGYpLgordHlwZV9vcmRlcihmY24sIGV4bWNmKS4KK3R5cGVfb3JkZXIoZmNuLCBuZikuCit0eXBlX29yZGVyKG1jZiwgZXhmKS4KK3R5cGVfb3JkZXIobWNmLCBleG1jZikuCit0eXBlX29yZGVyKG1jZiwgbmYpLgordHlwZV9vcmRlcihleGYsIGV4bWNmKS4KK3R5cGVfb3JkZXIoZXhmLCBuZikuCit0eXBlX29yZGVyKGV4bWNmLCBuZikuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCisKKyUgIENvdmVyX3ZlY3RvciB3aWxsIGNvdmVyIHRoZSBzcGVjaWZpZWQgdmVjdG9yIGFuZAorJSAgZ2VuZXJhdGUgbmV3IGNpcmN1aXQgaW5mb3JtYXRpb24uCislICBVc2luZyBiYWNrdHJhY2tpbmcsIGFsbCBwb3NzaWJsZSBjb3ZlcmluZ3MgYXJlIGdlbmVyYXRlZC4KKyUgIFRoZSBvcmRlcmluZyBvZiB0aGUgcG9zc2libGUgY292ZXJpbmdzIGlzIGFwcHJveGltYXRlbHkgdGhhdAorJSAgZ2l2ZW4gaW4gRGF2aWRzb24ncyBwYXBlciwgYnV0IGhhcyBiZWVuIHNpbXBsaWZpZWQuCisKK2NvdmVyX3ZlY3RvcihOdW1WYXJzLCBOdW1Hc0luLCBHc0luLCBHaiwgVmVjdG9yLCBOdW1Hc091dCwgR3NPdXQpIDotCisJaW1tZWRpYXRlX3ByZWRlY2Vzc29ycyhHaiwgSVBzKSwKKwljb25jZWl2YWJsZV9pbnB1dHMoR2osIENJcyksCisJdmVjdG9yX3R5cGVzKFR5cGUpLAorCWNvdmVyX3ZlY3RvcihUeXBlLCBJUHMsIENJcywgR2osIFZlY3RvciwgTnVtVmFycywgTnVtR3NJbiwgR3NJbiwKKwkJTnVtR3NPdXQsIEdzT3V0KS4KKwkKK3ZlY3Rvcl90eXBlcyh2YXIpLgordmVjdG9yX3R5cGVzKGV4cCkuCit2ZWN0b3JfdHlwZXMoZmNuKS4KK3ZlY3Rvcl90eXBlcyhtY2YpLgordmVjdG9yX3R5cGVzKGV4ZikuCit2ZWN0b3JfdHlwZXMoZXhtY2YpLgordmVjdG9yX3R5cGVzKG5mKS4KKworY292ZXJfdmVjdG9yKGV4cCwgW0l8X10sIF8sIEdqLCBWLCBfLCBOdW1HcywgR3NJbiwgTnVtR3MsIEdzT3V0KSA6LQorCWZ1bmN0aW9uKEksIEdzSW4sIEdpKSwKKwl0cnVlX3NldChHaSwgVGkpLAorCVwrIHNldF9tZW1iZXIoViwgVGkpLAorCXVwZGF0ZV9jaXJjdWl0KEdzSW4sIEdpLCBHaiwgViwgR3NJbiwgR3NPdXQpLgorY292ZXJfdmVjdG9yKGV4cCwgW198SVBzXSwgXywgR2osIFYsIE51bVZhcnMsIE51bUdzLCBHc0luLCBOdW1HcywgR3NPdXQpIDotCisJY292ZXJfdmVjdG9yKGV4cCwgSVBzLCBfLCBHaiwgViwgTnVtVmFycywgTnVtR3MsIEdzSW4sIE51bUdzLCBHc091dCkuCitjb3Zlcl92ZWN0b3IodmFyLCBfLCBbSXxfXSwgR2osIFYsIE51bVZhcnMsIE51bUdzLCBHc0luLCBOdW1HcywgR3NPdXQpIDotCisJSSA8IE51bVZhcnMsCisJZnVuY3Rpb24oSSwgR3NJbiwgR2kpLAorCWZhbHNlX3NldChHaSwgRmkpLAorCXNldF9tZW1iZXIoViwgRmkpLAorCXVwZGF0ZV9jaXJjdWl0KEdzSW4sIEdpLCBHaiwgViwgR3NJbiwgR3NPdXQpLgorY292ZXJfdmVjdG9yKHZhciwgXywgW198Q0lzXSwgR2osIFYsIE51bVZhcnMsIE51bUdzLCBHc0luLCBOdW1HcywgR3NPdXQpIDotCisJY292ZXJfdmVjdG9yKHZhciwgXywgQ0lzLCBHaiwgViwgTnVtVmFycywgTnVtR3MsIEdzSW4sIE51bUdzLCBHc091dCkuCitjb3Zlcl92ZWN0b3IoZmNuLCBfLCBbSXxfXSwgR2osIFYsIE51bVZhcnMsIE51bUdzLCBHc0luLCBOdW1HcywgR3NPdXQpIDotCisJSSA+PSBOdW1WYXJzLAorCWZ1bmN0aW9uKEksIEdzSW4sIEdpKSwKKwlmYWxzZV9zZXQoR2ksIEZpKSwKKwlzZXRfbWVtYmVyKFYsIEZpKSwKKwl0cnVlX3NldChHaSwgVGkpLAorCWZhbHNlX3NldChHaiwgRmopLAorCXNldF9zdWJzZXQoRmosIFRpKSwKKwl1cGRhdGVfY2lyY3VpdChHc0luLCBHaSwgR2osIFYsIEdzSW4sIEdzT3V0KS4KK2NvdmVyX3ZlY3RvcihmY24sIF8sIFtffENJc10sIEdqLCBWLCBOdW1WYXJzLCBOdW1HcywgR3NJbiwgTnVtR3MsIEdzT3V0KSA6LQorCWNvdmVyX3ZlY3RvcihmY24sIF8sIENJcywgR2osIFYsIE51bVZhcnMsIE51bUdzLCBHc0luLCBOdW1HcywgR3NPdXQpLgorY292ZXJfdmVjdG9yKG1jZiwgXywgW0l8X10sIEdqLCBWLCBOdW1WYXJzLCBOdW1HcywgR3NJbiwgTnVtR3MsIEdzT3V0KSA6LQorCUkgPj0gTnVtVmFycywKKwlmdW5jdGlvbihJLCBHc0luLCBHaSksCisJZmFsc2Vfc2V0KEdpLCBGaSksCisJc2V0X21lbWJlcihWLCBGaSksCisJdHJ1ZV9zZXQoR2ksIFRpKSwKKwlmYWxzZV9zZXQoR2osIEZqKSwKKwlcKyBzZXRfc3Vic2V0KEZqLCBUaSksCisJdXBkYXRlX2NpcmN1aXQoR3NJbiwgR2ksIEdqLCBWLCBHc0luLCBHc091dCkuCitjb3Zlcl92ZWN0b3IobWNmLCBfLCBbX3xDSXNdLCBHaiwgViwgTnVtVmFycywgTnVtR3MsIEdzSW4sIE51bUdzLCBHc091dCkgOi0KKwljb3Zlcl92ZWN0b3IobWNmLCBfLCBDSXMsIEdqLCBWLCBOdW1WYXJzLCBOdW1HcywgR3NJbiwgTnVtR3MsIEdzT3V0KS4KK2NvdmVyX3ZlY3RvcihleGYsIF8sIFtJfF9dLCBHaiwgViwgTnVtVmFycywgTnVtR3MsIEdzSW4sIE51bUdzLCBHc091dCkgOi0KKwlJID49IE51bVZhcnMsCisJZnVuY3Rpb24oSSwgR3NJbiwgR2kpLAorCWZhbHNlX3NldChHaSwgRmkpLAorCVwrIHNldF9tZW1iZXIoViwgRmkpLAorCXRydWVfc2V0KEdpLCBUaSksCisJXCsgc2V0X21lbWJlcihWLCBUaSksCisJZmFsc2Vfc2V0KEdqLCBGaiksCisJc2V0X3N1YnNldChGaiwgVGkpLAorCXVwZGF0ZV9jaXJjdWl0KEdzSW4sIEdpLCBHaiwgViwgR3NJbiwgR3NPdXQpLgorY292ZXJfdmVjdG9yKGV4ZiwgXywgW198Q0lzXSwgR2osIFYsIE51bVZhcnMsIE51bUdzLCBHc0luLCBOdW1HcywgR3NPdXQpIDotCisJY292ZXJfdmVjdG9yKGV4ZiwgXywgQ0lzLCBHaiwgViwgTnVtVmFycywgTnVtR3MsIEdzSW4sIE51bUdzLCBHc091dCkuCitjb3Zlcl92ZWN0b3IoZXhtY2YsIF8sIFtJfF9dLCBHaiwgViwgTnVtVmFycywgTnVtR3MsIEdzSW4sIE51bUdzLCBHc091dCkgOi0KKwlJID49IE51bVZhcnMsCisJZnVuY3Rpb24oSSwgR3NJbiwgR2kpLAorCWZhbHNlX3NldChHaSwgRmkpLAorCVwrIHNldF9tZW1iZXIoViwgRmkpLAorCXRydWVfc2V0KEdpLCBUaSksCisJXCsgc2V0X21lbWJlcihWLCBUaSksCisJZmFsc2Vfc2V0KEdqLCBGaiksCisJXCsgc2V0X3N1YnNldChGaiwgVGkpLAorCXVwZGF0ZV9jaXJjdWl0KEdzSW4sIEdpLCBHaiwgViwgR3NJbiwgR3NPdXQpLgorY292ZXJfdmVjdG9yKGV4bWNmLCBfLCBbX3xDSXNdLCBHaiwgViwgTnVtVmFycywgTnVtR3MsIEdzSW4sIE51bUdzLCBHc091dCkgOi0KKwljb3Zlcl92ZWN0b3IoZXhtY2YsIF8sIENJcywgR2osIFYsIE51bVZhcnMsIE51bUdzLCBHc0luLCBOdW1HcywgR3NPdXQpLgorY292ZXJfdmVjdG9yKG5mLCBfLCBfLCBHaiwgViwgTnVtVmFycywgTnVtR3NJbiwgR3NJbiwgTnVtR3NPdXQsIEdzT3V0KSA6LQorCU51bUdzT3V0IGlzIE51bUdzSW4gKyAxLAorCWZhbHNlX3NldChHaiwgRmopLAorCW5ld19mdW5jdGlvbl9DSXMoR3NJbiwKKwkJZnVuY3Rpb24oTnVtR3NJbixGaixbVl0sW10sW10sW10sW10sW10pLAorCQlOdW1WYXJzLCBHcywgR2kpLAorCXVwZGF0ZV9jaXJjdWl0KEdzLCBHaSwgR2osIFYsIEdzLCBHc091dCkuCisKKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKwordXBkYXRlX2NpcmN1aXQoW10sIF8sIF8sIF8sIF8sIFtdKS4KK3VwZGF0ZV9jaXJjdWl0KFtmdW5jdGlvbihLLFRrLEZrLENJayxJUGssSVNrLFBrLFNrKXxHc0luXSwKKwkJR2ksIEdqLCBWLCBHcywKKwkJW2Z1bmN0aW9uKEssVGtvLEZrbyxDSWtvLElQa28sSVNrbyxQa28sU2tvKXxHc091dF0pIDotCisJR2kgPSBmdW5jdGlvbihJLF8sRmksXyxJUGksSVNpLFBpLF8pLAorCUdqID0gZnVuY3Rpb24oSixfLEZqLF8sXyxfLF8sU2opLAorCXNldF91bmlvbihbSV0sIFBpLCBQaUkpLAorCXNldF91bmlvbihbSl0sIFNqLCBTakopLAorCShLID0gSiAtPgorCQlzZXRfdW5pb24oVGssIEZpLCBUazIpOworCQlUazIgPSBUayksCisJKEsgPSBJIC0+CisJCXNldF91bmlvbihUazIsIEZqLCBUazMpOworCQlUazMgPSBUazIpLAorCSgoc2V0X21lbWJlcihLLCBJUGkpOyBzZXRfbWVtYmVyKEssIElTaSkpIC0+CisJCXNldF91bmlvbihUazMsIFtWXSwgVGtvKTsKKwkJVGtvID0gVGszKSwKKwkoSyA9IEkgLT4KKwkJc2V0X3VuaW9uKEZrLCBbVl0sIEZrbyk7CisJCUZrbyA9IEZrKSwKKwkoKHNldF9tZW1iZXIoSywgUGkpOyBLID0gSSkgLT4KKwkJc2V0X2RpZmZlcmVuY2UoQ0lrLCBTakosIENJazIpOworCQlDSWsyID0gQ0lrKSwKKwkoKHNldF9tZW1iZXIoSSwgQ0lrKSwgc2V0X21lbWJlcihWLCBGaykpIC0+CisJCXNldF9kaWZmZXJlbmNlKENJazIsIFtJXSwgQ0lrMyk7CisJCUNJazMgPSBDSWsyKSwKKwkoSyA9IEkgLT4KKwkJZXhjbHVkZV9pZl92ZWN0b3JfaW5fZmFsc2Vfc2V0KENJazMsIEdzLCBWLCBDSWs0KTsKKwkJQ0lrNCA9IENJazMpLAorCShLID0gSiAtPgorCQlzZXRfZGlmZmVyZW5jZShDSWs0LCBbSV0sIENJa28pOworCQlDSWtvID0gQ0lrNCksCisJKEsgPSBKIC0+CisJCXNldF91bmlvbihJUGssIFtJXSwgSVBrbyk7CisJCUlQa28gPSBJUGspLAorCShLID0gSSAtPgorCQlzZXRfdW5pb24oSVNrLCBbSl0sIElTa28pOworCQlJU2tvID0gSVNrKSwKKwkoc2V0X21lbWJlcihLLCBTakopIC0+CisJCXNldF91bmlvbihQaywgUGlJLCBQa28pOworCQlQa28gPSBQayksCisJKHNldF9tZW1iZXIoSywgUGlJKSAtPgorCQlzZXRfdW5pb24oU2ssIFNqSiwgU2tvKTsKKwkJU2tvID0gU2spLAorCXVwZGF0ZV9jaXJjdWl0KEdzSW4sIEdpLCBHaiwgViwgR3MsIEdzT3V0KS4KKworZXhjbHVkZV9pZl92ZWN0b3JfaW5fZmFsc2Vfc2V0KFtdLCBfLCBfLCBbXSkuCitleGNsdWRlX2lmX3ZlY3Rvcl9pbl9mYWxzZV9zZXQoW0t8Q0lzSW5dLCBHcywgViwgQ0lzT3V0KSA6LQorCWZ1bmN0aW9uKEssIEdzLCBHayksCisJZmFsc2Vfc2V0KEdrLCBGayksCisJc2V0X21lbWJlcihWLCBGayksICEsCisJZXhjbHVkZV9pZl92ZWN0b3JfaW5fZmFsc2Vfc2V0KENJc0luLCBHcywgViwgQ0lzT3V0KS4KK2V4Y2x1ZGVfaWZfdmVjdG9yX2luX2ZhbHNlX3NldChbS3xDSXNJbl0sIEdzLCBWLCBbS3xDSXNPdXRdKSA6LQorCWV4Y2x1ZGVfaWZfdmVjdG9yX2luX2ZhbHNlX3NldChDSXNJbiwgR3MsIFYsIENJc091dCkuCisKKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKworYWRkX25lY2Vzc2FyeV9mdW5jdGlvbnMoTnVtVmFycywgTnVtR3NJbiwgR3NJbiwgTnVtR3NPdXQsIEdzT3V0KSA6LQorCWFkZF9uZWNlc3NhcnlfZnVuY3Rpb25zKE51bVZhcnMsIE51bVZhcnMsIE51bUdzSW4sIEdzSW4sCisJCQkJCU51bUdzT3V0LCBHc091dCkuCisKK2FkZF9uZWNlc3NhcnlfZnVuY3Rpb25zKE51bUdzLCBfLCBOdW1HcywgR3MsIE51bUdzLCBHcykgOi0gIS4KK2FkZF9uZWNlc3NhcnlfZnVuY3Rpb25zKEssIE51bVZhcnMsIE51bUdzSW4sIEdzSW4sIE51bUdzT3V0LCBHc091dCkgOi0KKwlmdW5jdGlvbihLLCBHc0luLCBHayksCisJZnVuY3Rpb25fdHlwZShOdW1WYXJzLCBOdW1Hc0luLCBHc0luLCBHaywgbmYsIFYpLCAhLAorCWZhbHNlX3NldChHaywgRmspLAorCW5ld19mdW5jdGlvbl9DSXMoR3NJbiwKKwkJZnVuY3Rpb24oTnVtR3NJbixGayxbVl0sW10sW10sW10sW10sW10pLAorCQlOdW1WYXJzLCBHcywgR2wpLAorCWZ1bmN0aW9uKEssIEdzLCBHazEpLAorCXVwZGF0ZV9jaXJjdWl0KEdzLCBHbCwgR2sxLCBWLCBHcywgR3MxKSwKKwlOdW1HczEgaXMgTnVtR3NJbiArIDEsCisJSzEgaXMgSyArIDEsCisJYWRkX25lY2Vzc2FyeV9mdW5jdGlvbnMoSzEsIE51bVZhcnMsIE51bUdzMSwgR3MxLCBOdW1Hc091dCwgR3NPdXQpLgorYWRkX25lY2Vzc2FyeV9mdW5jdGlvbnMoSywgTnVtVmFycywgTnVtR3NJbiwgR3NJbiwgTnVtR3NPdXQsIEdzT3V0KSA6LQorCUsxIGlzIEsgKyAxLAorCWFkZF9uZWNlc3NhcnlfZnVuY3Rpb25zKEsxLCBOdW1WYXJzLCBOdW1Hc0luLCBHc0luLCBOdW1Hc091dCwgR3NPdXQpLgorCituZXdfZnVuY3Rpb25fQ0lzKEdzSW4sIGZ1bmN0aW9uKEwsVGwsRmwsXyxJUGwsSVNsLFBsLFNsKSwgTnVtVmFycywKKwkJW0dsT3V0fEdzT3V0XSwgR2xPdXQpIDotCisJbmV3X2Z1bmN0aW9uX0NJcyhHc0luLCBMLCBGbCwgTnVtVmFycywgR3NPdXQsIFtdLCBDSWxvKSwKKwlHbE91dCA9IGZ1bmN0aW9uKEwsVGwsRmwsQ0lsbyxJUGwsSVNsLFBsLFNsKS4KKwkKK25ld19mdW5jdGlvbl9DSXMoW10sIF8sIF8sIF8sIFtdLCBDSWwsIENJbCkuCituZXdfZnVuY3Rpb25fQ0lzKFtmdW5jdGlvbihLLFRrLEZrLENJayxJUGssSVNrLFBrLFNrKXxHc0luXSwgTCwgRmwsIE51bVZhcnMsCisJCVtmdW5jdGlvbihLLFRrLEZrLENJa28sSVBrLElTayxQayxTayl8R3NPdXRdLCBDSWxJbiwgQ0lsT3V0KSA6LQorCXNldF9pbnRlcnNlY3Rpb24oRmwsIEZrLCBbXSksICEsCisJKEsgPj0gTnVtVmFycyAtPgorCQlzZXRfdW5pb24oQ0lrLCBbTF0sIENJa28pOworCQlDSWtvID0gQ0lrKSwKKwluZXdfZnVuY3Rpb25fQ0lzKEdzSW4sIEwsIEZsLCBOdW1WYXJzLCBHc091dCwgW0t8Q0lsSW5dLCBDSWxPdXQpLgorbmV3X2Z1bmN0aW9uX0NJcyhbR2t8R3NJbl0sIEwsIEZsLCBOdW1WYXJzLCBbR2t8R3NPdXRdLCBDSWxJbiwgQ0lsT3V0KSA6LQorCW5ld19mdW5jdGlvbl9DSXMoR3NJbiwgTCwgRmwsIE51bVZhcnMsIEdzT3V0LCBDSWxJbiwgQ0lsT3V0KS4KKworZnVuY3Rpb25fdHlwZShOdW1WYXJzLCBOdW1HcywgR3MsIEdrLCBUeXBlLCBWZWN0b3IpIDotCisJdHJ1ZV9zZXQoR2ssIFRrKSwKKwlzZWxlY3RfdmVjdG9yKFRrLCBHaywgTnVtVmFycywgTnVtR3MsIEdzLAorCQlkdW1teSwgMCwgbmYsIDk5OSwgXywgVmVjdG9yLCBUeXBlLCBfKS4KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUgIENvc3QgYW5kIGNvbnN0cmFpbnQgcHJlZGljYXRlczoKKworJSB2ZXJ5IHNpbXBsZSBib3VuZCBmb3Igbm93CisKK3Rlc3RfYm91bmRzKF8sIE51bUdzLCBfKSA6LQorCWFjY2Vzcyhib3VuZCwgQm91bmQpLAorCU51bUdzIDwgQm91bmQuCisKK3VwZGF0ZV9ib3VuZHMoXywgTnVtR3MsIF8pIDotCisJc2V0KGJvdW5kLCBOdW1HcykuCisKKyUgc2V0IGFuZCBhY2Nlc3MgZm9yIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0KK3NldChOLCBBKSA6LQorCShyZWNvcmRlZChOLCBfLCBSZWYpIC0+IGVyYXNlKFJlZikgOyB0cnVlKSwKKwlyZWNvcmRhKE4sIEEsIF8pLgorCithY2Nlc3MoTiwgQSkgOi0KKwlyZWNvcmRlZChOLCBBLCBfKS4KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUgIE91dHB1dCBwcmVkaWNhdGVzOgorCislICBmb3Igbm93IGp1c3QgZHVtcCBldmVyeXRoaW5nCisKK291dHB1dF9yZXN1bHRzKE51bVZhcnMsIE51bUdzLCBHcykgOi0KKwlOdW1HYXRlcyBpcyBOdW1HcyAtIE51bVZhcnMsCisJd3JpdGUoTnVtR2F0ZXMpLCB3cml0ZSgnIGdhdGVzJyksIG5sLAorCXdyaXRlX2dhdGVzKEdzKSwgbmwsCisJd3JpdGUoJ3NlYXJjaGluZyBmb3IgYSBiZXR0ZXIgc29sdXRpb24uLi4nKSwgbmwsIG5sLgorCit3cml0ZV9nYXRlcyhbXSkuCit3cml0ZV9nYXRlcyhbR2l8R3NdKSA6LQorCWZ1bmN0aW9uX251bWJlcihHaSwgSSksCisJd3JpdGUoJ2dhdGUgIycpLCB3cml0ZShJKSwgd3JpdGUoJyBpbnB1dHM6ICAgJyksCisJaW1tZWRpYXRlX3ByZWRlY2Vzc29ycyhHaSwgSVBpKSwKKwl3cml0ZShJUGkpLCBubCwKKwl3cml0ZV9nYXRlcyhHcykuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCisKKyUgIFJldHJpZXZlIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gZnJvbSB0aGUgZnVuY3Rpb24gbGlzdC4KKyUgIGZ1bmN0aW9uKEZ1bmN0aW9uTnVtYmVyLCBGdW5jdGlvbkxpc3QsIEZ1bmN0aW9uKS4KK2Z1bmN0aW9uKEksIFtHaXxfXSwgR2kpIDotIGZ1bmN0aW9uX251bWJlcihHaSwgSSksICEuCitmdW5jdGlvbihJLCBbX3xHc10sIEdpKSA6LSBmdW5jdGlvbihJLCBHcywgR2kpLgorCitmdW5jdGlvbl9udW1iZXIoICAgICAgICBmdW5jdGlvbihJLF8sXyxfLF8sXyxfLF8pLCBJKS4KK3RydWVfc2V0KCAgICAgICAgICAgICAgIGZ1bmN0aW9uKF8sVCxfLF8sXyxfLF8sXyksIFQpLgorZmFsc2Vfc2V0KCAgICAgICAgICAgICAgZnVuY3Rpb24oXyxfLEYsXyxfLF8sXyxfKSwgRikuCitjb25jZWl2YWJsZV9pbnB1dHMoICAgICBmdW5jdGlvbihfLF8sXyxDSSxfLF8sXyxfKSwgQ0kpLgoraW1tZWRpYXRlX3ByZWRlY2Vzc29ycyggZnVuY3Rpb24oXyxfLF8sXyxJUCxfLF8sXyksIElQKS4KK2ltbWVkaWF0ZV9zdWNjZXNzb3JzKCAgIGZ1bmN0aW9uKF8sXyxfLF8sXyxJUyxfLF8pLCBJUykuCitwcmVkZWNlc3NvcnMoICAgICAgICAgICBmdW5jdGlvbihfLF8sXyxfLF8sXyxQLF8pLCBQKS4KK3N1Y2Nlc3NvcnMoICAgICAgICAgICAgIGZ1bmN0aW9uKF8sXyxfLF8sXyxfLF8sUyksIFMpLgorCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSAgU2V0IG9wZXJhdGlvbnMgYXNzdW1lIHRoYXQgdGhlIHNldHMgYXJlIHJlcHJlc2VudGVkIGJ5IGFuIG9yZGVyZWQgbGlzdAorJSAgb2YgaW50ZWdlcnMuCisKK3NldF91bmlvbihbXSwgICAgIFtdLCAgICAgW10pLgorc2V0X3VuaW9uKFtdLCAgICAgW1h8TDJdLCBbWHxMMl0pLgorc2V0X3VuaW9uKFtYfEwxXSwgW10sICAgICBbWHxMMV0pLgorc2V0X3VuaW9uKFtYfEwxXSwgW1h8TDJdLCBbWHxMM10pIDotICAgICAgICBzZXRfdW5pb24oTDEsIEwyLCAgICAgTDMpLgorc2V0X3VuaW9uKFtYfEwxXSwgW1l8TDJdLCBbWHxMM10pIDotIFggPCBZLCBzZXRfdW5pb24oTDEsIFtZfEwyXSwgTDMpLgorc2V0X3VuaW9uKFtYfEwxXSwgW1l8TDJdLCBbWXxMM10pIDotIFggPiBZLCBzZXRfdW5pb24oW1h8TDFdLCBMMiwgTDMpLgorCitzZXRfaW50ZXJzZWN0aW9uKFtdLCAgICAgW10sICAgICBbXSkuCitzZXRfaW50ZXJzZWN0aW9uKFtdLCAgICAgW198X10sICBbXSkuCitzZXRfaW50ZXJzZWN0aW9uKFtffF9dLCAgW10sICAgICBbXSkuCitzZXRfaW50ZXJzZWN0aW9uKFtYfEwxXSwgW1h8TDJdLCBbWHxMM10pIDotICAgIHNldF9pbnRlcnNlY3Rpb24oTDEsIEwyLCAgICAgTDMpLgorc2V0X2ludGVyc2VjdGlvbihbWHxMMV0sIFtZfEwyXSwgTDMpIDotIFggPCBZLCBzZXRfaW50ZXJzZWN0aW9uKEwxLCBbWXxMMl0sIEwzKS4KK3NldF9pbnRlcnNlY3Rpb24oW1h8TDFdLCBbWXxMMl0sIEwzKSA6LSBYID4gWSwgc2V0X2ludGVyc2VjdGlvbihbWHxMMV0sIEwyLCBMMykuCisKK3NldF9kaWZmZXJlbmNlKFtdLCAgICAgW10sICAgICBbXSkuCitzZXRfZGlmZmVyZW5jZShbXSwgICAgIFtffF9dLCAgW10pLgorc2V0X2RpZmZlcmVuY2UoW1h8TDFdLCBbXSwgICAgIFtYfEwxXSkuCitzZXRfZGlmZmVyZW5jZShbWHxMMV0sIFtYfEwyXSwgTDMpIDotICAgICAgICAgICAgc2V0X2RpZmZlcmVuY2UoTDEsIEwyLCAgICAgTDMpLgorc2V0X2RpZmZlcmVuY2UoW1h8TDFdLCBbWXxMMl0sIFtYfEwzXSkgOi0gWCA8IFksIHNldF9kaWZmZXJlbmNlKEwxLCBbWXxMMl0sIEwzKS4KK3NldF9kaWZmZXJlbmNlKFtYfEwxXSwgW1l8TDJdLCBMMykgOi0gICAgIFggPiBZLCBzZXRfZGlmZmVyZW5jZShbWHxMMV0sIEwyLCBMMykuCisKK3NldF9zdWJzZXQoW10sICAgICBfKS4KK3NldF9zdWJzZXQoW1h8TDFdLCBbWHxMMl0pIDotICAgICAgICBzZXRfc3Vic2V0KEwxLCBMMikuCitzZXRfc3Vic2V0KFtYfEwxXSwgW1l8TDJdKSA6LSBYID4gWSwgc2V0X3N1YnNldChbWHxMMV0sIEwyKS4KKworc2V0X21lbWJlcihYLCBbWHxfXSkuCitzZXRfbWVtYmVyKFgsIFtZfFRdKSA6LSBYID4gWSwgc2V0X21lbWJlcihYLCBUKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL25yZXZlcnNlLmluIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvbnJldmVyc2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ0YmYxZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL25yZXZlcnNlLmluCkBAIC0wLDAgKzEgQEAKKzotICckYmVuY2htYXJrJyhucmV2ZXJzZSwgMTAwMCwgbnJldmVyc2UsICckZHVtbXknKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL25yZXZlcnNlLnBsIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvbnJldmVyc2UucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4ZWNmYQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL25yZXZlcnNlLnBsCkBAIC0wLDAgKzEsMTggQEAKKyUgZ2VuZXJhdGVkOiAyNSBPY3RvYmVyIDE5ODkKKyUgb3B0aW9uKHMpOiAKKyUKKyUgICBucmV2ZXJzZQorJQorJSAgIERhdmlkIEguIEQuIFdhcnJlbgorJQorJSAgICJuYWl2ZSItcmV2ZXJzZSBhIGxpc3Qgb2YgMzAgaW50ZWdlcnMKKworbnJldmVyc2UgOi0gbnJldmVyc2UoWzEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLAorCQkgICAgICAxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwKKwkJICAgICAgMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzBdLF8pLgorCitucmV2ZXJzZShbWHxMMF0sTCkgOi0gbnJldmVyc2UoTDAsTDEpLCBjb25jYXRlbmF0ZShMMSxbWF0sTCkuCitucmV2ZXJzZShbXSxbXSkuCisKK2NvbmNhdGVuYXRlKFtYfEwxXSxMMixbWHxMM10pIDotIGNvbmNhdGVuYXRlKEwxLEwyLEwzKS4KK2NvbmNhdGVuYXRlKFtdLEwsTCkuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9vcHM4LmluIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvb3BzOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTU0OGY2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvb3BzOC5pbgpAQCAtMCwwICsxIEBACis6LSAnJGJlbmNobWFyaycob3BzOCwgMTAwMCwgb3BzOCwgJyRkdW1teScpLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvb3BzOC5wbCBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL29wczgucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3MWI0YgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL29wczgucGwKQEAgLTAsMCArMSwzNSBAQAorJSBnZW5lcmF0ZWQ6IDI1IE9jdG9iZXIgMTk4OQorJSBvcHRpb24ocyk6IAorJQorJSAgIChkZXJpdikgb3BzOAorJQorJSAgIERhdmlkIEguIEQuIFdhcnJlbgorJQorJSAgIHN5bWJvbGljIGRlcml2YXRpdmUgb2YgKHgrMSkqKCheKHgsMikrMikqKF4oeCwzKSszKSkKKworb3BzOCA6LSBkKCh4KzEpKigoXih4LDIpKzIpKiheKHgsMykrMykpLHgsXykuCisKK2QoVStWLFgsRFUrRFYpIDotICEsIAorICAgIGQoVSxYLERVKSwKKyAgICBkKFYsWCxEVikuCitkKFUtVixYLERVLURWKSA6LSAhLAorICAgIGQoVSxYLERVKSwKKyAgICBkKFYsWCxEVikuCitkKFUqVixYLERVKlYrVSpEVikgOi0gISwKKyAgICBkKFUsWCxEVSksCisgICAgZChWLFgsRFYpLgorZChVL1YsWCwoRFUqVi1VKkRWKS8oXihWLDIpKSkgOi0gISwKKyAgICBkKFUsWCxEVSksCisgICAgZChWLFgsRFYpLgorZCheKFUsTiksWCxEVSpOKiheKFUsTjEpKSkgOi0gISwgCisgICAgaW50ZWdlcihOKSwKKyAgICBOMSBpcyBOLTEsCisgICAgZChVLFgsRFUpLgorZCgtVSxYLC1EVSkgOi0gISwKKyAgICBkKFUsWCxEVSkuCitkKGV4cChVKSxYLGV4cChVKSpEVSkgOi0gISwKKyAgICBkKFUsWCxEVSkuCitkKGxvZyhVKSxYLERVL1UpIDotICEsCisgICAgZChVLFgsRFUpLgorZChYLFgsMSkgOi0gIS4KK2QoXyxfLDApLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvcG9seV8xMC5pbiBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3BvbHlfMTAuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRlMmE4OQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3BvbHlfMTAuaW4KQEAgLTAsMCArMSBAQAorOi0gJyRiZW5jaG1hcmsnKHBvbHlfMTAsIDEwMDAsIHBvbHlfMTAsICckZHVtbXknKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3BvbHlfMTAucGwgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9wb2x5XzEwLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNzUxNjYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9wb2x5XzEwLnBsCkBAIC0wLDAgKzEsMTAxIEBACislIGdlbmVyYXRlZDogOCBNYXJjaCAxOTkwCislIG9wdGlvbihzKTogTk9fVEVSTV9DT01QQVJFCislCislICAgKHBvbHkpIHBvbHlfMTAKKyUKKyUgICBSYWxwaCBIYXlnb29kIChiYXNlZCBvbiBQcm9sb2cgdmVyc2lvbiBieSBSaWNrIE1jR2VlcgorJSAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIExpc3AgdmVyc2lvbiBieSBSLiBQLiBHYWJyaWVsKQorJQorJSAgIHJhaXNlIGEgcG9seW5vbWlhbCAoMSt4K3kreikgdG8gdGhlIDEwdGggcG93ZXIgKHN5bWJvbGljYWxseSkKKworOi1vcCg3MDAseGZ4LGxlc3NfdGhhbikuCisKK3BvbHlfMTAgOi0gdGVzdF9wb2x5KFApLCBwb2x5X2V4cCgxMCwgUCwgXykuCisKKyUgdGVzdCBwb2x5bm9taWFsIGRlZmluaXRpb24KKwordGVzdF9wb2x5KFApIDotCisgICAgcG9seV9hZGQocG9seSh4LFt0ZXJtKDAsMSksdGVybSgxLDEpXSkscG9seSh5LFt0ZXJtKDEsMSldKSxRKSwKKyAgICBwb2x5X2FkZChwb2x5KHosW3Rlcm0oMSwxKV0pLFEsUCkuCisKKyUgJ2xlc3NfdGhhbicvMiBmb3IgeCwgeSwgegorCit4IGxlc3NfdGhhbiB5LgoreSBsZXNzX3RoYW4gei4KK3ggbGVzc190aGFuIHouCisKKyUgcG9seW5vbWlhbCBhZGRpdGlvbgorCitwb2x5X2FkZChwb2x5KFZhcixUZXJtczEpLCBwb2x5KFZhcixUZXJtczIpLCBwb2x5KFZhcixUZXJtcykpIDotICEsCisgICAgdGVybV9hZGQoVGVybXMxLCBUZXJtczIsIFRlcm1zKS4KK3BvbHlfYWRkKHBvbHkoVmFyMSxUZXJtczEpLCBwb2x5KFZhcjIsVGVybXMyKSwgcG9seShWYXIxLFRlcm1zKSkgOi0KKyAgICBWYXIxIGxlc3NfdGhhbiBWYXIyLCAhLAorICAgIGFkZF90b19vcmRlcl96ZXJvX3Rlcm0oVGVybXMxLCBwb2x5KFZhcjIsVGVybXMyKSwgVGVybXMpLgorcG9seV9hZGQoUG9seSwgcG9seShWYXIsVGVybXMyKSwgcG9seShWYXIsVGVybXMpKSA6LSAhLAorICAgIGFkZF90b19vcmRlcl96ZXJvX3Rlcm0oVGVybXMyLCBQb2x5LCBUZXJtcykuCitwb2x5X2FkZChwb2x5KFZhcixUZXJtczEpLCBDLCBwb2x5KFZhcixUZXJtcykpIDotICEsCisgICAgYWRkX3RvX29yZGVyX3plcm9fdGVybShUZXJtczEsIEMsIFRlcm1zKS4KK3BvbHlfYWRkKEMxLCBDMiwgQykgOi0KKyAgICBDIGlzIEMxK0MyLgorCislIHRlcm0gYWRkaXRpb24KKwordGVybV9hZGQoW10sIFgsIFgpIDotICEuCit0ZXJtX2FkZChYLCBbXSwgWCkgOi0gIS4KK3Rlcm1fYWRkKFt0ZXJtKEUsQzEpfFRlcm1zMV0sIFt0ZXJtKEUsQzIpfFRlcm1zMl0sIFt0ZXJtKEUsQyl8VGVybXNdKSA6LSAhLAorICAgIHBvbHlfYWRkKEMxLCBDMiwgQyksCisgICAgdGVybV9hZGQoVGVybXMxLCBUZXJtczIsIFRlcm1zKS4KK3Rlcm1fYWRkKFt0ZXJtKEUxLEMxKXxUZXJtczFdLCBbdGVybShFMixDMil8VGVybXMyXSwgW3Rlcm0oRTEsQzEpfFRlcm1zXSkgOi0KKyAgICBFMSA8IEUyLCAhLAorICAgIHRlcm1fYWRkKFRlcm1zMSwgW3Rlcm0oRTIsQzIpfFRlcm1zMl0sIFRlcm1zKS4KK3Rlcm1fYWRkKFRlcm1zMSwgW3Rlcm0oRTIsQzIpfFRlcm1zMl0sIFt0ZXJtKEUyLEMyKXxUZXJtc10pIDotCisgICAgdGVybV9hZGQoVGVybXMxLCBUZXJtczIsIFRlcm1zKS4KKworYWRkX3RvX29yZGVyX3plcm9fdGVybShbdGVybSgwLEMxKXxUZXJtc10sIEMyLCBbdGVybSgwLEMpfFRlcm1zXSkgOi0gISwKKyAgICBwb2x5X2FkZChDMSwgQzIsIEMpLgorYWRkX3RvX29yZGVyX3plcm9fdGVybShUZXJtcywgQywgW3Rlcm0oMCxDKXxUZXJtc10pLgorCislIHBvbHlub21pYWwgZXhwb25lbnRpYXRpb24KKworcG9seV9leHAoMCwgXywgMSkgOi0gIS4KK3BvbHlfZXhwKE4sIFBvbHksIFJlc3VsdCkgOi0KKyAgICBNIGlzIE4+PjEsCisgICAgTiBpcyBNPDwxLCAhLAorICAgIHBvbHlfZXhwKE0sIFBvbHksIFBhcnQpLAorICAgIHBvbHlfbXVsKFBhcnQsIFBhcnQsIFJlc3VsdCkuCitwb2x5X2V4cChOLCBQb2x5LCBSZXN1bHQpIDotCisgICAgTSBpcyBOLTEsCisgICAgcG9seV9leHAoTSwgUG9seSwgUGFydCksCisgICAgcG9seV9tdWwoUG9seSwgUGFydCwgUmVzdWx0KS4KKworJSBwb2x5bm9taWFsIG11bHRpcGxpY2F0aW9uCisKK3BvbHlfbXVsKHBvbHkoVmFyLFRlcm1zMSksIHBvbHkoVmFyLFRlcm1zMiksIHBvbHkoVmFyLFRlcm1zKSkgOi0gISwKKyAgICB0ZXJtX211bChUZXJtczEsIFRlcm1zMiwgVGVybXMpLgorcG9seV9tdWwocG9seShWYXIxLFRlcm1zMSksIHBvbHkoVmFyMixUZXJtczIpLCBwb2x5KFZhcjEsVGVybXMpKSA6LQorICAgIFZhcjEgbGVzc190aGFuIFZhcjIsICEsCisgICAgbXVsX3Rocm91Z2goVGVybXMxLCBwb2x5KFZhcjIsVGVybXMyKSwgVGVybXMpLgorcG9seV9tdWwoUCwgcG9seShWYXIsVGVybXMyKSwgcG9seShWYXIsVGVybXMpKSA6LSAhLAorICAgIG11bF90aHJvdWdoKFRlcm1zMiwgUCwgVGVybXMpLgorcG9seV9tdWwocG9seShWYXIsVGVybXMxKSwgQywgcG9seShWYXIsVGVybXMpKSA6LSAhLAorICAgIG11bF90aHJvdWdoKFRlcm1zMSwgQywgVGVybXMpLgorcG9seV9tdWwoQzEsIEMyLCBDKSA6LQorICAgIEMgaXMgQzEqQzIuCisKK3Rlcm1fbXVsKFtdLCBfLCBbXSkgOi0gIS4KK3Rlcm1fbXVsKF8sIFtdLCBbXSkgOi0gIS4KK3Rlcm1fbXVsKFtUZXJtfFRlcm1zMV0sIFRlcm1zMiwgVGVybXMpIDotCisgICAgc2luZ2xlX3Rlcm1fbXVsKFRlcm1zMiwgVGVybSwgUGFydEEpLAorICAgIHRlcm1fbXVsKFRlcm1zMSwgVGVybXMyLCBQYXJ0QiksCisgICAgdGVybV9hZGQoUGFydEEsIFBhcnRCLCBUZXJtcykuCisKK3NpbmdsZV90ZXJtX211bChbXSwgXywgW10pIDotICEuCitzaW5nbGVfdGVybV9tdWwoW3Rlcm0oRTEsQzEpfFRlcm1zMV0sIHRlcm0oRTIsQzIpLCBbdGVybShFLEMpfFRlcm1zXSkgOi0KKyAgICBFIGlzIEUxK0UyLAorICAgIHBvbHlfbXVsKEMxLCBDMiwgQyksCisgICAgc2luZ2xlX3Rlcm1fbXVsKFRlcm1zMSwgdGVybShFMixDMiksIFRlcm1zKS4KKworbXVsX3Rocm91Z2goW10sIF8sIFtdKSA6LSAhLgorbXVsX3Rocm91Z2goW3Rlcm0oRSxUZXJtKXxUZXJtc10sIFBvbHksIFt0ZXJtKEUsTmV3VGVybSl8TmV3VGVybXNdKSA6LQorICAgIHBvbHlfbXVsKFRlcm0sIFBvbHksIE5ld1Rlcm0pLAorICAgIG11bF90aHJvdWdoKFRlcm1zLCBQb2x5LCBOZXdUZXJtcykuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9wcm92ZXIuaW4gYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9wcm92ZXIuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxODU4MQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3Byb3Zlci5pbgpAQCAtMCwwICsxIEBACis6LSAnJGJlbmNobWFyaycocHJvdmVyLCAxMDAwLCBwcm92ZXIsICckZHVtbXknKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3Byb3Zlci5wbCBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3Byb3Zlci5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWQ0MmM4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvcHJvdmVyLnBsCkBAIC0wLDAgKzEsOTYgQEAKKyUgZ2VuZXJhdGVkOiAzMCBPY3RvYmVyIDE5ODkKKyUgb3B0aW9uKHMpOiAKKyUKKyUgICBwcm92ZXIKKyUKKyUgICBSaWNoYXJkIEEuIE8nS2VlZmUKKyUKKyUgICBQcm9sb2cgdGhlb3JlbSBwcm92ZXIKKyUKKyUgICBmcm9tICJQcm9sb2cgQ29tcGFyZWQgd2l0aCBMaXNwPywiIFNJR1BMQU4gTm90aWNlcywgdi4gMTggIzUsIE1heSAxOTgzCisKKyUgb3AvMyBkaXJlY3RpdmVzCisKKzotIG9wKDk1MCwgeGZ5LCAjKS4JJSBkaXNqdW5jdGlvbgorOi0gb3AoODUwLCB4ZnksICYpLgklIGNvbmp1bmN0aW9uCis6LSBvcCg1MDAsIGZ4LCArKS4JJSBhc3NlcnRpb24KKzotIG9wKDUwMCwgZngsIC0pLgklIGRlbmlhbAorCitwcm92ZXIgOi0gcHJvYmxlbShfLCBQLCBDKSwKKwkgIGltcGxpZXMoUCwgQyksCisJICBmYWlsLgorcHJvdmVyLgorCislIHByb2JsZW0gc2V0CisKK3Byb2JsZW0oIDEsIC1hLCArYSkuCisKK3Byb2JsZW0oIDIsICthLCAtYSAmIC1hKS4KKworcHJvYmxlbSggMywgLWEsICt0b19iZSAjIC10b19iZSkuCisKK3Byb2JsZW0oIDQsIC1hICYgLWEsIC1hKS4KKworcHJvYmxlbSggNSwgLWEsICtiICMgLWEpLgorCitwcm9ibGVtKCA2LCAtYSAmIC1iLCAtYiAmIC1hKS4KKworcHJvYmxlbSggNywgLWEsIC1iICMgKCtiICYgLWEpKS4KKworcHJvYmxlbSggOCwgLWEgIyAoLWIgIyArYyksIC1iICMgKC1hICMgK2MpKS4KKworcHJvYmxlbSggOSwgLWEgIyArYiwgKCtiICYgLWMpICMgKC1hICMgK2MpKS4KKworcHJvYmxlbSggMTAsICgtYSAjICtjKSAmICgtYiAjICtjKSwgKC1hICYgLWIpICMgK2MpLgorCislIFByb2xvZyB0aGVvcmVtIHByb3ZlcgorCitpbXBsaWVzKFByZW1pc2UsIENvbmNsdXNpb24pIDotCisJb3Bwb3NpdGUoQ29uY2x1c2lvbiwgRGVuaWFsKSwKKwlhZGRfY29uanVuY3Rpb24oUHJlbWlzZSwgRGVuaWFsLCBmcyhbXSxbXSxbXSxbXSkpLgorCitvcHBvc2l0ZShGMCAmIEcwLCBGMSAjIEcxKSA6LSAhLAorCW9wcG9zaXRlKEYwLCBGMSksCisJb3Bwb3NpdGUoRzAsIEcxKS4KK29wcG9zaXRlKEYxICMgRzEsIEYwICYgRzApIDotICEsCisJb3Bwb3NpdGUoRjEsIEYwKSwKKwlvcHBvc2l0ZShHMSwgRzApLgorb3Bwb3NpdGUoK0F0b20sIC1BdG9tKSA6LSAhLgorb3Bwb3NpdGUoLUF0b20sICtBdG9tKS4KKworYWRkX2Nvbmp1bmN0aW9uKEYsIEcsIFNldCkgOi0KKwlleHBhbmQoRiwgU2V0LCBNaWQpLAorCWV4cGFuZChHLCBNaWQsIE5ldyksCisJcmVmdXRlKE5ldykuCisKK2V4cGFuZChfLCByZWZ1dGVkLCByZWZ1dGVkKSA6LSAhLgorZXhwYW5kKEYgJiBHLCBmcyhELF8sXyxfKSwgcmVmdXRlZCkgOi0KKwlpbmNsdWRlcyhELCBGICYgRyksICEuCitleHBhbmQoRiAmIEcsIGZzKEQsQyxQLE4pLCBmcyhELEMsUCxOKSkgOi0KKwlpbmNsdWRlcyhDLCBGICYgRyksICEuCitleHBhbmQoRiAmIEcsIGZzKEQsQyxQLE4pLCBOZXcpIDotICEsCisJZXhwYW5kKEYsIGZzKEQsW0YgJiBHfENdLFAsTiksIE1pZCksCisJZXhwYW5kKEcsIE1pZCwgTmV3KS4KK2V4cGFuZChGICMgRywgZnMoRCxDLFAsTiksIFNldCkgOi0gISwKKwlvcHBvc2l0ZShGICMgRywgQ29uaiksCisJZXh0ZW5kKENvbmosIEQsIEMsIEQxLCBmcyhEMSxDLFAsTiksIFNldCkuCitleHBhbmQoK0F0b20sIGZzKEQsQyxQLE4pLCBTZXQpIDotICEsCisJZXh0ZW5kKEF0b20sIFAsIE4sIFAxLCBmcyhELEMsUDEsTiksIFNldCkuCitleHBhbmQoLUF0b20sIGZzKEQsQyxQLE4pLCBTZXQpIDotCisJZXh0ZW5kKEF0b20sIE4sIFAsIE4xLCBmcyhELEMsUCxOMSksIFNldCkuCisKK2luY2x1ZGVzKFtIZWFkfF9dLCBIZWFkKSA6LSAhLgoraW5jbHVkZXMoW198VGFpbF0sIFRoaXMpIDotIGluY2x1ZGVzKFRhaWwsIFRoaXMpLgorCitleHRlbmQoRXhwLCBfLCBOZWcsIF8sIF8sIHJlZnV0ZWQpIDotIGluY2x1ZGVzKE5lZywgRXhwKSwgIS4KK2V4dGVuZChFeHAsIFBvcywgXywgUG9zLCBTZXQsIFNldCkgOi0gaW5jbHVkZXMoUG9zLCBFeHApLCAhLgorZXh0ZW5kKEV4cCwgUG9zLCBfLCBbRXhwfFBvc10sIFNldCwgU2V0KS4KKworcmVmdXRlKHJlZnV0ZWQpIDotICEuCityZWZ1dGUoZnMoW0YxICYgRzF8RF0sIEMsIFAsIE4pKSA6LQorCW9wcG9zaXRlKEYxLCBGMCksCisJb3Bwb3NpdGUoRzEsIEcwKSwKKwlTZXQgPSBmcyhELCBDLCBQLCBOKSwKKwlhZGRfY29uanVuY3Rpb24oRjAsIEcxLCBTZXQpLAorCWFkZF9jb25qdW5jdGlvbihGMCwgRzAsIFNldCksCisJYWRkX2Nvbmp1bmN0aW9uKEYxLCBHMCwgU2V0KS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3Fzb3J0LmluIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvcXNvcnQuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY2OTUxNwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3Fzb3J0LmluCkBAIC0wLDAgKzEgQEAKKzotICckYmVuY2htYXJrJyhxc29ydCwgMTAwMCwgcXNvcnQsICckZHVtbXknKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3Fzb3J0LnBsIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvcXNvcnQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1ZGRmOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3Fzb3J0LnBsCkBAIC0wLDAgKzEsMjcgQEAKKyUgZ2VuZXJhdGVkOiAxNiBOb3ZlbWJlciAxOTg5CislIG9wdGlvbihzKTogU09VUkNFX1RSQU5TRk9STV8xCislCislICAgcXNvcnQKKyUKKyUgICBEYXZpZCBILiBELiBXYXJyZW4KKyUKKyUgICBxdWlja3NvcnQgYSBsaXN0IG9mIDUwIGludGVnZXJzCisKK3Fzb3J0IDotIHFzb3J0KFsyNyw3NCwxNywzMyw5NCwxOCw0Niw4Myw2NSwgMiwKKwkJMzIsNTMsMjgsODUsOTksNDcsMjgsODIsIDYsMTEsCisJCTU1LDI5LDM5LDgxLDkwLDM3LDEwLCAwLDY2LDUxLAorCQkgNywyMSw4NSwyNywzMSw2Myw3NSwgNCw5NSw5OSwKKwkJMTEsMjgsNjEsNzQsMTgsOTIsNDAsNTMsNTksIDhdLF8sW10pLgorCitxc29ydChbWHxMXSxSLFIwKSA6LQorCXBhcnRpdGlvbihMLFgsTDEsTDIpLAorCXFzb3J0KEwyLFIxLFIwKSwKKwlxc29ydChMMSxSLFtYfFIxXSkuCitxc29ydChbXSxSLFIpLgorCitwYXJ0aXRpb24oW1h8TF0sWSxbWHxMMV0sTDIpIDotCisJWCA9PCBZLCAhLAorCXBhcnRpdGlvbihMLFksTDEsTDIpLgorcGFydGl0aW9uKFtYfExdLFksTDEsW1h8TDJdKSA6LQorCXBhcnRpdGlvbihMLFksTDEsTDIpLgorcGFydGl0aW9uKFtdLF8sW10sW10pLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvcXVlZW5zXzguaW4gYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9xdWVlbnNfOC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDNhOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvcXVlZW5zXzguaW4KQEAgLTAsMCArMSBAQAorOi0gJyRiZW5jaG1hcmsnKHF1ZWVuc184LCAxMDAwLCBxdWVlbnNfOCwgJyRkdW1teScpLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvcXVlZW5zXzgucGwgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9xdWVlbnNfOC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTBkYTIwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvcXVlZW5zXzgucGwKQEAgLTAsMCArMSw2MiBAQAorJSBnZW5lcmF0ZWQ6IDEwIE5vdmVtYmVyIDE5ODkKKyUgb3B0aW9uKHMpOiAKKyUKKyUgICAocXVlZW5zKSBxdWVlbnNfOAorJQorJSAgIGZyb20gU3RlcmxpbmcgYW5kIFNoYXBpcm8sICJUaGUgQXJ0IG9mIFByb2xvZywiIHBhZ2UgMjExLgorJQorJSAgIHNvbHZlIHRoZSA4IHF1ZWVucyBwcm9ibGVtCisKK3F1ZWVuc184IDotIHF1ZWVucyg4LF8pLCAhLgorCislICAgVGhpcyBwcm9ncmFtIHNvbHZlcyB0aGUgTiBxdWVlbnMgcHJvYmxlbTogIHBsYWNlIE4gcGllY2VzIG9uIGFuIE4KKyUgICBieSBOIHJlY3Rhbmd1bGFyIGJvYXJkIHNvIHRoYXQgbm8gdHdvIHBpZWNlcyBhcmUgb24gdGhlIHNhbWUgbGluZQorJSAgIC0gaG9yaXpvbnRhbCwgdmVydGljYWwsIG9yIGRpYWdvbmFsLiAgKE4gcXVlZW5zIHNvIHBsYWNlZCBvbiBhbiBOCislICAgYnkgTiBjaGVzc2JvYXJkIGFyZSB1bmFibGUgdG8gYXR0YWNrIGVhY2ggb3RoZXIgaW4gYSBzaW5nbGUgbW92ZQorJSAgIHVuZGVyIHRoZSBydWxlcyBvZiBjaGVzcy4pICBUaGUgc3RyYXRlZ3kgaXMgaW5jcmVtZW50YWwgZ2VuZXJhdGUtCislICAgYW5kLXRlc3QuCislCislICAgQSBzb2x1dGlvbiBpcyBzcGVjaWZpZWQgYnkgYSBwZXJtdXRhdGlvbiBvZiB0aGUgbGlzdCBvZiBudW1iZXJzIDEgdG8KKyUgICBOLiAgVGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3QgaXMgdGhlIHJvdyBudW1iZXIgZm9yIHRoZSBxdWVlbiBpbgorJSAgIHRoZSBmaXJzdCBjb2x1bW4sIHRoZSBzZWNvbmQgZWxlbWVudCBpcyB0aGUgcm93IG51bWJlciBmb3IgdGhlIHF1ZWVuCislICAgaW4gdGhlIHNlY29uZCBjb2x1bW4sIGV0IGNldGVyYS4gIFRoaXMgc2NoZW1lIGltcGxpY2l0bHkgaW5jb3Jwb3JhdGVzCislICAgdGhlIG9ic2VydmF0aW9uIHRoYXQgYW55IHNvbHV0aW9uIG9mIHRoZSBwcm9ibGVtIGhhcyBleGFjdGx5IG9uZSBxdWVlbgorJSAgIGluIGVhY2ggY29sdW1uLgorJQorJSAgIFRoZSBwcm9ncmFtIGRpc3Rpbmd1aXNoZXMgc3ltbWV0cmljIHNvbHV0aW9ucy4gIEZvciBleGFtcGxlLCAKKyUKKyUgICA/LSBxdWVlbnMoNCwgUXMpLgorJQorJSAgIHByb2R1Y2VzCislCislICAgUXMgPSBbMywxLDQsMl0gOworJQorJSAgIFFzID0gWzIsNCwxLDNdCisKK3F1ZWVucyhOLFFzKSA6LQorCXJhbmdlKDEsTixOcyksCisJcXVlZW5zKE5zLFtdLFFzKS4KKworcXVlZW5zKFtdLFFzLFFzKS4KK3F1ZWVucyhVbnBsYWNlZFFzLFNhZmVRcyxRcykgOi0KKwlzZWxlY3QoVW5wbGFjZWRRcyxVbnBsYWNlZFFzMSxRKSwKKwlub3RfYXR0YWNrKFNhZmVRcyxRKSwKKwlxdWVlbnMoVW5wbGFjZWRRczEsW1F8U2FmZVFzXSxRcykuCisKK25vdF9hdHRhY2soWHMsWCkgOi0KKwlub3RfYXR0YWNrKFhzLFgsMSkuCisKK25vdF9hdHRhY2soW10sXyxfKSA6LSAhLgorbm90X2F0dGFjayhbWXxZc10sWCxOKSA6LQorCVggPVw9IFkrTiwgWCA9XD0gWS1OLAorCU4xIGlzIE4rMSwKKwlub3RfYXR0YWNrKFlzLFgsTjEpLgorCitzZWxlY3QoW1h8WHNdLFhzLFgpLgorc2VsZWN0KFtZfFlzXSxbWXxac10sWCkgOi0gc2VsZWN0KFlzLFpzLFgpLgorCityYW5nZShOLE4sW05dKSA6LSAhLgorcmFuZ2UoTSxOLFtNfE5zXSkgOi0KKwlNIDwgTiwKKwlNMSBpcyBNKzEsCisJcmFuZ2UoTTEsTixOcykuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9xdWVyeS5pbiBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3F1ZXJ5LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NGI5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9xdWVyeS5pbgpAQCAtMCwwICsxIEBACis6LSAnJGJlbmNobWFyaycocXVlcnksIDEwMDAsIHF1ZXJ5LCAnJGR1bW15JykuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9xdWVyeS5wbCBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3F1ZXJ5LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMmNkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9xdWVyeS5wbApAQCAtMCwwICsxLDc5IEBACislIGdlbmVyYXRlZDogMTcgTm92ZW1iZXIgMTk4OQorJSBvcHRpb24ocyk6IFNPVVJDRV9UUkFOU0ZPUk1fMQorJQorJSAgIHF1ZXJ5CislCislICAgRGF2aWQgSC4gRC4gV2FycmVuCislCislICAgcXVlcnkgcG9wdWxhdGlvbiBhbmQgYXJlYSBkYXRhYmFzZSB0byBmaW5kIGNvdW4tCislICAgdHJpZXMgb2YgYXBwcm94aW1hdGVseSBlcXVhbCBwb3B1bGF0aW9uIGRlbnNpdHkKKworcXVlcnkgOi0gcXVlcnkoXyksIGZhaWwuCitxdWVyeS4KKworcXVlcnkoW0MxLEQxLEMyLEQyXSkgOi0gCisgICAgZGVuc2l0eShDMSxEMSksIAorICAgIGRlbnNpdHkoQzIsRDIpLAorICAgIEQxID4gRDIsCisgICAgVDEgaXMgMjAqRDEsCisgICAgVDIgaXMgMjEqRDIsCisgICAgVDEgPCBUMi4KKworZGVuc2l0eShDLEQpIDotIAorICAgIHBvcChDLFApLAorICAgIGFyZWEoQyxBKSwKKyAgICBEIGlzIChQKjEwMCkvL0EuCisKKyUgcG9wdWxhdGlvbnMgaW4gMTAwMDAwJ3MKK3BvcChjaGluYSwJODI1MCkuCitwb3AoaW5kaWEsCTU4NjMpLgorcG9wKHVzc3IsCTI1MjEpLgorcG9wKHVzYSwJMjExOSkuCitwb3AoaW5kb25lc2lhLAkxMjc2KS4KK3BvcChqYXBhbiwJMTA5NykuCitwb3AoYnJhemlsLAkxMDQyKS4KK3BvcChiYW5nbGFkZXNoLAkgNzUwKS4KK3BvcChwYWtpc3RhbiwJIDY4MikuCitwb3Aod19nZXJtYW55LAkgNjIwKS4KK3BvcChuaWdlcmlhLAkgNjEzKS4KK3BvcChtZXhpY28sCSA1ODEpLgorcG9wKHVrLAkJIDU1OSkuCitwb3AoaXRhbHksCSA1NTQpLgorcG9wKGZyYW5jZSwJIDUyNSkuCitwb3AocGhpbGlwcGluZXMsIDQxNSkuCitwb3AodGhhaWxhbmQsCSA0MTApLgorcG9wKHR1cmtleSwJIDM4MykuCitwb3AoZWd5cHQsCSAzNjQpLgorcG9wKHNwYWluLAkgMzUyKS4KK3BvcChwb2xhbmQsCSAzMzcpLgorcG9wKHNfa29yZWEsCSAzMzUpLgorcG9wKGlyYW4sCSAzMjApLgorcG9wKGV0aGlvcGlhLAkgMjcyKS4KK3BvcChhcmdlbnRpbmEsCSAyNTEpLgorCislIGFyZWFzIGluIDEwMDAncyBvZiBzcXVhcmUgbWlsZXMKK2FyZWEoY2hpbmEsICAgICAzMzgwKS4KK2FyZWEoaW5kaWEsICAgICAxMTM5KS4KK2FyZWEodXNzciwgICAgICA4NzA4KS4KK2FyZWEodXNhLCAgICAgICAzNjA5KS4KK2FyZWEoaW5kb25lc2lhLCAgNTcwKS4KK2FyZWEoamFwYW4sICAgICAgMTQ4KS4KK2FyZWEoYnJhemlsLCAgICAzMjg4KS4KK2FyZWEoYmFuZ2xhZGVzaCwgIDU1KS4KK2FyZWEocGFraXN0YW4sICAgMzExKS4KK2FyZWEod19nZXJtYW55LCAgIDk2KS4KK2FyZWEobmlnZXJpYSwgICAgMzczKS4KK2FyZWEobWV4aWNvLCAgICAgNzY0KS4KK2FyZWEodWssICAgICAgICAgIDg2KS4KK2FyZWEoaXRhbHksICAgICAgMTE2KS4KK2FyZWEoZnJhbmNlLCAgICAgMjEzKS4KK2FyZWEocGhpbGlwcGluZXMsIDkwKS4KK2FyZWEodGhhaWxhbmQsICAgMjAwKS4KK2FyZWEodHVya2V5LCAgICAgMjk2KS4KK2FyZWEoZWd5cHQsICAgICAgMzg2KS4KK2FyZWEoc3BhaW4sICAgICAgMTkwKS4KK2FyZWEocG9sYW5kLCAgICAgMTIxKS4KK2FyZWEoc19rb3JlYSwgICAgIDM3KS4KK2FyZWEoaXJhbiwgICAgICAgNjI4KS4KK2FyZWEoZXRoaW9waWEsICAgMzUwKS4KK2FyZWEoYXJnZW50aW5hLCAxMDgwKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3JlZHVjZXIuaW4gYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9yZWR1Y2VyLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYjY2ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9yZWR1Y2VyLmluCkBAIC0wLDAgKzEgQEAKKzotICckYmVuY2htYXJrJyhyZWR1Y2VyLCAxMDAwLCBtYWluLCAnJGR1bW15JykuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9yZWR1Y2VyLnBsIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvcmVkdWNlci5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTUyODFiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvcmVkdWNlci5wbApAQCAtMCwwICsxLDM3OSBAQAorLyogQ0hBTkdFTE9HIGJ5IE0uQmFuYmFyYQorICAgLSBjb21tZW50IG91dCB3cml0ZS8xIGFuZCBubC8wCisqLworCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCisKKyUgQSBHcmFwaCBSZWR1Y2VyIGZvciBULUNvbWJpbmF0b3JzOgorJSBSZWR1Y2VzIGEgVC1jb21iaW5hdG9yIGV4cHJlc3Npb24gdG8gYSBmaW5hbCBhbnN3ZXIuICBSZWNvZ25pemVzCislIHRoZSBjb21iaW5hdG9ycyBJLEssUyxCLEMsUycsQicsQycsIGNvbmQsIGFwcGx5LCBhcml0aG1ldGljLCB0ZXN0cywKKyUgYmFzaWMgbGlzdCBvcGVyYXRpb25zLCBhbmQgZnVuY3Rpb24gZGVmaW5pdGlvbnMgaW4gdGhlIGRhdGEgYmFzZSBzdG9yZWQKKyUgYXMgZmFjdHMgb2YgdGhlIGZvcm0gdF9kZWYoX2Z1bmMsIF9hcmdzLCBfZXhwcikuCislIFdyaXR0ZW4gYnkgUGV0ZXIgVmFuIFJveQorCislIFVzZXMgd3JpdGUvMSwgY29tcGFyZS8zLCBmdW5jdG9yLzMsIGFyZy8zLgorbWFpbiA6LQorCXRyeShmYWMoMyksIF9hbnMxKSwKKwkld3JpdGUoX2FuczEpLCBubCwKKwl0cnkocXVpY2soWzMsMSwyXSksIF9hbnMyKS4KKwkld3JpdGUoX2FuczIpLCBubC4KKwordHJ5KF9pbnBleHByLCBfYW5zbGlzdCkgOi0KKwlsaXN0aWZ5KF9pbnBleHByLCBfbGlzdCksCisJY3VycnkoX2xpc3QsIF9jdXJyeSksCisJdF9yZWR1Y2UoX2N1cnJ5LCBfYW5zKSwgJW5sLAorCW1ha2VfbGlzdChfYW5zLCBfYW5zbGlzdCkuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKworJSBFeGFtcGxlcyBvZiBhcHBsaWNhdGl2ZSBmdW5jdGlvbnMgd2hpY2ggY2FuIGJlIGNvbXBpbGVkICYgZXhlY3V0ZWQuCislIFRoaXMgdGVzdCB2ZXJzaW9uIGNvbXBpbGVzIHRoZW0ganVzdCBiZWZvcmUgZWFjaCBleGVjdXRpb24uCisKKyUgRmFjdG9yaWFsIGZ1bmN0aW9uOgordF9kZWYoZmFjLCBbTl0sIGNvbmQoTj0wLCAxLCBOKmZhYyhOLTEpKSkuCisKKyUgUXVpY2tzb3J0OgordF9kZWYocXVpY2ssIFtfbF0sIGNvbmQoX2w9W10sIFtdLAorCQkgY29uZCh0bChfbCk9W10sIF9sLAorCQkgcXVpY2syKHNwbGl0KGhkKF9sKSx0bChfbCkpKSkpKS4KK3RfZGVmKHF1aWNrMiwgW19sXSwgYXBwZW5kKHF1aWNrKGhkKF9sKSksIHF1aWNrKHRsKF9sKSkpKS4KKwordF9kZWYoc3BsaXQsIFtfZSxfbF0sIGNvbmQoX2w9W10sIFtbX2VdfFtdXSwKKwkJICAgIGNvbmQoaGQoX2wpPTxfZSwgaW5zZXJ0aGVhZChoZChfbCksc3BsaXQoX2UsdGwoX2wpKSksCisJCSAgICBpbnNlcnR0YWlsKGhkKF9sKSxzcGxpdChfZSx0bChfbCkpKSkpKS4KK3RfZGVmKGluc2VydGhlYWQsIFtfZSxfbF0sIFtbX2V8aGQoX2wpXXx0bChfbCldKS4KK3RfZGVmKGluc2VydHRhaWwsIFtfZSxfbF0sIFtoZChfbCl8W19lfHRsKF9sKV1dKS4KKwordF9kZWYoYXBwZW5kLCBbX2EsX2JdLCBjb25kKF9hPVtdLCBfYiwgW2hkKF9hKXxhcHBlbmQodGwoX2EpLF9iKV0pKS4KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorCislIEZ1bGwgcmVkdWN0aW9uOgorJSBBIGRvdCAnLicgaXMgcHJpbnRlZCBmb3IgZWFjaCByZWR1Y3Rpb24gc3RlcC4KKwordF9yZWR1Y2UoX2V4cHIsIF9hbnMpIDotCisJYXRvbWljKF9leHByKSwgISwKKwkgX2Fucz1fZXhwci4KKyUgVGhlIHJlZHVjdGlvbiBvZiAnLicgbXVzdCBiZSBoZXJlIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AKK3RfcmVkdWNlKFtfeSxfeHwnLiddLCBbX3lyLF94cnwnLiddKSA6LQorCXRfcmVkdWNlKF94LCBfeHIpLAorCSEsCisJdF9yZWR1Y2UoX3ksIF95ciksCisJIS4KK3RfcmVkdWNlKF9leHByLCBfYW5zKSA6LQorCXRfYXBwZW5kKF9uZXh0LCBfcmVkLCBfZm9ybSwgX2V4cHIpLAorCSV3cml0ZSgnLicpLAorCXRfcmVkZXgoX2Zvcm0sIF9yZWQpLAorCSEsCisJdF9yZWR1Y2UoX25leHQsIF9hbnMpLCAKKwkhLgorCit0X2FwcGVuZChfbGluaywgX2xpbmssIF9sLCBfbCkuCit0X2FwcGVuZChbX2F8X2wxXSwgX2xpbmssIF9sMiwgW19hfF9sM10pIDotIHRfYXBwZW5kKF9sMSwgX2xpbmssIF9sMiwgX2wzKS4KKworJSBPbmUgc3RlcCBvZiB0aGUgcmVkdWN0aW9uOgorCislIENvbWJpbmF0b3JzOgordF9yZWRleChbX3gsX2csX2YsX2t8c3BdLCBbW194cnxfZ10sW194cnxfZl18X2tdKSA6LSB0X3JlZHVjZShfeCwgX3hyKS4KK3RfcmVkZXgoW194LF9nLF9mLF9rfGJwXSwgW1tfeHxfZ10sX2Z8X2tdKS4KK3RfcmVkZXgoW194LF9nLF9mLF9rfGNwXSwgW19nLFtfeHxfZl18X2tdKS4KK3RfcmVkZXgoW194LF9nLF9mfHNdLCBbW194cnxfZ118W194cnxfZl1dKSA6LSB0X3JlZHVjZShfeCwgX3hyKS4KK3RfcmVkZXgoW194LF9nLF9mfGJdLCBbW194fF9nXXxfZl0pLgordF9yZWRleChbX3gsX2csX2Z8Y10sIFtfZyxfeHxfZl0pLgordF9yZWRleChbX3ksX3h8a10sIF94KS4KK3RfcmVkZXgoW194fGldLCBfeCkuCisKKyUgQ29uZGl0aW9uYWw6Cit0X3JlZGV4KFtfZWxzZXBhcnQsX2lmcGFydCxfY29uZHxjb25kXSwgX2lmcGFydCkgOi0KKwl0X3JlZHVjZShfY29uZCwgX2Jvb2wpLCBfYm9vbD10cnVlLCAhLgorCSUgRG9lcyBOT1Qgd29yayBpZiBfYm9vbCBpcyBzdWJzdGl0dXRlZCBpbiB0aGUgY2FsbCEKK3RfcmVkZXgoW19lbHNlcGFydCxfaWZwYXJ0LF9jb25kfGNvbmRdLCBfZWxzZXBhcnQpLgorCislIEFwcGx5OgordF9yZWRleChbX2Z8YXBwbHldLCBfZnIpIDotIAorCXRfcmVkdWNlKF9mLCBfZnIpLgorCislIExpc3Qgb3BlcmF0aW9uczoKK3RfcmVkZXgoW19hcmd8aGRdLCBfeCkgOi0gCisJdF9yZWR1Y2UoX2FyZywgW195LF94fCcuJ10pLgordF9yZWRleChbX2FyZ3x0bF0sIF95KSA6LSAKKwl0X3JlZHVjZShfYXJnLCBbX3ksX3h8Jy4nXSkuCisKKyUgQXJpdGhtZXRpYzoKK3RfcmVkZXgoW195LF94fF9vcF0sIF9yZXMpIDotCisJYXRvbShfb3ApLAorCW1lbWJlcihfb3AsIFsnKycsICctJywgJyonLCAnLy8nLCAnbW9kJ10pLAorCXRfcmVkdWNlKF94LCBfeHJlcyksCisJdF9yZWR1Y2UoX3ksIF95cmVzKSwKKwludW1iZXIoX3hyZXMpLCBudW1iZXIoX3lyZXMpLAorCWV2YWwoX29wLCBfcmVzLCBfeHJlcywgX3lyZXMpLgorCislIFRlc3RzOgordF9yZWRleChbX3ksX3h8X3Rlc3RdLCBfcmVzKSA6LQorCWF0b20oX3Rlc3QpLAorCW1lbWJlcihfdGVzdCwgWyc8JywgJz4nLCAnPTwnLCAnPj0nLCAnPVw9JywgJz06PSddKSwKKwl0X3JlZHVjZShfeCwgX3hyZXMpLAorCXRfcmVkdWNlKF95LCBfeXJlcyksCisJbnVtYmVyKF94cmVzKSwgbnVtYmVyKF95cmVzKSwKKwkocmVsb3AoX3Rlc3QsIF94cmVzLCBfeXJlcykKKwktPiBfcmVzPXRydWUKKwk7ICBfcmVzPWZhbHNlCisJKSwgIS4KKworJSBFcXVhbGl0eToKK3RfcmVkZXgoW195LF94fD1dLCBfcmVzKSA6LQorCXRfcmVkdWNlKF94LCBfeHJlcyksCisJdF9yZWR1Y2UoX3ksIF95cmVzKSwKKwkoX3hyZXM9X3lyZXMgLT4gX3Jlcz10cnVlOyBfcmVzPWZhbHNlKSwgIS4KKworJSBBcml0aG1ldGljIGZ1bmN0aW9uczoKK3RfcmVkZXgoW194fF9vcF0sIF9yZXMpIDotCisJYXRvbShfb3ApLAorCW1lbWJlcihfb3AsIFsnLSddKSwKKwl0X3JlZHVjZShfeCwgX3hyZXMpLAorCW51bWJlcihfeHJlcyksCisJZXZhbDEoX29wLCBfdCwgX3hyZXMpLgorCislIERlZmluaXRpb25zOgorJSBBc3N1bWVzIGEgZmFjdCB0X2RlZihfZnVuYyxfZGVmKSBpbiB0aGUgZGF0YWJhc2UgZm9yIGV2ZXJ5CislIGRlZmluZWQgZnVuY3Rpb24uCit0X3JlZGV4KF9pbiwgX291dCkgOi0KKwlhcHBlbmQoX3BhcixfZnVuYyxfaW4pLAorCWF0b20oX2Z1bmMpLAorCXRfZGVmKF9mdW5jLCBfYXJncywgX2V4cHIpLAorCXQoX2FyZ3MsIF9leHByLCBfZGVmKSwKKwlhcHBlbmQoX3BhcixfZGVmLF9vdXQpLgorCislIEJhc2ljIGFyaXRobWV0aWMgYW5kIHJlbGF0aW9uYWwgb3BlcmF0b3JzOgorCitldmFsKCAgJysnLCBDLCBBLCBCKSA6LSBDIGlzIEEgKyBCLgorZXZhbCggICctJywgQywgQSwgQikgOi0gQyBpcyBBIC0gQi4KK2V2YWwoICAnKicsIEMsIEEsIEIpIDotIEMgaXMgQSAqIEIuCitldmFsKCAnLy8nLCBDLCBBLCBCKSA6LSBDIGlzIEEgLy8gQi4KK2V2YWwoJ21vZCcsIEMsIEEsIEIpIDotIEMgaXMgQSBtb2QgQi4KKworZXZhbDEoJy0nLCBDLCBBKSA6LSBDIGlzIC1BLgorCityZWxvcCggICc8JywgQSwgQikgOi0gQTxCLgorcmVsb3AoICAnPicsIEEsIEIpIDotIEE+Qi4KK3JlbG9wKCAnPTwnLCBBLCBCKSA6LSBBPTxCLgorcmVsb3AoICc+PScsIEEsIEIpIDotIEE+PUIuCityZWxvcCgnPVw9JywgQSwgQikgOi0gQT1cPUIuCityZWxvcCgnPTo9JywgQSwgQikgOi0gQT06PUIuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKworJSBTY2hlbWUgVDoKKyUgQSBUcmFuc2xhdGlvbiBTY2hlbWUgZm9yIFQtQ29tYmluYXRvcnMKKworJSBUcmFuc2xhdGUgYW4gZXhwcmVzc2lvbiB0byBjb21iaW5hdG9yIGZvcm0KKyUgYnkgYWJzdHJhY3Rpbmcgb3V0IGFsbCB2YXJpYWJsZXMgaW4gX2FyZ3ZhcnM6Cit0KF9hcmd2YXJzLCBfZXhwciwgX3RyYW5zKSA6LQorCWxpc3RpZnkoX2V4cHIsIF9saXN0KSwKKwljdXJyeShfbGlzdCwgX2N1cnJ5KSwKKwl0X2FyZ3ZhcnMoX2FyZ3ZhcnMsIF9jdXJyeSwgX3RyYW5zKSwgIS4KKwordF9hcmd2YXJzKFtdLCBfdHJhbnMsIF90cmFucykuCit0X2FyZ3ZhcnMoW194fF9hcmd2YXJzXSwgX2luLCBfdHJhbnMpIDotCisJdF9hcmd2YXJzKF9hcmd2YXJzLCBfaW4sIF9taWQpLAorCXRfdmFycyhfbWlkLCBfdmFycyksICUgY2FsY3VsYXRlIHZhcmlhYmxlcyBpbiBlYWNoIHN1YmV4cHJlc3Npb24KKwl0X3RyYW5zKF94LCBfbWlkLCBfdmFycywgX3RyYW5zKS4gJSBtYWluIHRyYW5zbGF0aW9uIHJvdXRpbmUKKworJSBDdXJyeSB0aGUgb3JpZ2luYWwgZXhwcmVzc2lvbjoKKyUgVGhpcyBjb252ZXJ0cyBhbiBhcHBsaWNhdGl2ZSBleHByZXNzaW9uIG9mIGFueSBudW1iZXIKKyUgb2YgYXJndW1lbnRzIGFuZCBhbnkgZGVwdGggb2YgbmVzdGluZyBpbnRvIGFuIGV4cHJlc3Npb24KKyUgd2hlcmUgYWxsIGZ1bmN0aW9ucyBhcmUgY3VycmllZCwgaS5lLiBhbGwgZnVuY3Rpb24KKyUgYXBwbGljYXRpb25zIGFyZSB0byBvbmUgYXJndW1lbnQgYW5kIGhhdmUgdGhlIGZvcm0KKyUgW19hcmd8X2Z1bmNdIHdoZXJlIF9mdW5jICYgX2FyZyBhcmUgYWxzbyBvZiB0aGF0IGZvcm0uCislIElucHV0IGlzIGEgbmVzdGVkIGZ1bmN0aW9uIGFwcGxpY2F0aW9uIGluIGxpc3QgZm9ybS4KKyUgQ3VycnlpbmcgbWFrZXMgdF90cmFucyBmYXN0ZXIuCitjdXJyeShfYSwgX2EpIDotICh2YXIoX2EpOyBhdG9taWMoX2EpKSwgIS4KK2N1cnJ5KFtfZnVuY3xfYXJnc10sIF9jYXJncykgOi0KKwljdXJyeWxpc3QoX2FyZ3MsIF9jYXJncywgX2Z1bmMpLgorCislIFRyYW5zZm9ybSBbX2ExLCAuLi4sIF9hTl0gdG8gW19jTiwgLi4uLCBfYzF8X2xpbmtdLV9saW5rCitjdXJyeWxpc3QoW10sIF9saW5rLCBfbGluaykgOi0gIS4KK2N1cnJ5bGlzdChbX2F8X2FyZ3NdLCBfY2FyZ3MsIF9saW5rKSA6LQorCWN1cnJ5KF9hLCBfYyksCisJY3VycnlsaXN0KF9hcmdzLCBfY2FyZ3MsIFtfY3xfbGlua10pLgorCislIENhbGN1bGF0ZSB2YXJpYWJsZXMgaW4gZWFjaCBzdWJleHByZXNzaW9uOgorJSBUbyBhbnkgZXhwcmVzc2lvbiBhIGxpc3Qgb2YgdGhlIGZvcm0KKyUgW192ZXhwciwgX2FzdHIsIF9mc3RyXSBpcyBtYXRjaGVkLgorJSBJZiB0aGUgZXhwcmVzc2lvbiBpcyBhIHZhcmlhYmxlIG9yIGFuIGF0b20KKyUgdGhlbiB0aGlzIGxpc3Qgb25seSBoYXMgdGhlIGZpcnN0IGVsZW1lbnQuCislIF92ZXhwciA9IExpc3Qgb2YgYWxsIHZhcmlhYmxlcyBpbiB0aGUgZXhwcmVzc2lvbi4KKyUgX2FzdHIsIF9mc3RyID0gU2ltaWxhciBzdHJ1Y3R1cmVzIGZvciBhcmd1bWVudCAmIGZ1bmN0aW9uLgordF92YXJzKF92LCBbW192XV0pIDotIHZhcihfdiksICEuCit0X3ZhcnMoX2EsIFtbXV0pIDotIGF0b21pYyhfYSksICEuCit0X3ZhcnMoW19mdW5jXSwgW1tdXSkgOi0gYXRvbWljKF9mdW5jKSwgIS4KK3RfdmFycyhbX2FyZ3xfZnVuY10sIFtfZyxbX2cxfF9hZjFdLFtfZzJ8X2FmMl1dKSA6LQorCXRfdmFycyhfYXJnLCBbX2cxfF9hZjFdKSwKKwl0X3ZhcnMoX2Z1bmMsIFtfZzJ8X2FmMl0pLAorCXVuaW9udihfZzEsIF9nMiwgX2cpLgorCislIFRoZSBtYWluIHRyYW5zbGF0aW9uIHJvdXRpbmU6CislIHRyYW5zKF92YXIsIF9jdXJyaWVkZXhwciwgX3ZhcmV4cHIsIF9yZXN1bHQpCislIFRoZSB0cmFuc2xhdGlvbiBzY2hlbWUgVCBpbiB0aGUgYXJ0aWNsZSBpcyBmb2xsb3dlZCBsaXRlcmFsbHkuCislIEEgZ29vZCBleGFtcGxlIG9mIFByb2xvZyBhcyBhIHNwZWNpZmljYXRpb24gbGFuZ3VhZ2UuCit0X3RyYW5zKF94LCBfYSwgXywgW19hfGtdKSA6LSAoYXRvbWljKF9hKTsgdmFyKF9hKSwgX2FcPT1feCksICEuCit0X3RyYW5zKF94LCBfeSwgXywgaSkgOi0gX3g9PV95LCAhLgordF90cmFucyhfeCwgX2UsIFtfdmV8X10sIFtfZXxrXSkgOi0gbm90aW52KF94LCBfdmUpLgordF90cmFucyhfeCwgW19mfF9lXSwgW192ZWYsX3NmLF9zZV0sIF9yZXMpIDotCisJX3NmPVtfdmZ8X10sCisJX3NlPVtfdmV8X290aGVyXSwKKwkoYXRvbShfZSk7IF9vdGhlcj1bXyxbX3ZlMXxfXV0sIF92ZTFcPT1bXSksCisJdF9ydWxlMShfeCwgX2UsIF92ZSwgX3NlLCBfZiwgX3ZmLCBfc2YsIF9yZXMpLgordF90cmFucyhfeCwgW19nfFtfZnxfZV1dLCBbX3ZlZmcsX3NnLF9zZWZdLCBfcmVzKSA6LQorCV9zZz1bX3ZnfF9dLAorCV9zZWY9W192ZWYsX3NmLF9zZV0sCisJX3NlPVtfdmV8X10sCisJX3NmPVtfdmZ8X10sCisJdF9ydWxlMihfeCwgX2UsIF9mLCBfdmYsIF9zZiwgX2csIF92ZywgX3NnLCBfcmVzKS4KKworJSBGaXJzdCBjb21wbGV4IHJ1bGUgb2YgdHJhbnNsYXRpb24gc2NoZW1lIFQ6Cit0X3J1bGUxKF94LCBfZSwgX3ZlLCBfc2UsIF9mLCBfdmYsIF9zZiwgX2UpIDotCisJbm90aW52KF94LCBfdmUpLCBfeD09X2YsICEuCit0X3J1bGUxKF94LCBfZSwgX3ZlLCBfc2UsIF9mLCBfdmYsIF9zZiwgW19yZXNmLF9lfGJdKSA6LQorCW5vdGludihfeCwgX3ZlKSwgaW52KF94LCBfdmYpLCBfeFw9PV9mLCAhLAorCXRfdHJhbnMoX3gsIF9mLCBfc2YsIF9yZXNmKS4KK3RfcnVsZTEoX3gsIF9lLCBfdmUsIF9zZSwgX2YsIF92ZiwgX3NmLCBbX2YsX3Jlc2V8Y10pIDotCisJLyogaW52KF94LCBfdmUpLCAqLyAKKwlub3RpbnYoX3gsIF92ZiksICEsCisJdF90cmFucyhfeCwgX2UsIF9zZSwgX3Jlc2UpLgordF9ydWxlMShfeCwgX2UsIF92ZSwgX3NlLCBfZiwgX3ZmLCBfc2YsIFtfcmVzZixfcmVzZXxzXSkgOi0KKwkvKiBpbnYoX3gsIF92ZSksIGludihfeCwgX3ZmKSwgKi8KKwl0X3RyYW5zKF94LCBfZSwgX3NlLCBfcmVzZSksCisJdF90cmFucyhfeCwgX2YsIF9zZiwgX3Jlc2YpLgorCislIFNlY29uZCBjb21wbGV4IHJ1bGUgb2YgdHJhbnNsYXRpb24gc2NoZW1lIFQ6Cit0X3J1bGUyKF94LCBfZSwgX2YsIF92ZiwgX3NmLCBfZywgX3ZnLCBfc2csIFtfZyxfZXxjXSkgOi0KKwlfeD09X2YsIG5vdGludihfeCwgX3ZnKSwgIS4KK3RfcnVsZTIoX3gsIF9lLCBfZiwgX3ZmLCBfc2YsIF9nLCBfdmcsIF9zZywgW19yZXNnLF9lfHNdKSA6LQorCV94PT1fZiwgLyogaW52KF94LCBfdmcpLCAqLyAhLAorCXRfdHJhbnMoX3gsIF9nLCBfc2csIF9yZXNnKS4KK3RfcnVsZTIoX3gsIF9lLCBfZiwgX3ZmLCBfc2YsIF9nLCBfdmcsIF9zZywgW19nLF9yZXNmLF9lfGNwXSkgOi0KKwkvKiBfeFw9PV9mLCAqLyBpbnYoX3gsIF92ZiksIG5vdGludihfeCwgX3ZnKSwgISwKKwl0X3RyYW5zKF94LCBfZiwgX3NmLCBfcmVzZikuCit0X3J1bGUyKF94LCBfZSwgX2YsIF92ZiwgX3NmLCBfZywgX3ZnLCBfc2csIFtfcmVzZyxfcmVzZixfZXxzcF0pIDotCisJLyogX3hcPT1fZiwgKi8gaW52KF94LCBfdmYpLCAvKiBpbnYoX3gsIF92ZyksICovICEsCisJdF90cmFucyhfeCwgX2YsIF9zZiwgX3Jlc2YpLAorCXRfdHJhbnMoX3gsIF9nLCBfc2csIF9yZXNnKS4KK3RfcnVsZTIoX3gsIF9lLCBfZiwgX3ZmLCBfc2YsIF9nLCBfdmcsIF9zZywgW19mfF9lXSkgOi0KKwkvKiBub3RpbnYoX3gsIF92ZiksICovIF94PT1fZywgIS4KK3RfcnVsZTIoX3gsIF9lLCBfZiwgX3ZmLCBfc2YsIF9nLCBfdmcsIF9zZywgW19yZXNnLF9mLF9lfGJwXSkgOi0KKwkvKiBub3RpbnYoX3gsIF92ZiksIGludihfeCwgX3ZnKSwgX3hcPT1fZywgKi8KKwl0X3RyYW5zKF94LCBfZywgX3NnLCBfcmVzZykuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKworJSBMaXN0IHV0aWxpdGllczoKKworJSBDb252ZXJ0IGN1cnJpZWQgbGlzdCBpbnRvIGEgcmVndWxhciBsaXN0OgorbWFrZV9saXN0KF9hLCBfYSkgOi0gYXRvbWljKF9hKS4KK21ha2VfbGlzdChbX2IsX2F8Jy4nXSwgW19hfF9yYl0pIDotIG1ha2VfbGlzdChfYiwgX3JiKS4KKworbGlzdGlmeShfWCwgX1gpIDotIAorCSh2YXIoX1gpOyBhdG9taWMoX1gpKSwgIS4KK2xpc3RpZnkoX0V4cHIsIFtfT3B8X0xBcmdzXSkgOi0KKwlmdW5jdG9yKF9FeHByLCBfT3AsIE4pLAorCWxpc3RpZnlfbGlzdCgxLCBOLCBfRXhwciwgX0xBcmdzKS4KKworbGlzdGlmeV9saXN0KEksIE4sIF8sIFtdKSA6LSBJPk4sICEuCitsaXN0aWZ5X2xpc3QoSSwgTiwgX0V4cHIsIFtfTEF8X0xBcmdzXSkgOi0gST08TiwgISwKKwlhcmcoSSwgX0V4cHIsIF9BKSwKKwlsaXN0aWZ5KF9BLCBfTEEpLAorCUkxIGlzIEkrMSwKKwlsaXN0aWZ5X2xpc3QoSTEsIE4sIF9FeHByLCBfTEFyZ3MpLgorCittZW1iZXIoWCwgW1h8X10pLgorbWVtYmVyKFgsIFtffExdKSA6LSBtZW1iZXIoWCwgTCkuCisKK2FwcGVuZChbXSwgTCwgTCkuCithcHBlbmQoW1h8TDFdLCBMMiwgW1h8TDNdKSA6LSBhcHBlbmQoTDEsIEwyLCBMMykuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKworJSBTZXQgdXRpbGl0aWVzOgorJSBJbXBsZW1lbnRhdGlvbiBpbnNwaXJlZCBieSBSLiBPJ0tlZWZlLCBQcmFjdGljYWwgUHJvbG9nLgorJSBTZXRzIGFyZSByZXByZXNlbnRlZCBhcyBzb3J0ZWQgbGlzdHMgd2l0aG91dCBkdXBsaWNhdGVzLgorJSBQcmVkaWNhdGVzIHdpdGggJ3YnIHN1ZmZpeCB3b3JrIHdpdGggc2V0cyBjb250YWluaW5nIHVuaW5zdGFudGlhdGVkIHZhcnMuCisKKyUgKioqIEludGVyc2VjdGlvbgoraW50ZXJzZWN0dihbXSwgXywgW10pLgoraW50ZXJzZWN0dihbQXxTMV0sIFMyLCBTKSA6LSBpbnRlcnNlY3R2XzIoUzIsIEEsIFMxLCBTKS4KKworaW50ZXJzZWN0dl8yKFtdLCBfLCBfLCBbXSkuCitpbnRlcnNlY3R2XzIoW0J8UzJdLCBBLCBTMSwgUykgOi0KKyAgICAgICAgY29tcGFyZShPcmRlciwgQSwgQiksCisgICAgICAgIGludGVyc2VjdHZfMyhPcmRlciwgQSwgUzEsIEIsIFMyLCBTKS4KKworaW50ZXJzZWN0dl8zKDwsIF8sIFMxLCBCLCBTMiwgICAgIFMpIDotIGludGVyc2VjdHZfMihTMSwgQiwgUzIsIFMpLgoraW50ZXJzZWN0dl8zKD0sIEEsIFMxLCBfLCBTMiwgW0F8U10pIDotIGludGVyc2VjdHYoUzEsIFMyLCBTKS4KK2ludGVyc2VjdHZfMyg+LCBBLCBTMSwgXywgUzIsICAgICBTKSA6LSBpbnRlcnNlY3R2XzIoUzIsIEEsIFMxLCBTKS4KKworaW50ZXJzZWN0dl9saXN0KFtdLCBbXSkuCitpbnRlcnNlY3R2X2xpc3QoW0luU3xTZXRzXSwgT3V0UykgOi0gaW50ZXJzZWN0dl9saXN0KFNldHMsIEluUywgT3V0UykuCisKK2ludGVyc2VjdHZfbGlzdChbXSkgLS0+IFtdLgoraW50ZXJzZWN0dl9saXN0KFtTfFNldHNdKSAtLT4gaW50ZXJzZWN0dihTKSwgaW50ZXJzZWN0dl9saXN0KFNldHMpLgorCislICoqKiBEaWZmZXJlbmNlCitkaWZmdihbXSwgXywgW10pLgorZGlmZnYoW0F8UzFdLCBTMiwgUykgOi0gZGlmZnZfMihTMiwgQSwgUzEsIFMpLgorCitkaWZmdl8yKFtdLCBBLCBTMSwgW0F8UzFdKS4KK2RpZmZ2XzIoW0J8UzJdLCBBLCBTMSwgUykgOi0KKyAgICAgICAgY29tcGFyZShPcmRlciwgQSwgQiksCisgICAgICAgIGRpZmZ2XzMoT3JkZXIsIEEsIFMxLCBCLCBTMiwgUykuCisgCitkaWZmdl8zKDwsIEEsIFMxLCBCLCBTMiwgW0F8U10pIDotIGRpZmZ2KFMxLCBbQnxTMl0sIFMpLgorZGlmZnZfMyg9LCBBLCBTMSwgXywgUzIsICAgICBTKSA6LSBkaWZmdihTMSwgUzIsIFMpLgorZGlmZnZfMyg+LCBBLCBTMSwgXywgUzIsICAgICBTKSA6LSBkaWZmdl8yKFMyLCBBLCBTMSwgUykuCisgCislICoqKiBVbmlvbgordW5pb252KFtdLCBTMiwgUzIpLgordW5pb252KFtBfFMxXSwgUzIsIFMpIDotIHVuaW9udl8yKFMyLCBBLCBTMSwgUykuCisgCit1bmlvbnZfMihbXSwgQSwgUzEsIFtBfFMxXSkuCit1bmlvbnZfMihbQnxTMl0sIEEsIFMxLCBTKSA6LQorICAgICAgICBjb21wYXJlKE9yZGVyLCBBLCBCKSwKKyAgICAgICAgdW5pb252XzMoT3JkZXIsIEEsIFMxLCBCLCBTMiwgUykuCisgCit1bmlvbnZfMyg8LCBBLCBTMSwgQiwgUzIsIFtBfFNdKSA6LSB1bmlvbnZfMihTMSwgQiwgUzIsIFMpLgordW5pb252XzMoPSwgQSwgUzEsIF8sIFMyLCBbQXxTXSkgOi0gdW5pb252KFMxLCBTMiwgUykuCit1bmlvbnZfMyg+LCBBLCBTMSwgQiwgUzIsIFtCfFNdKSA6LSB1bmlvbnZfMihTMiwgQSwgUzEsIFMpLgorIAorJSAqKiogU3Vic2V0CitzdWJzZXR2KFtdLCBfKS4KK3N1YnNldHYoW0F8UzFdLCBbQnxTMl0pIDotCisgICAgICAgIGNvbXBhcmUoT3JkZXIsIEEsIEIpLAorICAgICAgICBzdWJzZXR2XzIoT3JkZXIsIEEsIFMxLCBTMikuCisgCitzdWJzZXR2XzIoPSwgXywgUzEsIFMyKSA6LSBzdWJzZXR2KFMxLCBTMikuCitzdWJzZXR2XzIoPiwgQSwgUzEsIFMyKSA6LSBzdWJzZXR2KFtBfFMxXSwgUzIpLgorIAorJSBGb3IgdW5vcmRlcmVkIGxpc3RzIFMxOgorc21hbGxfc3Vic2V0dihbXSwgXykuCitzbWFsbF9zdWJzZXR2KFtBfFMxXSwgUzIpIDotIGludihBLCBTMiksIHNtYWxsX3N1YnNldHYoUzEsIFMyKS4KKyAKKyUgKioqIE1lbWJlcnNoaXAKK2ludihBLCBbQnxTXSkgOi0KKyAgICAgICAgY29tcGFyZShPcmRlciwgQSwgQiksCisgICAgICAgIGludl8yKE9yZGVyLCBBLCBTKS4KKyAKK2ludl8yKD0sIF8sIF8pLgoraW52XzIoPiwgQSwgUykgOi0gaW52KEEsIFMpLgorCislICoqKiBOb24tbWVtYmVyc2hpcAorbm90aW52KEEsIFMpIDotIG5vdGludl8yKFMsIEEpLgorCitub3RpbnZfMihbXSwgXykuCitub3RpbnZfMihbQnxTXSwgQSkgOi0KKyAgICAgICAgY29tcGFyZShPcmRlciwgQSwgQiksCisgICAgICAgIG5vdGludl8zKE9yZGVyLCBBLCBTKS4KKyAKK25vdGludl8zKDwsIF8sIF8pLgorbm90aW52XzMoPiwgQSwgUykgOi0gbm90aW52XzIoUywgQSkuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3NkZGEuaW4gYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9zZGRhLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYTZiN2YKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9zZGRhLmluCkBAIC0wLDAgKzEgQEAKKzotICckYmVuY2htYXJrJyhzZGRhLCAxMDAwLCBtYWluLCAnJGR1bW15JykuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9zZGRhLnBsIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvc2RkYS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjFjMWMzCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvc2RkYS5wbApAQCAtMCwwICsxLDMzMCBAQAorLyogQ0hBTkdFTE9HIGJ5IE0uQmFuYmFyYQorICAtIGFkZCAnOi0gZHluYW1pYyB1bmlmeS8zLicgc2luY2UgdW5pZnkvMyBpcyBub3QgZGVmaW5lZC4KKyAgLSByZW5hbWUgbmFtZS8yIHRvIGF0b21fY29kZXMvMgorKi8KKworOi0gZHluYW1pYyB1bmlmeS8zLgorCislIFNkZGEzCQk1LU9jdC04NiAKKyUgRm9yIHVzZSBvbiBzaW11bGF0b3IKKworJSUgVG8gZG86ICAobG9vayBmb3IgJyUlJykKKyUlCXJlY3Vyc2lvbiAtIGtlZXAgbGlzdCBvZiBjYWxsIHByb2NlZHVyZXMsIGlnbm9yZSByZWN1cnNpdmUgY2FsbHMKKyUlCSAgIAlwcm9ibGVtOiBkb2Vzbid0IHdvcmsgZm9yIHR5cGljYWwgcHJvY2VkdXJlIHdvcmtpbmcgb24gYSBsaXN0LAorJSUJCQkgc2luY2UgdGhlIGxpc3QgaXMgc21hbGxlciAoZGlmZmVyZW50KSBlYWNoIHRpbWUuCislJQkJcG9zc2libGUgb3B0aW1pemF0aW9uOiAicmVjb2duaXplIiBiYXNlIGNhc2UgJiBza2lwIHRvIGl0CislJQlmb2xsb3cgYXRvbXMsIGcgaXMgJ2FueSBhdG9tJywgYWxsIG90aGVycyB1bmlxdWUsICBkb2VzIGl0IHdvcms/CislJQlzdGF0cyAtIHdyaXRlIGhlYXB1c2VkLCBjcHV0aW1lIHRvIGZpbGVzIChhcyBjb21tZW50cykKKyUlCXdvcnN0X2Nhc2UgLSBoYW5kbGUgZ3JvdW5kIHRlcm1zIChjb3B5IHVuaWZ5LCBtb2RpZnkgYXRvbWljKQorJSUJaGFuZGxlIGRpc2p1bmN0aW9uIC0gbmVlZHMgd29yc3RfY2FzZQorJSUJYWRkIGN1dHMgd2hlcmUgcG9zc2libGUgdG8gc2F2ZSBzcGFjZQorJSUJZmlsbCBpbiByZXN0IG9mIGJ1aWx0LWlucworJSUgCWhvdyB0byBoYW5kbGUgb3A/CislJQlIYW5kbGUgYXNzZXJ0L3JldHJhY3Q/ICBjYWxsPyAgKElmIGdpdmVuIGdyb3VuZCB0ZXJtcy0gb2ssIHZhcnMtIG5vKQorJSUJCW11c3QgaGF2ZSBncm91bmQgZnVuY3RvciwgZGVmaW5pdGUgbnVtYmVyIG9mIGFyZ3MhCisKKyUgRnJvbnQgZW5kIGZvciBzaW11bGF0b3IgdXNlCittYWluIDotCisJZG9fc2RkYSh0ZXN0LEEsQixDKS4KKworJSBEb2VzIHRoZSBzZGRhIG9uIEZpbGVOYW1lLCBpbnN0YW50aWF0ZXMgRXhpdG1vZGVzIHRvIGxpc3Qgb2YgZXhpdCBtb2RlcywKKyUgRXhpdE1vZGVzIHN0cnVjdHVyZTogW1tGdW50b3IvQXJpdHksIEFjdGl2YXRpb24sIEV4aXRdLCAuLi4gXSwKKyUgZS5nLiBbW2EvMiwgW2csWF0sIFtnLGddXQorZG9fc2RkYShGaWxlTmFtZSwgRXhpdE1vZGVzLCBCYWNrTGlzdCwgUHJlZExpc3QpIDotCisJJSVzZWUoRmlsZU5hbWUpLAorCXJlYWRfcHJvY2VkdXJlcyhQcm9jcywgRXhpdE1vZGVzLCBFbnRyaWVzKSwJJSBjb2xsZWN0IGFsbCBwcm9jZWR1cmVzCisJJSVzZWVuLAorCXdyaXRlKCdQcm9jZWR1cmVzICcpLCBubCwgd3JpdGVfbGlzdChQcm9jcyksIG5sLAorCXdyaXRlKCdFbnRyeSBwb2ludHMgJyksIG5sLCB3cml0ZV9saXN0KEVudHJpZXMpLCBubCwKKwkobm9udmFyKEV4aXRNb2RlcykgLT4JCQkJJSBEb24ndCBtZW50aW9uIHRoZXJlCisJCSh3cml0ZSgnRGVjbGFyZWQgZXhpdCBtb2RlcyAnKSwgbmwsIAklIGFyZW4ndCBhbnkKKwkJIHdyaXRlX2xpc3QoRXhpdE1vZGVzKSwgbmwpIDsKKwkJdHJ1ZSksCisJZW50cnlfZXhpdF9tb2Rlc19saXN0KFByb2NzLCBFeGl0TW9kZXMsIEVudHJpZXMpLAorCXdyaXRlKCdFeGl0IG1vZGVzICcpLCBubCwgd3JpdGVfbGlzdChFeGl0TW9kZXMpLCBubC4KKworJSUlICAhISEgSGFyZCBjb2RlIGluIHJlYWQgZm9yIHRlc3Q6CislCXNkZGFfZW50cnkoYyhBLEIsQykpLgorJQlhKFgsIFkpLgorJQlhKFgsIFgpLgorJQljKEEsQixDKSA6LSBhKEEsQikuCisKK3JlYWRfcHJvY2VkdXJlcyhbW2EvMixhKF8xMDksXzExMCksYShfMTQ4LF8xNDgpfF8xODRdLAorCQkgW2MvMywoYyhfMTkxLF8xOTIsXzE5Myk6LWEoXzE5MSxfMTkyKSl8XzIzOF18XzIzOV0sCisJCSBfNjgsW2MoXzc2LF83NyxfNzgpfF8xMDJdKSA6LSAhLgorCislIEZvciBlYWNoIGVudHJ5IHBvaW50IGluIEVudHJpZXMgZG8gc2RkYSwgYnVpbGRpbmcgS25vd24sIGFuIHVuYm91bmQtdGFpbCBsaXN0CislIEtub3duIHN0cnVjdHVyZTogW1tOYW1lL0FyaXR5LCBBY3RpdmF0aW9uTW9kZXMsIEV4aXRNb2Rlc10sIC4uLnxfXSwKKyUgd2hlcmUgQWN0aXZhdGlvbk1vZGVzIGFuZCBFeGl0TW9kZXMgYXJlIGxpc3RzIG9mIHZhcmlhYmxlcyBhbmQgdGhlIGF0b20gJ2cnLgorJSAnZycgcmVwcmVzZW50cyBhIGdyb3VuZCBlbGVtZW50IGFuZCB2YXJpYWJsZXMgcmVwcmVzZW50IGVxdWl2YWxlbmNlIGNsYXNzZXMuCitlbnRyeV9leGl0X21vZGVzX2xpc3QoXywgXywgRW50cmllcykgOi0JCQklIERvbmUKKwl2YXIoRW50cmllcykuCitlbnRyeV9leGl0X21vZGVzX2xpc3QoUHJvY0xpc3QsIEtub3duLCBbRW50cnl8RW50cmllc10pIDotCisJRW50cnkgPS4uIFtGdW5jdG9yfEFjdF0sCQklIEdldCBmdW5jdG9yL2FyaXR5ICYgYWN0aXZhdGlvbgorCWxlbmd0aChBY3QsIEFyaXR5KSwJCQklIGZyb20gZW50cnkgZGVjbGFyYXRpb24KKwlwcm9jX2V4aXRfbW9kZShQcm9jTGlzdCwgS25vd24sIFtdLCBGdW5jdG9yL0FyaXR5LCBBY3QsIF8pLCAgJSBObyBpbnZvYy4KKwllbnRyeV9leGl0X21vZGVzX2xpc3QoUHJvY0xpc3QsIEtub3duLCBFbnRyaWVzKS4KKworJSBEbyBzZGRhIG9uIHByb2NlZHVyZSBGdW5jdG9yL0FyaXR5LCBnaXZlbiBhY3RpdmF0aW9uIG1vZGUgQWN0LiAgSW5zdGFudGlhdGVzCislIEtub3duIHRvIGtub3duIGV4aXQgbW9kZXMgYW5kIEFjdCB0byBleGl0IG1vZGVzIGZvciBGdW5jdG9yL0FyaXR5IHVuZGVyIEFjdAorcHJvY19leGl0X21vZGUoXywgXywgXywgRnVuY3Rvci9Bcml0eSwgQWN0LCBFeGl0KSA6LQorCWJ1aWx0X2luKEZ1bmN0b3IvQXJpdHksIEFjdCwgRXhpdCkuCQkgICAgJSBUaGlzIGlzIGEgYnVpbHQtaW4KK3Byb2NfZXhpdF9tb2RlKF8sIEtub3duLCBfLCBGdW5jdG9yL0FyaXR5LCBBY3QsIEV4aXQpIDotCisJbG9va191cF9hY3QoW0Z1bmN0b3IvQXJpdHksIEFjdCwgRXhpdF0sIEtub3duKS4gICAgICAgJSBBbHJlYWR5IGRpZCB0aGlzCitwcm9jX2V4aXRfbW9kZShQcm9jTGlzdCwgS25vd24sIEludm9jYXRpb25zLCBGdW5jdG9yL0FyaXR5LCBBY3QsIEV4aXQpIDotCisJdW1lbWJlcihbRnVuY3Rvci9Bcml0eXxDbGF1c2VzXSwgUHJvY0xpc3QpLAklIExvb2sgdXAgZGVmaW5pdGlvbgorCWR1cChDbGF1c2VzLCBDbGF1c2VzQ29weSksCQkJJSBEb24ndCBtdW5nZSBvcmlnaW5hbCAKKwljbGF1c2VfZXhpdF9tb2Rlc19saXN0KFByb2NMaXN0LCBLbm93biwgSW52b2NhdGlvbnMsIAorCQkJICAgICAgIENsYXVzZXNDb3B5LCBBY3QsIEV4aXRzKSwKKwkoRXhpdHM9W10gLT4gZmFpbCA7IHRydWUpLAkJICAgICAgICUgZGlkbid0IGZpbmQgYW55ID0+IGZhaWwKKwl3b3JzdF9jYXNlKEV4aXRzLCBFeGl0KSwJCQklIGFzc3VtZSB0aGUgd29yc3QKKwlkdXAoQWN0LCBBY3RDb3B5KSwJCQkJJSBOZWVkIGNvcHkgYmVjYXVzZSBCb2R5CisJYWRkX3RvX2xpc3QoW0Z1bmN0b3IvQXJpdHksIEFjdENvcHksIEV4aXRdLCBLbm93bikuICAgJSBiaW5kcyBBY3QgJiBFeGl0Citwcm9jX2V4aXRfbW9kZShfLCBLbm93biwgXywgRnVuY3Rvci9Bcml0eSwgQWN0LCBFeGl0KSA6LQorCXdyaXRlKCdObyBzdWNoIHByb2NlZHVyZSBhdCBjb21waWxlIHRpbWUgJyksCisJQWN0aXZhdGlvbj0uLltGdW5jdG9yfEFjdF0sCisJd3JpdGUoQWN0aXZhdGlvbiksIG5sLAorCWFsbF9zaGFyZWQoQWN0LCBFeGl0KSwgICAgIAkgICAlIHJldHVybiB3b3JzdCBwb3NzaWJsZSAtIGFsbCBzaGFyZWQgCisJYWRkX3RvX2xpc3QoW0Z1bmN0b3IvQXJpdHksIEFjdCwgRXhpdF0sIEtub3duKS4KKworJSBBbmFseXplIGFsbCBjbGF1c2VzIGZvciB0aGlzIHByb2NlZHVyZSwgaW5zdGFudGlhdGUgRXhpdHMgdG8gYWxsIGV4aXQgbW9kZXMKK2NsYXVzZV9leGl0X21vZGVzX2xpc3QoXywgXywgXywgQ2xhdXNlcywgXywgW10pIDotCisJdmFyKENsYXVzZXMpLCAhLgkJCSAgICAgICAlIE5vIG1vcmUgY2xhdXNlcyA9PiBkb25lCitjbGF1c2VfZXhpdF9tb2Rlc19saXN0KFByb2NMaXN0LCBLbm93biwgSW52b2NhdGlvbnMsIAorCQkgICAgICAgW0NsYXVzZXxDbGF1c2VzXSwgQWN0LCBFeGl0cykgOi0KKwllcW1lbWJlcihbQ2xhdXNlLCBBY3RdLCBJbnZvY2F0aW9ucyksIAkJJSBUaGlzIGlzIGEgcmVjdXJzaXZlIAorICAgIHdyaXRlKCdza2lwcGluZyBjbGF1c2UgZXhpdCBtb2RlIGZvciAnKSwgCisgICAgd3JpdGUoQ2xhdXNlKSwgd3JpdGUoJyAnKSwgd3JpdGUoQWN0KSwgbmwsCisJY2xhdXNlX2V4aXRfbW9kZXNfbGlzdChQcm9jTGlzdCwgS25vd24sIEludm9jYXRpb25zLAklIGNhbGwsIGlnbm9yZQorCQkJICAgICAgIENsYXVzZXMsIEFjdCwgRXhpdHMpLgkJJSBpdAorY2xhdXNlX2V4aXRfbW9kZXNfbGlzdChQcm9jTGlzdCwgS25vd24sIEludm9jYXRpb25zLCAKKwkJICAgICAgIFtDbGF1c2V8Q2xhdXNlc10sIEFjdCwgW0V4aXR8RXhpdHNdKSA6LQorCWR1cChBY3QsIEV4aXQpLAkJCQkJJSBXZSdsbCBiaW5kIEV4aXQKKwljbGF1c2VfZXhpdF9tb2RlKFByb2NMaXN0LCBLbm93biwgW1tDbGF1c2UsIEFjdF18SW52b2NhdGlvbnNdLCAKKwkJIAkgQ2xhdXNlLCBFeGl0KSwJCQklIFJlY29yZCBpbnZvY2F0aW9uCisJY2xhdXNlX2V4aXRfbW9kZXNfbGlzdChQcm9jTGlzdCwgS25vd24sIEludm9jYXRpb25zLCAKKwkJICAgICAJICAgICAgIENsYXVzZXMsIEFjdCwgRXhpdHMpLgorY2xhdXNlX2V4aXRfbW9kZXNfbGlzdChQcm9jTGlzdCwgS25vd24sIEludm9jYXRpb25zLCAKKwkJICAgICAgIFtDbGF1c2V8Q2xhdXNlc10sIEFjdCwgRXhpdHMpIDotIAklIFVuaWZ5IGZhaWxlZAorCWNsYXVzZV9leGl0X21vZGVzX2xpc3QoUHJvY0xpc3QsIEtub3duLCBJbnZvY2F0aW9ucywgCisJCQkgICAgICAgQ2xhdXNlcywgQWN0LCBFeGl0cykuICAgCisKKyUgR2l2ZW4gYWN0aXZhdGlvbiBtb2RlcyBmb3IgdGhpcyBjbGF1c2UsIHJldHVybiBpdHMgZXhpdCBtb2RlcworY2xhdXNlX2V4aXRfbW9kZShQcm9jTGlzdCwgS25vd24sIEludm9jYXRpb25zLCBDbGF1c2UsIEFjdCkgOi0KKwkoQ2xhdXNlID0gJzotJyhIZWFkLCBCb2R5KSA7IENsYXVzZT1IZWFkLCBCb2R5PXRydWUpLAklIERlY29tcG9zZSBpdAorCUhlYWQgPS4uIFtffEFyZ3NdLAkJCQkJJSBCaW5kIHRoZSBoZWFkCisJdW5pZnkoQXJncywgQWN0KSwJCQkJCSUgdG8gYWN0aXZhdGlvbgorCWJvZHlfZXhpdF9tb2RlKFByb2NMaXN0LCBLbm93biwgSW52b2NhdGlvbnMsIEJvZHkpLiAJJSBkbyB0aGUgYm9keQorCitib2R5X2V4aXRfbW9kZShQcm9jTGlzdCwgS25vd24sIEludm9jYXRpb25zLCAnLCcoR29hbCwgR29hbHMpKSA6LSAgJSBDb25qdW5jdGlvbgorCWJvZHlfZXhpdF9tb2RlKFByb2NMaXN0LCBLbm93biwgSW52b2NhdGlvbnMsIEdvYWwpLAklIERvIDFzdAorCWJvZHlfZXhpdF9tb2RlKFByb2NMaXN0LCBLbm93biwgSW52b2NhdGlvbnMsIEdvYWxzKS4JJSAmIHJlc3QKK2JvZHlfZXhpdF9tb2RlKFByb2NMaXN0LCBLbm93biwgSW52b2NhdGlvbiwgR29hbCkgOi0KKwlmdW5jdG9yKEdvYWwsIEZ1bmN0b3IsIEFyaXR5KSwKKwlHb2FsID0uLiBbRnVuY3RvcnxBY3RdLAorCXByb2NfZXhpdF9tb2RlKFByb2NMaXN0LCBLbm93biwgSW52b2NhdGlvbiwgRnVuY3Rvci9Bcml0eSwgQWN0LCBFeGl0KSwKKwl1bmlmeShBY3QsIEV4aXQpLgkKKworJSBVbmlmaWVzIExlZnQgYW5kIFJpZ2h0IHdpdGggdGhlIHNwZWNpYWwgY2FzZSB0aGF0IHRoZSBhdG9tICdnJyBtYXRjaGVzCislIGFueSBhdG9tIChleGNlcHQgW10pCit1bmlmeShMZWZ0LCBMZWZ0KSA6LSAhLgkJCQklIFRyeSBzdGFuZGFyZCB1bmlmeSBmaXJzdAordW5pZnkoTGVmdCwgZykgOi0JCQkJJSBlbHNlLCBpcyBpdCBzcGVjaWFsIGNhc2UKKwlhdG9taWMoTGVmdCksICEsCQkJCisJXCsgTGVmdD1bXS4KK3VuaWZ5KGcsIFJpZ2h0KSA6LQkJCQkKKwlhdG9taWMoUmlnaHQpLCAhLAorCVwrIFJpZ2h0PVtdLgordW5pZnkoW0xlZnRIZWFkfExlZnRUYWlsXSwgW1JpZ2h0SGVhZHxSaWdodFRhaWxdKSA6LQklIG9yIGxpc3QKKwkhLCB1bmlmeShMZWZ0SGVhZCwgUmlnaHRIZWFkKSwKKwl1bmlmeShMZWZ0VGFpbCwgUmlnaHRUYWlsKS4KK3VuaWZ5KExlZnQsIFJpZ2h0KSA6LQkJCQkJJSBvciBzdHJ1Y3R1cmUKKwlMZWZ0ID0uLiBbRnVuY3RvcnxMZWZ0QXJnc10sCisJUmlnaHQgPS4uIFtGdW5jdG9yfFJpZ2h0QXJnc10sCisJdW5pZnkoTGVmdEFyZ3MsIFJpZ2h0QXJncykuCisJCislIFN1Y2NlZWQgaWYgTGVmdCBhbmQgUmlnaHQgYXJlIGVxdWl2YWxlbnQsIGkuZS4gdGhleSBhcmUgdGhlIGV4YWN0IHNhbWUgCislIHdpdGggdmFyaWFibGVzIHJlbmFtZWQKK2VxdWl2KExlZnQsIFJpZ2h0KSA6LSAKKwllcXVpdihMZWZ0LCBSaWdodCwgXykuCitlcXVpdihMZWZ0LCBSaWdodCwgXykgOi0JCQorCUxlZnQ9PVJpZ2h0LCAhLgkJCQorZXF1aXYoZywgUmlnaHQsIF8pIDotCQkKKwlhdG9taWMoUmlnaHQpLCAhLAorCVwrIFJpZ2h0PVtdLgkJCQorZXF1aXYoTGVmdCwgZywgXykgOi0KKwlhdG9taWMoTGVmdCksICEsCisJXCsgTGVmdD1bXS4JCQkKK2VxdWl2KExlZnQsIFJpZ2h0LCBCaW5kaW5ncykgOi0KKwl2YXIoTGVmdCksICEsCisJdmFyKFJpZ2h0KSwgCisJZXF1aXZfdmFycyhMZWZ0LCBSaWdodCwgQmluZGluZ3MpLgorZXF1aXYoTGVmdCwgUmlnaHQsIEJpbmRpbmdzKSA6LQorCXZhcihSaWdodCksICEsCisJdmFyKExlZnQpLCAKKwllcXVpdl92YXJzKExlZnQsIFJpZ2h0LCBCaW5kaW5ncykuCitlcXVpdihbTGVmdEhlYWR8TGVmdFRhaWxdLCBbUmlnaHRIZWFkfFJpZ2h0VGFpbF0sIEJpbmRpbmdzKSA6LQorCSEsIGVxdWl2KExlZnRIZWFkLCBSaWdodEhlYWQsIEJpbmRpbmdzKSwKKwllcXVpdihMZWZ0VGFpbCwgUmlnaHRUYWlsLCBCaW5kaW5ncykuCitlcXVpdihMZWZ0LCBSaWdodCwgQmluZGluZ3MpIDotCisJTGVmdD0uLltGdW5jdG9yfExlZnRBcmdzXSwKKwlSaWdodD0uLltGdW5jdG9yfFJpZ2h0QXJnc10sCisJZXF1aXYoTGVmdEFyZ3MsIFJpZ2h0QXJncywgQmluZGluZ3MpLgorCitlcXVpdl92YXJzKExlZnQsIFJpZ2h0LCBCaW5kaW5ncykgOi0KKwl2YXIoQmluZGluZ3MpLCAhLAorCUJpbmRpbmdzPVtbTGVmdCwgUmlnaHRdfF9dLgorZXF1aXZfdmFycyhMZWZ0LCBSaWdodCwgW1tBbnlWYXIsIEFueUJpbmRpbmddfF9dKSA6LQorCUxlZnQ9PUFueVZhciwgISwKKwlSaWdodD09QW55QmluZGluZy4KK2VxdWl2X3ZhcnMoTGVmdCwgUmlnaHQsIFtbQW55VmFyLCBBbnlCaW5kaW5nXXxfXSkgOi0KKwlSaWdodD09QW55QmluZGluZywgISwKKwlMZWZ0PT1BbnlWYXIuCitlcXVpdl92YXJzKExlZnQsIFJpZ2h0LCBbIF98QmluZGluZ3NdKSA6LQorCWVxdWl2X3ZhcnMoTGVmdCwgUmlnaHQsIEJpbmRpbmdzKS4KKworJSBNYWtlIGEgY29weSBvZiBPcmlnIHdpdGggbmV3IHZhcnMuICBDb3B5IG11c3QgYmUgYSB2YXJpYWJsZS4KKyUgRS5nLiBkdXAoW0EscyhBLEIpLFtCLENdXSwgTmV3KSBiaW5kcyBOZXcgdG8gW1gscyhYLFkpLFtZLFpdXQorZHVwKE9yaWcsIENvcHkpIDotCisJZHVwKE9yaWcsIENvcHksIF8pLgorZHVwKE9yaWcsIENvcHksIEJpbmRpbmdzKSA6LQorCXZhcihPcmlnKSwgISwKKwlkdXBfdmFyKE9yaWcsIENvcHksIEJpbmRpbmdzKS4KK2R1cChPcmlnLCBPcmlnLCBfKSA6LQkJCQklIEF0b21zLCBpbmNsdWRpbmcgW10KKwlhdG9taWMoT3JpZyksICEuCitkdXAoW09yaWdIZWFkfE9yaWdUYWlsXSwgW0NvcHlIZWFkfENvcHlUYWlsXSwgQmluZGluZ3MpIDotCisJISwgZHVwKE9yaWdIZWFkLCBDb3B5SGVhZCwgQmluZGluZ3MpLAorCWR1cChPcmlnVGFpbCwgQ29weVRhaWwsIEJpbmRpbmdzKS4KK2R1cChPcmlnLCBDb3B5LCBCaW5kaW5ncykgOi0KKwlPcmlnPS4uW0Z1bmN0b3J8T3JpZ0FyZ3NdLAorCWR1cChPcmlnQXJncywgQ29weUFyZ3MsIEJpbmRpbmdzKSwKKwlDb3B5PS4uW0Z1bmN0b3J8Q29weUFyZ3NdLgorCitkdXBfdmFyKE9yaWcsIENvcHksIEJpbmRpbmdzKSA6LQorCXZhcihCaW5kaW5ncyksICEsCisJQmluZGluZ3M9W1tPcmlnLCBDb3B5XXxfXS4KK2R1cF92YXIoT3JpZywgQ29weSwgW1tBbnlWYXIsIENvcHldfF9dKSA6LQorCU9yaWc9PUFueVZhciwgIS4KK2R1cF92YXIoT3JpZywgQ29weSwgW198QmluZGluZ3NdKSA6LQorCWR1cF92YXIoT3JpZywgQ29weSwgQmluZGluZ3MpLgorCislIC0tLS0tIEJ1aWx0LWlucyAtLS0tLSAlCisKK2J1aWx0X2luKHRydWUvMCwgW10sIFtdKS4JCQklIE5vIGNoYW5nZSAKK2J1aWx0X2luKGZhaWwvMCwgW10sIFtdKS4JCQklIE5vIGNoYW5nZSAKK2J1aWx0X2luKCc9Jy8yLCBbWCwgWV0sIFtnLCBnXSkgOi0gCisJKGF0b21pYyhYKSA7IGF0b21pYyhZKSkuIAkJJSBHcm91bmQgYm90aCBpZiBlaXRoZXIgYXRvbWljCitidWlsdF9pbignPScvMiwgW1gsIFldLCBbWCwgWF0pLgkJJSBlbHNlIGJpbmQgdGhlbSAKK2J1aWx0X2luKC8oJysnLDIpLCBbWCwgWV0sIFtYLCBZXSkuCQklIE5vIGNoYW5nZSAKK2J1aWx0X2luKC8oJy0nLDIpLCBbWCwgWV0sIFtYLCBZXSkuCQklIE5vIGNoYW5nZSAKK2J1aWx0X2luKC8oJyonLDIpLCBbWCwgWV0sIFtYLCBZXSkuCQklIE5vIGNoYW5nZSAKK2J1aWx0X2luKC8oJy8nLDIpLCBbWCwgWV0sIFtYLCBZXSkuCQklIE5vIGNoYW5nZSAKK2J1aWx0X2luKC8oJz49JywyKSwgW1gsIFldLCBbWCwgWV0pLgkJJSBObyBjaGFuZ2UgCitidWlsdF9pbigvKCc8JywyKSwgW1gsIFldLCBbWCwgWV0pLgkJJSBObyBjaGFuZ2UgCitidWlsdF9pbihpcy8yLCBbWCwgWV0sIFtnLCBZXSkuCQkJJSBHcm91bmQgcmVzdWx0IAorCislIC0tLS0tIFV0aWxpdGllcyAtLS0tLSAlCisKK3dvcnN0X2Nhc2UoW10sIF8pLgkJCQklJSBEb2Vzbid0IHdvcmsgaWYgYW55IEV4aXRzCit3b3JzdF9jYXNlKFtFeGl0fEV4aXRzXSwgV29yc3QpIDotCQklJSBmYWlsIHRvIG1hdGNoLCBlLmcuCisJdW5pZnkoRXhpdCwgV29yc3QpLAkJCSUlIFtbcygxKV0sIFtmKDEpXV0uCisJd29yc3RfY2FzZShFeGl0cywgV29yc3QpLgorCitsb29rX3VwX2FjdChfLCBLbm93bikgOi0KKwl2YXIoS25vd24pLCAKKwkhLCBmYWlsLiAgICAKK2xvb2tfdXBfYWN0KFtGdW5jdG9yL0FyaXR5LCBBY3QsIEV4aXRdLCBbW0Z1bmN0b3IvQXJpdHksIEtub3duQWN0LCBFeGl0XXxfXSkgOi0KKwllcXVpdihBY3QsIEtub3duQWN0KS4gICAgCitsb29rX3VwX2FjdChbRnVuY3Rvci9Bcml0eSwgQWN0LCBFeGl0XSwgW198S25vd25dKSA6LQorCWxvb2tfdXBfYWN0KFtGdW5jdG9yL0FyaXR5LCBBY3QsIEV4aXRdLCBLbm93bikuCisKK2FsbF9zaGFyZWQoQWN0LCBFeGl0KSA6LQkJCSUlIFdyb25nCisJdW5pZnkoQWN0LCBfLCBWYXJNb2Rlc0xpc3QpLAorCWJpbmRfYWxsKF8sIFZhck1vZGVzTGlzdCksCisJdW5pZnkoQWN0LCBFeGl0LCBWYXJNb2Rlc0xpc3QpLgorCitiaW5kX2FsbChfLCBWYXJNb2Rlc0xpc3QpIDotCisJdmFyKFZhck1vZGVzTGlzdCkuCitiaW5kX2FsbChNb2RlLCBbW1ZhciwgTW9kZV18VmFyTW9kZXNMaXN0XSkgOi0KKwl2YXIoTW9kZSksCisJYmluZF9hbGwoTW9kZSwgVmFyTW9kZXNMaXN0KS4KK2JpbmRfYWxsKE1vZGUsIFtbXywgX118VmFyTW9kZXNMaXN0XSkgOi0KKwliaW5kX2FsbChNb2RlLCBWYXJNb2Rlc0xpc3QpLgorCisKKyUgQWRkcyBFbGVtZW50IHRvIHRoZSB0YWlsIG9mIExpc3QsIGFuIHVuYm91bmQtdGFpbCBsaXN0CithZGRfdG9fbGlzdChFbGVtZW50LCBMaXN0KSA6LQorCXZhcihMaXN0KSwKKwlMaXN0PVtFbGVtZW50fF9dLgorYWRkX3RvX2xpc3QoRWxlbWVudCwgW198TGlzdF0pIDotCisJYWRkX3RvX2xpc3QoRWxlbWVudCwgTGlzdCkuCisKKyUgTWVtYmVyc2hpcCByZWxhdGlvbiBmb3IgdW5ib3VuZC10YWlsIGxpc3RzCit1bWVtYmVyKF8sIExpc3QpIDotIAorCXZhcihMaXN0KSwgISwgZmFpbC4KK3VtZW1iZXIoRWxlbWVudCwgW0VsZW1lbnR8X10pLgordW1lbWJlcihFbGVtZW50LCBbX3xUYWlsXSkgOi0gdW1lbWJlcihFbGVtZW50LCBUYWlsKS4KKworJSBTdHJpY3QgbWVtYmVyc2hpcCByZWxhdGlvbiBmb3IgdW5ib3VuZC10YWlsIGxpc3RzCitzdW1lbWJlcihfLCBMaXN0KSA6LSAKKwl2YXIoTGlzdCksICEsIGZhaWwuCitzdW1lbWJlcihFbGVtZW50LCBbQW55RWxlbWVudHxfXSkgOi0gRWxlbWVudD09QW55RWxlbWVudC4KK3N1bWVtYmVyKEVsZW1lbnQsIFtffFRhaWxdKSA6LSBzdW1lbWJlcihFbGVtZW50LCBUYWlsKS4KKworJSBNZW1iZXJzaGlwIHJlbGF0aW9uIGZvciBzdGFuZGFyZCBuaWwtdGFpbCBsaXN0cworbWVtYmVyKFgsIFtYfF9dKS4KK21lbWJlcihYLCBbX3xUXSkgOi0gbWVtYmVyKFgsIFQpLgorCislIFN0cmljdCBtZW1iZXJzaGlwIHJlbGF0aW9uIGZvciBzdGFuZGFyZCBuaWwtdGFpbCBsaXN0cworc21lbWJlcihYLCBbWXxfXSkgOi0gWD09WS4KK3NtZW1iZXIoWCwgW198VF0pIDotIHNtZW1iZXIoWCwgVCkuCisKKyUgRXF1aXYgbWVtYmVyc2hpcCByZWxhdGlvbiBmb3Igc3RhbmRhcmQgbmlsLXRhaWwgbGlzdHMKK2VxbWVtYmVyKFgsIFtZfF9dKSA6LSBlcXVpdihYLCBZKS4KK2VxbWVtYmVyKFgsIFtffFRdKSA6LSBlcW1lbWJlcihYLCBUKS4KKworJSBPdXIgb2xkIGZhdm9yaXRlCitjb25jYXQoW10sIEwsIEwpLgorY29uY2F0KFtYfEwxXSwgTDIsIFtYfEwzXSkgOi0gY29uY2F0KEwxLCBMMiwgTDMpLgorCislIFByZXR0eSBwcmludHMgdW5ib3VuZC10YWlsIGxpc3RzIC0tIGRpZXMgb24gTklMIHRhaWwgbGlzdHMKK3dyaXRlX2xpc3QoTGlzdCkgOi0KKwlkdXAoTGlzdCwgTmV3TGlzdCksCisJKHZhcihOZXdMaXN0KSAtPiAobmFtZV92YXJzKE5ld0xpc3QsIDAsIF8pLAorCQkJICB3cml0ZShOZXdMaXN0KSkgOyAKKwkJICAgICAgICAgKHdyaXRlKCdbJyksIAorCQkgICAgICAJICB3cml0ZV9saXN0MihOZXdMaXN0LCAwLCBfKSwgCisJCSAgICAgICAgICB3cml0ZSgnfF9dLicpKSksIAklIHdyaXRlKCddLicpIHRvIHdyaXRlIG5pbCB0YWlscworCW5sLgkJCQkKK3dyaXRlX2xpc3QyKFtIfFRdLCBOZXh0TmFtZSwgTmV3TmV4dE5hbWUpIDotIAorCW5hbWVfdmFycyhILCBOZXh0TmFtZSwgVGVtcE5leHROYW1lKSwKKwl3cml0ZShIKSwKKwkobm9udmFyKFQpIC0+ICh3cml0ZSgnLCcpLCBubCwgCisJCSAgICAgICB3cml0ZSgnICcpLCAKKwkJICAgICAgIHdyaXRlX2xpc3QyKFQsIFRlbXBOZXh0TmFtZSwgTmV3TmV4dE5hbWUpKSA7IAorCQkgICAgICBOZXdOZXh0TmFtZSA9IFRlbXBOZXh0TmFtZSkuCisKK25hbWVfdmFycyhUZXJtLCBOZXh0TmFtZSwgTmV3TmV4dE5hbWUpIDotCisJdmFyKFRlcm0pLCAhLAorCW1ha2VfbmFtZShOZXh0TmFtZSwgVGVybSksCisJTmV3TmV4dE5hbWUgaXMgTmV4dE5hbWUgKyAxLgorbmFtZV92YXJzKFRlcm0sIE5leHROYW1lLCBOZXh0TmFtZSkgOi0KKwlhdG9tKFRlcm0pLCAhLgorbmFtZV92YXJzKFtUZXJtSGVhZHxUZXJtVGFpbF0sIE5leHROYW1lLCBOZXdOZXh0TmFtZSkgOi0KKwkhLCBuYW1lX3ZhcnMoVGVybUhlYWQsIE5leHROYW1lLCBUZW1wTmV4dE5hbWUpLAorCW5hbWVfdmFycyhUZXJtVGFpbCwgVGVtcE5leHROYW1lLCBOZXdOZXh0TmFtZSkuCituYW1lX3ZhcnMoVGVybSwgTmV4dE5hbWUsIE5ld05leHROYW1lKSA6LQorCVRlcm0gPS4uIFtffFRlcm1BcmdzXSwKKwluYW1lX3ZhcnMoVGVybUFyZ3MsIE5leHROYW1lLCBOZXdOZXh0TmFtZSkuCisKK21ha2VfbmFtZShJbnROYW1lLCBWYXJpYWJsZSkgOi0KKwlDb3VudCBpcyBJbnROYW1lIC8vIDI2LAorCU5ld0ludE5hbWUgaXMgSW50TmFtZSBtb2QgMjYgKyAiQSIsCisJYnVpbGRfbmFtZShDb3VudCwgTmV3SW50TmFtZSwgTmFtZSksCisJYXRvbV9jb2RlcyhWYXJpYWJsZSwgTmFtZSkuCisJJW5hbWUoVmFyaWFibGUsIE5hbWUpLgorCitidWlsZF9uYW1lKDAsIEludE5hbWUsIFtJbnROYW1lXSkgOi0gIS4KK2J1aWxkX25hbWUoQ291bnQsIEludE5hbWUsIFtJbnROYW1lfFJlc3RdKSA6LSBDb3VudD4wLAorCU5ld0NvdW50IGlzIENvdW50IC0gMSwKKwlidWlsZF9uYW1lKE5ld0NvdW50LCBJbnROYW1lLCBSZXN0KS4KKwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvc2VyaWFsaXNlLmluIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvc2VyaWFsaXNlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNThkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9zZXJpYWxpc2UuaW4KQEAgLTAsMCArMSBAQAorOi0gJyRiZW5jaG1hcmsnKHNlcmlhbGlzZSwgMTAwMCwgc2VyaWFsaXNlLCAnJGR1bW15JykuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9zZXJpYWxpc2UucGwgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci9zZXJpYWxpc2UucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNiZDc4MAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3NlcmlhbGlzZS5wbApAQCAtMCwwICsxLDM4IEBACislIGdlbmVyYXRlZDogMTcgTm92ZW1iZXIgMTk4OQorJSBvcHRpb24ocyk6IAorJQorJSAgIHNlcmlhbGlzZQorJQorJSAgIERhdmlkIEguIEQuIFdhcnJlbgorJQorJSAgIGl0ZW1pemUgKHBpY2sgYSAic2VyaWFsIG51bWJlciIgZm9yIGVhY2ggCislICAgdW5pcXVlIGludGVnZXIgaW4pIGEgbGlzdCBvZiAyNSBpbnRlZ2VycworCitzZXJpYWxpc2UgOi0gc2VyaWFsaXNlKCJBQkxFIFdBUyBJIEVSRSBJIFNBVyBFTEJBIixfKS4KKworc2VyaWFsaXNlKEwsUikgOi0KKyAgICBwYWlybGlzdHMoTCxSLEEpLAorICAgIGFycmFuZ2UoQSxUKSwKKyAgICBudW1iZXJlZChULDEsXykuCisKK3BhaXJsaXN0cyhbWHxMXSxbWXxSXSxbcGFpcihYLFkpfEFdKSA6LSBwYWlybGlzdHMoTCxSLEEpLgorcGFpcmxpc3RzKFtdLFtdLFtdKS4KKworYXJyYW5nZShbWHxMXSx0cmVlKFQxLFgsVDIpKSA6LQorICAgIHNwbGl0KEwsWCxMMSxMMiksCisgICAgYXJyYW5nZShMMSxUMSksCisgICAgYXJyYW5nZShMMixUMikuCithcnJhbmdlKFtdLHZvaWQpLgorCitzcGxpdChbWHxMXSxYLEwxLEwyKSA6LSAhLCBzcGxpdChMLFgsTDEsTDIpLgorc3BsaXQoW1h8TF0sWSxbWHxMMV0sTDIpIDotIGJlZm9yZShYLFkpLCAhLCBzcGxpdChMLFksTDEsTDIpLgorc3BsaXQoW1h8TF0sWSxMMSxbWHxMMl0pIDotIGJlZm9yZShZLFgpLCAhLCBzcGxpdChMLFksTDEsTDIpLgorc3BsaXQoW10sXyxbXSxbXSkuCisKK2JlZm9yZShwYWlyKFgxLF8pLHBhaXIoWDIsXykpIDotIFgxIDwgWDIuCisKK251bWJlcmVkKHRyZWUoVDEscGFpcihfLE4xKSxUMiksTjAsTikgOi0KKyAgICBudW1iZXJlZChUMSxOMCxOMSksCisgICAgTjIgaXMgTjErMSwKKyAgICBudW1iZXJlZChUMixOMixOKS4KK251bWJlcmVkKHZvaWQsTixOKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3NpbXBsZV9hbmFseXplci5pbiBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3NpbXBsZV9hbmFseXplci5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmU3NmUwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvc2ltcGxlX2FuYWx5emVyLmluCkBAIC0wLDAgKzEgQEAKKzotICckYmVuY2htYXJrJyhzaW1wbGVfYW5hbHl6ZXIsIDEwMDAsIG1haW4sICckZHVtbXknKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3NpbXBsZV9hbmFseXplci5wbCBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3NpbXBsZV9hbmFseXplci5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjEwODhmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvc2ltcGxlX2FuYWx5emVyLnBsCkBAIC0wLDAgKzEsNDgxIEBACislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUgQ29weXJpZ2h0IChDKSAxOTkwIFBldGVyIFZhbiBSb3kgYW5kIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyUgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBtYXkgYmUgZnJlZWx5IHVzZWQgYW5kIG1vZGlmaWVkIGZvcgorJSBub24tY29tbWVyY2lhbCBwdXJwb3NlcyBwcm92aWRlZCB0aGlzIGNvcHlyaWdodCBub3RpY2UgaXMga2VwdCB1bmNoYW5nZWQuCislIFdyaXR0ZW4gYnkgUGV0ZXIgVmFuIFJveSBhcyBhIHBhcnQgb2YgdGhlIEFxdWFyaXVzIHByb2plY3QuCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKworJSBCZW5jaG1hcmsgYmFzZWQgb24gdGhlIEFxdWFyaXVzIGNvbXBpbGVyIGZsb3cgYW5hbHl6ZXIgdmVyc2lvbiAxLgorJSBUaGlzIHByb2dyYW0gZG9lcyBhIGRhdGFmbG93IGFuYWx5c2lzIG9mIHF1aWNrc29ydCB1c2luZyBhYnN0cmFjdAorJSBpbnRlcnByZXRhdGlvbi4gIFRoZSBsYXR0aWNlIGhhcyB0d28gdXNlZnVsIHZhbHVlczogdW5pbml0IGFuZCBncm91bmQuCislIEFuYWx5c2lzIHRha2VzIHRocmVlIHBhc3NlcyAoaXQgcHJpbnRzIHRocmVlICd4JyBjaGFyYWN0ZXJzKS4KKyUgQnVpbHRpbnMgdXNlZDogY29tcGFyZS8zLCBhcmcvMywgZnVuY3Rvci8zLCBzb3J0LzIsIGtleXNvcnQvMiwgPT0vMiwgXD09LzIuCisKK21haW4gOi0gbWFpbihfKS4KKyUgbWFpbiA6LSBtYWluKFRhYmxlKSwgd3JpdGUoVGFibGUpLCBubC4KKworbWFpbihUYWJsZSkgOi0KKwlhbmFseXplX3N0cmVlcygKKwkgIFtzdHJlZShtYWluLzAsCisJICAgICAgKG1haW46LQorCSAgICAgICAocXNvcnQoWzEsMl0sTCxbXSksdHJ1ZQorICAgICAgICAgICAgICAgO2ZhaWwKKwkgICAgICAgKSksCisgICAgICAgICAgICAgIChtYWluOi10cnVlKSxbXSwxKSwKKwkgICBzdHJlZShxc29ydC8zLAorCSAgICAgIChxc29ydChVLFAsUSk6LQorCSAgICAgICAoVT1bTnxPXSxwYXJ0KE8sTixSLFMpLHFzb3J0KFMsVCxRKSxxc29ydChSLFAsW058VF0pLHRydWUKKwkgICAgICAgO1U9W10sUT1QLHRydWUKKwkgICAgICAgO2ZhaWwKKwkgICAgICAgKSksCisJICAgICAgKHFzb3J0KF8sXyxfKTotdHJ1ZSksW10sMSksCisJICAgc3RyZWUocGFydC80LAorCSAgICAgIChwYXJ0KFcsWCxZLFopOi0KKwkgICAgICAgKCckY3V0X2xvYWQnKEExKSwnJGN1dF9wYXJ0LzRfMScoVyxYLFksWixBMSksdHJ1ZQorCSAgICAgICA7ZmFpbAorCSAgICAgICApKSwKKwkgICAgICAocGFydChfLF8sXyxfKTotdHJ1ZSksCisJICAgW3N0cmVlKCckY3V0X3BhcnQvNF8xJy81LAorCSAgICAgICgnJGN1dF9wYXJ0LzRfMScoSTEsRTEsRjEsRzEsSDEpOi0KKwkgICAgICAgKEkxPVtDMXxEMV0sJyRmYWNfJGN1dF9wYXJ0LzRfMS81XzInKEQxLEUxLEYxLEcxLEgxLEMxKSx0cnVlCisJICAgICAgIDtJMT1bXSxGMT1bXSxHMT1bXSx0cnVlCisJICAgICAgIDtmYWlsCisJICAgICAgICkpLAorCSAgICAgICgnJGN1dF9wYXJ0LzRfMScoXyxfLF8sXyxfKTotdHJ1ZSksCisJICAgIFtzdHJlZSgnJGZhY18kY3V0X3BhcnQvNF8xLzVfMicvNiwKKwkgICAgICAoJyRmYWNfJGN1dF9wYXJ0LzRfMS81XzInKEsxLEwxLFExLE8xLFAxLE0xKTotCisJICAgICAgIChRMT1bTTF8TjFdLE0xPTxMMSwnJGN1dF9zaGFsbG93JyhQMSkscGFydChLMSxMMSxOMSxPMSksdHJ1ZQorCSAgICAgICA7TzE9W00xfFIxXSxwYXJ0KEsxLEwxLFExLFIxKSx0cnVlCisJICAgICAgIDtmYWlsCisJICAgICAgICkpLAorCSAgICAgICgnJGZhY18kY3V0X3BhcnQvNF8xLzVfMicoXyxfLF8sXyxfLF8pOi10cnVlKSxbXSwxKQorCSAgICBdLDEpCisJICAgXSwxKQorCSAgXSwgVGFibGUpLgorCithbmFseXplX3N0cmVlcyhTdHJlZXMsIE91dFRhYmxlKSA6LQorCWluaXRfc3RyZWVzKFN0cmVlcywgXywgVGFibGUpLAorCXNlYWwoVGFibGUpLAorCWFuYWx5emVfY2xvc3VyZShTdHJlZXMsIFRhYmxlLCBPdXRUYWJsZSkuCisKKyUgUmVwZWF0IHRyYXZlcnNhbCBzdGVwIHVudGlsIHRoZXJlIGFyZSBubyBtb3JlIGNoYW5nZXM6CithbmFseXplX2Nsb3N1cmUoU3RyZWVzLCBJblRhYmxlLCBPdXRUYWJsZSkgOi0KKwl0cmF2ZXJzZV9zdHJlZXMoU3RyZWVzLCBJblRhYmxlLCBNaWRUYWJsZSwgMCwgQ2hhbmdlcyksCisJJSBNYXJrIGFuIGFuYWx5c2lzIHBhc3M6CisJJSBwdXQoIngiKSwgbmwsCisJYW5hbHl6ZV9jbG9zdXJlKFN0cmVlcywgTWlkVGFibGUsIE91dFRhYmxlLCBDaGFuZ2VzKS4KKworYW5hbHl6ZV9jbG9zdXJlKFN0cmVlcywgSW5UYWJsZSwgSW5UYWJsZSwgTikgOi0gTj08MCwgIS4KK2FuYWx5emVfY2xvc3VyZShTdHJlZXMsIEluVGFibGUsIE91dFRhYmxlLCBOKSA6LSBOPjAsICEsCisJYW5hbHl6ZV9jbG9zdXJlKFN0cmVlcywgSW5UYWJsZSwgT3V0VGFibGUpLgorCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKworJSBJbml0aWFsaXplIHRoZSB0YWJsZSBvZiBjYWxsIGxhdHRpY2UgdmFsdWVzOgorCitpbml0X3N0cmVlcyhbXSxfNCxfNCkgOi0KKyAgIHRydWUuCitpbml0X3N0cmVlcyhbXzEyfF8xM10sXzQsXzUpIDotCisgICBfMTI9c3RyZWUoXzE0LChfMTU6LV8xNiksXzE3LF8xOCxfMTkpLAorICAgYm90dG9tX2NhbGwoXzE0LF8yMCksCisgICB0YWJsZV9jb21tYW5kKGdldChfMTQsXzIwKSxfNCxfMjMpLAorICAgaW5pdF9kaXNqKF8xNixfMjMsXzI0KSwKKyAgIGluaXRfc3RyZWVzKF8xOCxfMjQsXzI1KSwKKyAgIGluaXRfc3RyZWVzKF8xMyxfMjUsXzUpLAorICAgdHJ1ZS4KKworaW5pdF9jb25qKHRydWUsXzQsXzQpIDotCisgICB0cnVlLgoraW5pdF9jb25qKChfMTIsXzEzKSxfNCxfNSkgOi0KKyAgIGluaXRfZ29hbChfMTIsXzQsXzE2KSwKKyAgIGluaXRfY29uaihfMTMsXzE2LF81KSwKKyAgIHRydWUuCisKK2luaXRfZGlzaihmYWlsLF80LF80KSA6LQorICAgdHJ1ZS4KK2luaXRfZGlzaigoXzEyO18xMyksXzQsXzUpIDotCisgICBpbml0X2NvbmooXzEyLF80LF8xNiksCisgICBpbml0X2Rpc2ooXzEzLF8xNixfNSksCisgICB0cnVlLgorCitpbml0X2dvYWwoXzMsXzQsXzUpIDotCisgICBjYWxsX3AoXzMpLAorICAgISwKKyAgIGZ1bmN0b3IoXzMsXzEyLF8xMyksCisgICBib3R0b21fY2FsbChfMTIvXzEzLF8xNCksCisgICB0YWJsZV9jb21tYW5kKGdldChfMTIvXzEzLF8xNCksXzQsXzUpLAorICAgdHJ1ZS4KK2luaXRfZ29hbChfMyxfNCxfNCkgOi0KKyAgIHVuaWZ5X3AoXzMpLAorICAgISwKKyAgIHRydWUuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorCit0cmF2ZXJzZV9zdHJlZXMoW10sXzQsXzQsXzYsXzYpIDotCisgICB0cnVlLgordHJhdmVyc2Vfc3RyZWVzKFtfMTR8XzE1XSxfNCxfNSxfNixfNykgOi0KKyAgIF8xND1zdHJlZShfMTYsKF8xNzotXzE4KSxfMTksXzIwLF8yMSksCisgICB0cmF2ZXJzZV9kaXNqKF8xNyxfMTgsXzQsXzI2LF82LF8yNyksCisgICB0cmF2ZXJzZV9zdHJlZXMoXzIwLF8yNixfMjgsXzI3LF8yOSksCisgICB0cmF2ZXJzZV9zdHJlZXMoXzE1LF8yOCxfNSxfMjksXzcpLAorICAgdHJ1ZS4KKwordHJhdmVyc2VfZGlzaihfMyxmYWlsLF81LF81LF83LF83KSA6LQorICAgdHJ1ZS4KK3RyYXZlcnNlX2Rpc2ooXzMsKF8xNTtfMTYpLF81LF82LF83LF84KSA6LQorICAgdHJhdmVyc2VfY29uaihfMyxfMTUsXzUsXzIyLF83LF8yMyksCisgICB0cmF2ZXJzZV9kaXNqKF8zLF8xNixfMjIsXzYsXzIzLF84KSwKKyAgIHRydWUuCisKK3RyYXZlcnNlX2NvbmooXzMsXzQsXzUsXzYsXzcsXzgpIDotCisgICB2YXJzZXQoXzMsXzI0KSwKKyAgIGZ1bmN0b3IoXzMsXzE1LF8xNiksCisgICB0YWJsZV9jb21tYW5kKGdldChfMTUvXzE2LF8xNyksXzUsXzI1KSwKKyAgIGdldF9lbnRyeV9tb2Rlcyh1bmluaXQsXzMsXzE3LF8yNiksCisgICBnZXRfZW50cnlfbW9kZXMoZ3JvdW5kLF8zLF8xNyxfMjcpLAorICAgdHJhdmVyc2VfY29uaihfNCxfMjUsXzYsXzcsXzgsXzI3LF8yOCxfMjYsXzI5LF8yNCxfMzApLAorICAgdHJ1ZS4KKwordHJhdmVyc2VfY29uaih0cnVlLF80LF80LF82LF82LF84LF84LF8xMCxfMTAsXzEyLF8xMikgOi0KKyAgIHRydWUuCit0cmF2ZXJzZV9jb25qKChfMjAsXzIxKSxfNCxfNSxfNixfNyxfOCxfOSxfMTAsXzExLF8xMixfMTMpIDotCisgICB2YXJzZXQoXzIwLF8zMiksCisgICB1cGRhdGVfZ29hbChfMjAsXzMyLF80LF8zMyxfNixfMzQsXzgsXzM1LF8xMCxfMzYsXzEyLF8zNyksCisgICB1bmlvbnYoXzMyLF8zNyxfMzgpLAorICAgdHJhdmVyc2VfY29uaihfMjEsXzMzLF81LF8zNCxfNyxfMzUsXzksXzM2LF8xMSxfMzgsXzEzKSwKKyAgIHRydWUuCisKK3VwZGF0ZV9nb2FsKF8zLF80LF81LF81LF83LF83LF85LF8xMCxfMTEsXzEyLF8xMyxfMTMpIDotCisgICBzcGxpdF91bmlmeShfMyxfMjEsXzI3KSwKKyAgIHZhcihfMjEpLAorICAgbm9udmFyKF8yNyksCisgICB2YXJzZXQoXzI3LF8yOCksCisgICBzdWJzZXR2KF8yOCxfOSksCisgICAhLAorICAgc2V0X2NvbW1hbmQoYWRkKF8yMSksXzksXzEwKSwKKyAgIHNldF9jb21tYW5kKHN1YihfMjEpLF8xMSxfMTIpLAorICAgdHJ1ZS4KK3VwZGF0ZV9nb2FsKF8zLF80LF81LF81LF83LF83LF85LF85LF8xMSxfMTIsXzEzLF8xMykgOi0KKyAgIHNwbGl0X3VuaWZ5KF8zLF8yMSxfMzApLAorICAgdmFyKF8yMSksCisgICBub252YXIoXzMwKSwKKyAgIGludihfMjEsXzExKSwKKyAgICEsCisgICBkaWZmdihfNCxfMTMsXzMxKSwKKyAgIGRpZmZ2KF8zMSxfOSxfMjIpLAorICAgc2V0X2NvbW1hbmQoYWRkX3NldChfMjIpLF8xMSxfMzIpLAorICAgc2V0X2NvbW1hbmQoc3ViKF8yMSksXzMyLF8zMyksCisgICBpbnRlcnNlY3R2KF80LF8xMyxfMjMpLAorICAgc2V0X2NvbW1hbmQoc3ViX3NldChfMjMpLF8zMyxfMTIpLAorICAgdHJ1ZS4KK3VwZGF0ZV9nb2FsKF8zLF80LF81LF81LF83LF83LF85LF8xMCxfMTEsXzEyLF8xMyxfMTMpIDotCisgICBzcGxpdF91bmlmeShfMyxfMjcsXzI4KSwKKyAgIHZhcihfMjcpLAorICAgaW52KF8yNyxfOSksCisgICAhLAorICAgc2V0X2NvbW1hbmQoYWRkX3NldChfNCksXzksXzEwKSwKKyAgIHNldF9jb21tYW5kKHN1Yl9zZXQoXzQpLF8xMSxfMTIpLAorICAgdHJ1ZS4KK3VwZGF0ZV9nb2FsKF8zLF80LF81LF81LF83LF83LF85LF85LF8xMSxfMTIsXzEzLF8xMykgOi0KKyAgIHVuaWZ5X3AoXzMpLAorICAgISwKKyAgIHNldF9jb21tYW5kKHN1Yl9zZXQoXzQpLF8xMSxfMTIpLAorICAgdHJ1ZS4KK3VwZGF0ZV9nb2FsKF8zLF80LF81LF82LF83LF84LF85LF85LF8xMSxfMTIsXzEzLF8xMykgOi0KKyAgIGNhbGxfcChfMyksCisgICAhLAorICAgZ29hbF9kdXBzZXQoXzMsXzMzKSwKKyAgIHZhcl9hcmdzKF8zLF8zNCksCisgICBmdW5jdG9yKF8zLF8yMixfMjMpLAorICAgZnVuY3RvcihfMzUsXzIyLF8yMyksCisgICBjcmVhdGVfbmV3X2NhbGwoMSxfMjMsXzksXzM0LF8zMyxfMTEsXzEzLF8zLF8zNSksCisgICB1cGRhdGVfdGFibGUoXzIyL18yMyxfMzUsXzUsXzYsXzcsXzgpLAorICAgc2V0X2NvbW1hbmQoc3ViX3NldChfNCksXzExLF8xMiksCisgICB0cnVlLgorCit1cGRhdGVfdGFibGUoXzE1L18xNixfNCxfNSxfNixfNyxfOCkgOi0KKyAgIHRhYmxlX2NvbW1hbmQoZ2V0KF8xNS9fMTYsXzE4KSxfNSxfMjQpLAorICAgbHViX2NhbGwoXzE4LF80LF8xOSksCisgICBfMThcPT1fMTksCisgICAhLAorICAgdGFibGVfY29tbWFuZChzZXQoXzE1L18xNixfMTkpLF8yNCxfNiksCisgICBfOCBpcyBfNysxLAorICAgdHJ1ZS4KK3VwZGF0ZV90YWJsZShfMTUvXzE2LF80LF81LF81LF83LF83KS4KKworY3JlYXRlX25ld19jYWxsKEksIEFyLCBfLCBfLCBfLCBfLCBfLCBfLCBfKSA6LSBJPkFyLCAhLgorY3JlYXRlX25ld19jYWxsKEksIEFyLCBHbmQsIFZhckFyZ3MsIER1cFZhcnMsIFVuaSwgU29GYXIsIEdvYWwsIENhbGwpIDotCisJST08QXIsCisJISwKKwlhcmcoSSwgR29hbCwgWCksCisJYXJnKEksIENhbGwsIFkpLAorCWdyb3VuZF9mbGFnKFgsIEduZCwgR2YpLAorCW1lbWJlcnNoaXBfZmxhZyhYLCBWYXJBcmdzLCBWZiksCisJbWVtYmVyc2hpcF9mbGFnKFgsIER1cFZhcnMsIERmKSwKKwltZW1iZXJzaGlwX2ZsYWcoWCwgVW5pLCBVZiksCisJbWVtYmVyc2hpcF9mbGFnKFgsIFNvRmFyLCBTZiksCisJY3JlYXRlX2FyZ3VtZW50KEdmLCBWZiwgRGYsIFVmLCBTZiwgWSksCisJSTEgaXMgSSsxLAorCWNyZWF0ZV9uZXdfY2FsbChJMSwgQXIsIEduZCwgVmFyQXJncywgRHVwVmFycywgVW5pLCBTb0ZhciwgR29hbCwgQ2FsbCkuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorCislIExhdHRpY2UgdXRpbGl0aWVzOgorCitsdWIodW5rbm93biwgICAgICAgWCwgICAgICBYKSA6LSAhLgorbHViKCAgICAgIFgsIHVua25vd24sICAgICAgWCkgOi0gIS4KK2x1YiggICAgYW55LCAgICAgICBfLCAgICBhbnkpIDotICEuCitsdWIoICAgICAgXywgICAgIGFueSwgICAgYW55KSA6LSAhLgorbHViKCB1bmluaXQsICB1bmluaXQsIHVuaW5pdCkgOi0gIS4KK2x1YiggZ3JvdW5kLCAgZ3JvdW5kLCBncm91bmQpIDotICEuCitsdWIoIHVuaW5pdCwgIGdyb3VuZCwgICAgYW55KSA6LSAhLgorbHViKCBncm91bmQsICB1bmluaXQsICAgIGFueSkgOi0gIS4KKworYm90dG9tKHVua25vd24pLgorCitjcmVhdGVfYXJndW1lbnQoeWVzLCAgIF8sICAgXywgICBfLCAgIF8sIGdyb3VuZCkgOi0gIS4gJSBHcm91bmQgYXJndW1lbnQuCitjcmVhdGVfYXJndW1lbnQoIG5vLCB5ZXMsICBubywgeWVzLCAgIF8sIHVuaW5pdCkgOi0gIS4gJSBOb24tZHVwbGljYXRlZCB1bmluaXQuCitjcmVhdGVfYXJndW1lbnQoIG5vLCB5ZXMsICBubywgICBfLCAgbm8sIHVuaW5pdCkgOi0gIS4gJSBGaXJzdCBvY2N1cnJlbmNlLgorY3JlYXRlX2FyZ3VtZW50KCBubywgeWVzLCAgIF8sICBubywgeWVzLCBhbnkpIDotICEuICAgICUgQWxyZWFkeSBpbml0aWFsaXplZC4KK2NyZWF0ZV9hcmd1bWVudCggbm8sIHllcywgeWVzLCAgIF8sICAgXywgYW55KSA6LSAhLiAgICAlIER1cGxpY2F0ZWQgYXJndW1lbnQuCitjcmVhdGVfYXJndW1lbnQoIG5vLCAgbm8sICAgXywgICBfLCAgIF8sIGFueSkgOi0gIS4gICAgJSBOb24tdmFyaWFibGUgYXJndW1lbnQuCisKK2x1Yl9jYWxsKENhbGwxLCBDYWxsMiwgTHViKSA6LQorCWZ1bmN0b3IoQ2FsbDEsIE5hLCBBciksCisJZnVuY3RvcihDYWxsMiwgTmEsIEFyKSwKKwlmdW5jdG9yKEx1YiwgTmEsIEFyKSwKKwlsdWJfY2FsbCgxLCBBciwgQ2FsbDEsIENhbGwyLCBMdWIpLgorCitsdWJfY2FsbChJLCBBciwgXywgXywgXykgOi0gST5BciwgIS4KK2x1Yl9jYWxsKEksIEFyLCBDYWxsMSwgQ2FsbDIsIEx1YikgOi0gST08QXIsICEsCisJYXJnKEksIENhbGwxLCBYMSksCisJYXJnKEksIENhbGwyLCBYMiksCisJYXJnKEksIEx1YiwgWCksCisJbHViKFgxLCBYMiwgWCksCisJSTEgaXMgSSsxLAorCWx1Yl9jYWxsKEkxLCBBciwgQ2FsbDEsIENhbGwyLCBMdWIpLgorCitib3R0b21fY2FsbChOYS9BciwgQm90dG9tKSA6LQorCWZ1bmN0b3IoQm90dG9tLCBOYSwgQXIpLAorCWJvdHRvbV9jYWxsKDEsIEFyLCBCb3R0b20pLgorCitib3R0b21fY2FsbChJLCBBciwgQm90dG9tKSA6LSBJPkFyLCAhLgorYm90dG9tX2NhbGwoSSwgQXIsIEJvdHRvbSkgOi0gST08QXIsICEsCisJYm90dG9tKEIpLAorCWFyZyhJLCBCb3R0b20sIEIpLAorCUkxIGlzIEkrMSwKKwlib3R0b21fY2FsbChJMSwgQXIsIEJvdHRvbSkuCisKK2xhdHRpY2VfbW9kZXNfY2FsbChOYS9BciwgVGFibGUsIChIZWFkOi1Gb3JtdWxhKSkgOi0KKwlmdW5jdG9yKEhlYWQsIE5hLCBBciksCisJZ2V0KFRhYmxlLCBOYS9BciwgVmFsdWUpLAorCWxhdHRpY2VfbW9kZXNfY2FsbCgxLCBBciwgVmFsdWUsIEhlYWQsIEZvcm11bGEsIHRydWUpLgorCitsYXR0aWNlX21vZGVzX2NhbGwoSSwgQXIsIF8sIF8sIExpbmssIExpbmspIDotIEk+QXIsICEuCitsYXR0aWNlX21vZGVzX2NhbGwoSSwgQXIsIFZhbHVlLCBIZWFkLCBGb3JtdWxhLCBMaW5rKSA6LSBJPTxBciwgISwKKwlhcmcoSSwgVmFsdWUsIFQpLAorCWFyZyhJLCBIZWFkLCBYKSwKKwlsYXR0aWNlX21vZGVzX2FyZyhULCBYLCBGb3JtdWxhLCBNaWQpLAorCUkxIGlzIEkrMSwKKwlsYXR0aWNlX21vZGVzX2NhbGwoSTEsIEFyLCBWYWx1ZSwgSGVhZCwgTWlkLCBMaW5rKS4KKworbGF0dGljZV9tb2Rlc19hcmcodW5pbml0LCBYLCAodW5pbml0KFgpLExpbmspLCBMaW5rKSA6LSAhLgorbGF0dGljZV9tb2Rlc19hcmcoZ3JvdW5kLCBYLCAoZ3JvdW5kKFgpLExpbmspLCBMaW5rKSA6LSAhLgorbGF0dGljZV9tb2Rlc19hcmcoIE90aGVyLCBYLCBMaW5rLCBMaW5rKS4KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCisKKyUgVGFibGUgdXRpbGl0aWVzOgorCislIFRoaXMgY29kZSBpbXBsZW1lbnRzIGEgbXV0YWJsZSBhcnJheSwgcmVwcmVzZW50ZWQgYXMgYSBiaW5hcnkgdHJlZS4KKworJSBBY2Nlc3MgYSB2YWx1ZSBpbiBsb2dhcml0aG1pYyB0aW1lIGFuZCBjb25zdGFudCBzcGFjZToKKyUgVGhpcyBwcmVkaWNhdGUgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBhcnJheSBpbmNyZW1lbnRhbGx5LgorZ2V0KG5vZGUoTixXLEwsUiksIEksIFYpIDotIGdldChOLCBXLCBMLCBSLCBJLCBWKS4KKworZ2V0KE4sIFYsIF8sIF8sIEksIFYpIDotIEk9TiwgIS4KK2dldChOLCBfLCBMLCBSLCBJLCBWKSA6LQorCWNvbXBhcmUoT3JkZXIsIEksIE4pLAorCWdldChPcmRlciwgSSwgViwgTCwgUikuCisKK2dldCg8LCBJLCBWLCBMLCBfKSA6LSBnZXQoTCwgSSwgVikuCitnZXQoPiwgSSwgViwgXywgUikgOi0gZ2V0KFIsIEksIFYpLgorCitzZXQobGVhZiwgICAgICAgICAgSSwgViwgbm9kZShJLFYsbGVhZixsZWFmKSkuCitzZXQobm9kZShOLFcsTCxSKSwgSSwgViwgbm9kZShOLE5XLE5MLE5SKSkgOi0KKwljb21wYXJlKE9yZGVyLCBJLCBOKSwKKwlzZXRfMihPcmRlciwgSSwgViwgVywgTCwgUiwgTlcsIE5MLCBOUikuCisKK3NldF8yKDwsIEksIFYsIFcsIEwsIFIsIFcsIE5MLCBSKSA6LSBzZXQoTCwgSSwgViwgTkwpLgorc2V0XzIoPSwgSSwgViwgXywgTCwgUiwgViwgTCwgUikuCitzZXRfMig+LCBJLCBWLCBXLCBMLCBSLCBXLCBMLCBOUikgOi0gc2V0KFIsIEksIFYsIE5SKS4KKworJSBQcmV2ZW50IGFueSBmdXJ0aGVyIGluc2VydGlvbnMgaW4gdGhlIGFycmF5Ogorc2VhbChsZWFmKS4KK3NlYWwobm9kZShfLF8sTCxSKSkgOi0gc2VhbChMKSwgc2VhbChSKS4KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCisKKyUgR2VuZXJhbCB1dGlsaXRpZXM6CisKK21lbWJlcnNoaXBfZmxhZyhYLCBTZXQsIHllcykgOi0gaW52KFgsIFNldCksICEuCittZW1iZXJzaGlwX2ZsYWcoWCwgU2V0LCAgbm8pLgorCitncm91bmRfZmxhZyhYLCBHcm91bmQsIHllcykgOi0gdmFyc2V0KFgsIFNldCksIHN1YnNldHYoU2V0LCBHcm91bmQpLCAhLgorZ3JvdW5kX2ZsYWcoWCwgR3JvdW5kLCAgbm8pLgorCitnZXRfZW50cnlfbW9kZXMoVHlwZSwgSGVhZCwgVmFsdWUsIFR5cGVTZXQpIDotCisJZnVuY3RvcihIZWFkLCBOYSwgQXIpLAorCWdldF9lbnRyeV9tb2RlcyhUeXBlLCAxLCBBciwgSGVhZCwgVmFsdWUsIEJhZyksCisJc29ydChCYWcsIFR5cGVTZXQpLgorCitnZXRfZW50cnlfbW9kZXMoXywgSSwgQXIsIF8sIF8sIFtdKSA6LSBJPkFyLCAhLgorZ2V0X2VudHJ5X21vZGVzKFQsIEksIEFyLCBIZWFkLCBWYWx1ZSwgW1h8QmFnXSkgOi0gST08QXIsIGFyZyhJLCBWYWx1ZSwgVCksICEsCisJYXJnKEksIEhlYWQsIFgpLAorCUkxIGlzIEkrMSwKKwlnZXRfZW50cnlfbW9kZXMoVCwgSTEsIEFyLCBIZWFkLCBWYWx1ZSwgQmFnKS4KK2dldF9lbnRyeV9tb2RlcyhULCBJLCBBciwgSGVhZCwgVmFsdWUsIEJhZykgOi0gST08QXIsICEsCisJSTEgaXMgSSsxLAorCWdldF9lbnRyeV9tb2RlcyhULCBJMSwgQXIsIEhlYWQsIFZhbHVlLCBCYWcpLgorCit2YXJfYXJncyhHb2FsLCBTZXQpIDotCisJZnVuY3RvcihHb2FsLCBfLCBBciksCisJZmlsdGVyX3ZhcnMoQXIsIEdvYWwsIEJhZyksCisJc29ydChCYWcsIFNldCkuCisKK2ZpbHRlcl92YXJzKEFyLCBHb2FsLCBWcykgOi0gZmlsdGVyX3ZhcnMoQXIsIEdvYWwsIFZzLCBbXSkuCisKK2ZpbHRlcl92YXJzKE4sIEdvYWwpIC0tPiB7Tj08MH0sICEuCitmaWx0ZXJfdmFycyhOLCBHb2FsKSAtLT4ge04+MH0sICEsCisJe2FyZyhOLCBHb2FsLCBWKX0sCisJZmlsdGVyX3ZhcnNfYXJnKE4sIEdvYWwsIFYpLgorCitmaWx0ZXJfdmFyc19hcmcoTiwgR29hbCwgVikgLS0+IHt2YXIoVil9LCAhLCBbVl0sCisJe04xIGlzIE4tMX0sCisJZmlsdGVyX3ZhcnMoTjEsIEdvYWwpLgorZmlsdGVyX3ZhcnNfYXJnKE4sIEdvYWwsIFYpIC0tPiB7bm9udmFyKFYpfSwgISwKKwl7TjEgaXMgTi0xfSwKKwlmaWx0ZXJfdmFycyhOMSwgR29hbCkuCisKK2dvYWxfZHVwc2V0KEdvYWwsIER1cFNldCkgOi0KKwlnb2FsX2R1cHNldF92YXJiYWcoR29hbCwgRHVwU2V0LCBfKS4KKworZ29hbF9kdXBzZXRfdmFyc2V0KEdvYWwsIER1cFNldCwgVmFyU2V0KSA6LQorCWdvYWxfZHVwc2V0X3ZhcmJhZyhHb2FsLCBEdXBTZXQsIFZhckJhZyksCisJc29ydChWYXJCYWcsIFZhclNldCkuCisKK2dvYWxfZHVwc2V0X3ZhcmJhZyhHb2FsLCBEdXBTZXQsIFZhckJhZykgOi0KKwl2YXJiYWcoR29hbCwgVmFyQmFnKSwKKwltYWtlX2tleShWYXJCYWcsIEtleUJhZyksCisJa2V5c29ydChLZXlCYWcsIEtleVNldCksCisJZmlsdGVyX2R1cHMoS2V5U2V0LCBEdXBTZXQpLgorCittYWtlX2tleShbXSwgW10pLgorbWFrZV9rZXkoW1Z8QmFnXSwgW1YtZHVtbXl8S2V5QmFnXSkgOi0gbWFrZV9rZXkoQmFnLCBLZXlCYWcpLgorCitmaWx0ZXJfZHVwcyhLZXlTZXQsIFNldCkgOi0gZmlsdGVyX2R1cHMoS2V5U2V0LCBTZXQsIFtdKS4KKworZmlsdGVyX2R1cHMoW10pIC0tPiAhLgorZmlsdGVyX2R1cHMoW1YxLV8sVjItXyxWMy1ffEtleVNldF0pIC0tPiB7VjE9PVYyLFYyPT1WM30sICEsCisJZmlsdGVyX2R1cHMoW1YyLV8sVjMtX3xLZXlTZXRdKS4KK2ZpbHRlcl9kdXBzKFtWMS1fLFYyLV98S2V5U2V0XSkgLS0+IHtWMT09VjJ9LCAhLAorCVtWMV0sIGZpbHRlcl9kdXBzKEtleVNldCkuCitmaWx0ZXJfZHVwcyhbVjEtX3xLZXlTZXRdKSAtLT4gISwKKwlmaWx0ZXJfZHVwcyhLZXlTZXQpLgorCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKworJSBMb3ctbGV2ZWwgdXRpbGl0aWVzOgorCitzZXRfY29tbWFuZChzdWIoWCksIEluLCBPdXQpIDotIGRpZmZ2KEluLCBbWF0sIE91dCkuCitzZXRfY29tbWFuZChhZGQoWCksIEluLCBPdXQpIDotIGluY2x1ZGV2KFgsIEluLCBPdXQpLgorc2V0X2NvbW1hbmQoc3ViX3NldChYKSwgSW4sIE91dCkgOi0gZGlmZnYoSW4sIFgsIE91dCkuCitzZXRfY29tbWFuZChhZGRfc2V0KFgpLCBJbiwgT3V0KSA6LSB1bmlvbnYoWCwgSW4sIE91dCkuCisKK3RhYmxlX2NvbW1hbmQoZ2V0KEksVmFsKSwgSW4sICBJbikgOi0gZ2V0KEluLCBJLCBWYWwpLgordGFibGVfY29tbWFuZChzZXQoSSxWYWwpLCBJbiwgT3V0KSA6LSBzZXQoSW4sIEksIFZhbCwgT3V0KS4KKworJSBTZXQgdXRpbGl0aWVzIGluc3BpcmVkIGJ5IFIuIE8nS2VlZmUgaW4gUHJhY3RpY2FsIFByb2xvZzoKK2ludihBLCBbQnxTXSkgOi0KKwljb21wYXJlKE9yZGVyLCBBLCBCKSwKKwlpbnZfMihPcmRlciwgQSwgUykuCisKK2ludl8yKD0sIF8sIF8pLgoraW52XzIoPiwgQSwgUykgOi0gaW52KEEsIFMpLgorCitpbnRlcnNlY3R2KFtdLCBfLCBbXSkuCitpbnRlcnNlY3R2KFtBfFMxXSwgUzIsIFMpIDotIGludGVyc2VjdHZfMihTMiwgQSwgUzEsIFMpLgorCitpbnRlcnNlY3R2XzIoW10sIEEsIFMxLCBbXSkuCitpbnRlcnNlY3R2XzIoW0J8UzJdLCBBLCBTMSwgUykgOi0KKwljb21wYXJlKE9yZGVyLCBBLCBCKSwKKwlpbnRlcnNlY3R2XzMoT3JkZXIsIEEsIFMxLCBCLCBTMiwgUykuCisKK2ludGVyc2VjdHZfMyg8LCBBLCBTMSwgQiwgUzIsICAgICBTKSA6LSBpbnRlcnNlY3R2XzIoUzEsIEIsIFMyLCBTKS4KK2ludGVyc2VjdHZfMyg9LCBBLCBTMSwgXywgUzIsIFtBfFNdKSA6LSBpbnRlcnNlY3R2KFMxLCBTMiwgUykuCitpbnRlcnNlY3R2XzMoPiwgQSwgUzEsIEIsIFMyLCAgICAgUykgOi0gaW50ZXJzZWN0dl8yKFMyLCBBLCBTMSwgUykuCisKK2RpZmZ2KFtdLCBfLCBbXSkuCitkaWZmdihbQXxTMV0sIFMyLCBTKSA6LSBkaWZmdl8yKFMyLCBBLCBTMSwgUykuCisKK2RpZmZ2XzIoW10sIEEsIFMxLCBbQV0pLgorZGlmZnZfMihbQnxTMl0sIEEsIFMxLCBTKSA6LQorCWNvbXBhcmUoT3JkZXIsIEEsIEIpLAorCWRpZmZ2XzMoT3JkZXIsIEEsIFMxLCBCLCBTMiwgUykuCisKK2RpZmZ2XzMoPCwgQSwgUzEsIEIsIFMyLCBbQXxTXSkgOi0gZGlmZnYoUzEsIFtCfFMyXSwgUykuCitkaWZmdl8zKD0sIEEsIFMxLCBfLCBTMiwgICAgIFMpIDotIGRpZmZ2KFMxLCBTMiwgUykuCitkaWZmdl8zKD4sIEEsIFMxLCBfLCBTMiwgICAgIFMpIDotIGRpZmZ2XzIoUzIsIEEsIFMxLCBTKS4KKwordW5pb252KFtdLCBTMiwgUzIpLgordW5pb252KFtBfFMxXSwgUzIsIFMpIDotIHVuaW9udl8yKFMyLCBBLCBTMSwgUykuCisKK3VuaW9udl8yKFtdLCBBLCBTMSwgW0F8UzFdKS4KK3VuaW9udl8yKFtCfFMyXSwgQSwgUzEsIFMpIDotCisJY29tcGFyZShPcmRlciwgQSwgQiksCisJdW5pb252XzMoT3JkZXIsIEEsIFMxLCBCLCBTMiwgUykuCisKK3VuaW9udl8zKDwsIEEsIFMxLCBCLCBTMiwgW0F8U10pIDotIHVuaW9udl8yKFMxLCBCLCBTMiwgUykuCit1bmlvbnZfMyg9LCBBLCBTMSwgXywgUzIsIFtBfFNdKSA6LSB1bmlvbnYoUzEsIFMyLCBTKS4KK3VuaW9udl8zKD4sIEEsIFMxLCBCLCBTMiwgW0J8U10pIDotIHVuaW9udl8yKFMyLCBBLCBTMSwgUykuCisKK2luY2x1ZGV2KEEsIFMxLCBTKSA6LSBpbmNsdWRldl8yKFMxLCBBLCBTKS4KKworaW5jbHVkZXZfMihbXSwgQSwgW0FdKS4KK2luY2x1ZGV2XzIoW0J8UzFdLCBBLCBTKSA6LQorCWNvbXBhcmUoT3JkZXIsIEEsIEIpLAorCWluY2x1ZGV2XzMoT3JkZXIsIEEsIEIsIFMxLCBTKS4KKworaW5jbHVkZXZfMyg8LCBBLCBCLCBTMSwgW0EsQnxTMV0pLgoraW5jbHVkZXZfMyg9LCBfLCBCLCBTMSwgW0J8UzFdKS4KK2luY2x1ZGV2XzMoPiwgQSwgQiwgUzEsIFtCfFNdKSA6LSBpbmNsdWRldl8yKFMxLCBBLCBTKS4KKworc3Vic2V0dihbXSwgXykuCitzdWJzZXR2KFtBfFMxXSwgW0J8UzJdKSA6LQorCWNvbXBhcmUoT3JkZXIsIEEsIEIpLAorCXN1YnNldHZfMihPcmRlciwgQSwgUzEsIFMyKS4KKworc3Vic2V0dl8yKD0sIEEsIFMxLCBTMikgOi0gc3Vic2V0dihTMSwgUzIpLgorc3Vic2V0dl8yKD4sIEEsIFMxLCBTMikgOi0gc3Vic2V0dihbQXxTMV0sIFMyKS4KKwordmFyc2V0KFRlcm0sIFZhclNldCkgOi0gdmFyYmFnKFRlcm0sIFZCKSwgc29ydChWQiwgVmFyU2V0KS4KK3ZhcmJhZyhUZXJtLCBWYXJCYWcpIDotIHZhcmJhZyhUZXJtLCBWYXJCYWcsIFtdKS4KKwordmFyYmFnKFZhcikgLS0+IHt2YXIoVmFyKX0sICEsIFtWYXJdLgordmFyYmFnKFN0cikgLS0+IHtub252YXIoU3RyKSwgISwgZnVuY3RvcihTdHIsXyxBcml0eSl9LCB2YXJiYWcoU3RyLCAxLCBBcml0eSkuCisKK3ZhcmJhZyhfU3RyLCBOLCBBcml0eSkgLS0+IHtOPkFyaXR5fSwgIS4KK3ZhcmJhZyhTdHIsIE4sIEFyaXR5KSAtLT4ge049PEFyaXR5fSwgISwKKyAgICAgICAge2FyZyhOLCBTdHIsIEFyZyl9LCB2YXJiYWcoQXJnKSwKKyAgICAgICAge04xIGlzIE4rMX0sCisgICAgICAgIHZhcmJhZyhTdHIsIE4xLCBBcml0eSkuCisKK3VuaWZ5X3AoXz1fKS4KKworY2FsbF9wKEcpIDotIFwrdW5pZnlfcChHKS4KKworc3BsaXRfdW5pZnkoWD1ZLCBYLCBZKS4KK3NwbGl0X3VuaWZ5KFk9WCwgWCwgWSkuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvdGFrLmluIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvdGFrLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MzcyZWMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci90YWsuaW4KQEAgLTAsMCArMSBAQAorOi0gJyRiZW5jaG1hcmsnKHRhaywgMTAwMCwgdGFrLCAnJGR1bW15JykuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci90YWsucGwgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci90YWsucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5YTA0MgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3Rhay5wbApAQCAtMCwwICsxLDIzIEBACislIGdlbmVyYXRlZDogMTcgTm92ZW1iZXIgMTk4OQorJSBvcHRpb24ocyk6IFNPVVJDRV9UUkFOU0ZPUk1fMQorJQorJSAgIHRhaworJQorJSAgIEV2YW4gVGljayAoZnJvbSBMaXNwIHZlcnNpb24gYnkgUi4gUC4gR2FicmllbCkKKyUKKyUgICAoYWxtb3N0KSBUYWtldWNoaSBmdW5jdGlvbiAocmVjdXJzaXZlIGFyaXRobWV0aWMpCisKK3RhayA6LSB0YWsoMTgsMTIsNixfKS4KKwordGFrKFgsWSxaLEEpIDotCisgICAgICAgIFggPTwgWSwKKyAgICAgICAgWiA9IEEuCit0YWsoWCxZLFosQSkgOi0KKwlYID4gWSwKKyAgICAgICAgWDEgaXMgWCAtIDEsCisgICAgICAgIHRhayhYMSxZLFosQTEpLAorICAgICAgICBZMSBpcyBZIC0gMSwKKyAgICAgICAgdGFrKFkxLFosWCxBMiksCisgICAgICAgIFoxIGlzIFogLSAxLAorICAgICAgICB0YWsoWjEsWCxZLEEzKSwKKyAgICAgICAgdGFrKEExLEEyLEEzLEEpLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvdGltZXMxMC5pbiBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3RpbWVzMTAuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZkM2VkYQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3RpbWVzMTAuaW4KQEAgLTAsMCArMSBAQAorOi0gJyRiZW5jaG1hcmsnKHRpbWVzMTAsIDEwMDAsIHRpbWVzMTAsICckZHVtbXknKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3RpbWVzMTAucGwgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci90aW1lczEwLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NDBmMTcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci90aW1lczEwLnBsCkBAIC0wLDAgKzEsMzUgQEAKKyUgZ2VuZXJhdGVkOiA3IE1hcmNoIDE5OTAKKyUgb3B0aW9uKHMpOiAKKyUKKyUgICAoZGVyaXYpIHRpbWVzMTAKKyUKKyUgICBEYXZpZCBILiBELiBXYXJyZW4KKyUKKyUgICBzeW1ib2xpYyBkZXJpdmF0aXZlIG9mICgoKCgoKCgoeCp4KSp4KSp4KSp4KSp4KSp4KSp4KSp4KSp4CisKK3RpbWVzMTAgOi0gZCgoKCgoKCgoKHgqeCkqeCkqeCkqeCkqeCkqeCkqeCkqeCkqeCx4LF8pLgorCitkKFUrVixYLERVK0RWKSA6LSAhLCAKKyAgICBkKFUsWCxEVSksCisgICAgZChWLFgsRFYpLgorZChVLVYsWCxEVS1EVikgOi0gISwKKyAgICBkKFUsWCxEVSksCisgICAgZChWLFgsRFYpLgorZChVKlYsWCxEVSpWK1UqRFYpIDotICEsCisgICAgZChVLFgsRFUpLAorICAgIGQoVixYLERWKS4KK2QoVS9WLFgsKERVKlYtVSpEVikvKF4oViwyKSkpIDotICEsCisgICAgZChVLFgsRFUpLAorICAgIGQoVixYLERWKS4KK2QoXihVLE4pLFgsRFUqTiooXihVLE4xKSkpIDotICEsIAorICAgIGludGVnZXIoTiksCisgICAgTjEgaXMgTi0xLAorICAgIGQoVSxYLERVKS4KK2QoLVUsWCwtRFUpIDotICEsCisgICAgZChVLFgsRFUpLgorZChleHAoVSksWCxleHAoVSkqRFUpIDotICEsCisgICAgZChVLFgsRFUpLgorZChsb2coVSksWCxEVS9VKSA6LSAhLAorICAgIGQoVSxYLERVKS4KK2QoWCxYLDEpIDotICEuCitkKF8sXywwKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3VuaWZ5LmluIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvdW5pZnkuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiOTQyZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3VuaWZ5LmluCkBAIC0wLDAgKzEgQEAKKzotICckYmVuY2htYXJrJyh1bmlmeSwgMTAwMCwgbWFpbiwgJyRkdW1teScpLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvdW5pZnkucGwgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci91bmlmeS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2U3M2FmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvdW5pZnkucGwKQEAgLTAsMCArMSwxNTYgQEAKKy8qIENIQU5HRUxPRyBieSBNLkJhbmJhcmEKKyAgIC0gcmVuYW1lIGNvbXBvdW5kLzEgdG8gJyRjb21wb3VuZCcvMQorICAgLSBjb21tZW50IHdyaXRlLzEgYW5kIG5sLzAgb3V0CisqLworCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSBDb3B5cmlnaHQgKEMpIDE5OTAgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorJSBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIG1heSBiZSBmcmVlbHkgdXNlZCBhbmQgbW9kaWZpZWQgZm9yCislIG5vbi1jb21tZXJjaWFsIHB1cnBvc2VzIHByb3ZpZGVkIHRoaXMgY29weXJpZ2h0IG5vdGljZSBpcyBrZXB0IHVuY2hhbmdlZC4KKyUgV3JpdHRlbiBieSBQZXRlciBWYW4gUm95IGFzIGEgcGFydCBvZiB0aGUgQXF1YXJpdXMgcHJvamVjdC4KKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorCislIEJlbmNobWFyayBiYXNlZCBvbiBwYXJ0IG9mIEFxdWFyaXVzIFByb2xvZyBjb21waWxlcgorJSBDb21waWxpbmcgdW5pZmljYXRpb24gaW50byBhYnN0cmFjdCBtYWNoaW5lIGNvZGUuCisKK21haW4gOi0gbWFpbihYKS4KKyVtYWluIDotIG1haW4oWCksIHdyaXRlKFgpLCBubC4KKworbWFpbihTaXplKSA6LSB1KFgsIFsxLFldLCBbWF0sIENvZGUpLCBzaXplKENvZGUsIDAsIFNpemUpLgorCislIFVuaWZ5IHZhcmlhYmxlIFggd2l0aCB0ZXJtIFQgYW5kIHdyaXRlIHRoZSByZXN1bHQ6Cit1KFgsIFQsIEluLCBDb2RlKSA6LSB1bmlmeShYLCBULCBJbiwgXywgQ29kZSwgW10pLgorIAorJSBVbmlmeSB0aGUgdmFyaWFibGUgWCB3aXRoIHRoZSB0ZXJtIFQsIGdpdmVuIHRoYXQKKyUgSW4gPSBzZXQgb2YgdmFyaWFibGVzIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgdW5pZmljYXRpb24uCislIFJldHVybnMgdGhlIGludGVybWVkaWF0ZSBjb2RlIGZvciB0aGUgdW5pZmljYXRpb24gYW5kCislIE91dCA9IHNldCBvZiB2YXJpYWJsZXMgaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIHVuaWZpY2F0aW9uLgordW5pZnkoWCwgVCwgSW4sIE91dCkgLS0+IHtcK2luKFgsIEluKX0sICEsIHVuaW5pdChYLCBULCBJbiwgT3V0KS4KK3VuaWZ5KFgsIFQsIEluLCBPdXQpIC0tPiAgIHtpbihYLCBJbil9LCAhLCAgIGluaXQoWCwgVCwgSW4sIE91dCwgbm9ubGFzdCwgXykuCisKKyUqKioqIFVuaW5pdCBhc3N1bWVzIFggaGFzIG5vdCB5ZXQgYmVlbiBpbml0aWFsaXplZDoKK3VuaW5pdChYLCBULCBJbiwgT3V0KSAtLT4geyckY29tcG91bmQnKFQpfSwgISwgW21vdmUoVGFnXmgsIFgpXSwKKyAgICAgICAge3Rlcm10YWcoVCwgVGFnKX0sIHVuaWZ5X2Jsb2NrKG5vbmxhc3QsIFQsIF8sIEluLCBNaWQsIF8pLCB7aW5jbChYLCBNaWQsIE91dCl9LgordW5pbml0KFgsIFQsIEluLCBPdXQpIC0tPiB7YXRvbWljKFQpfSwgISwgW21vdmUodGF0bV5ULCBYKV0sIHtpbmNsKFgsIEluLCBPdXQpfS4KK3VuaW5pdChYLCBULCBJbiwgT3V0KSAtLT4ge3ZhcihUKX0sICEsIHVuaWZ5X3ZhcihYLCBULCBJbiwgT3V0KS4KKworJSoqKiogSW5pdCBhc3N1bWVzIFggaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZDoKK2luaXQoWCwgVCwgSW4sIE91dCwgTGFzdCwgTExibHMpIC0tPiB7bm9udmFyKFQpfSwgISwKKyAgICAgICAge3Rlcm10YWcoVCxUYWcpfSwgW2RlcmVmKFgpLCBzd2l0Y2goVGFnLFgsW3RyYWlsKFgpIHwgV3JpdGVdLFJlYWQsZmFpbCldLAorICAgICAgICB7dW5pZnlfd3JpdGVtb2RlKFgsIFQsIEluLCAgICAgIExhc3QsIExMYmxzLCBXcml0ZSwgW10pfSwKKyAgICAgICAge3VuaWZ5X3JlYWRtb2RlKFgsIFQsIEluLCBPdXQsICAgICAgIExMYmxzLCBSZWFkLCBbXSl9LgoraW5pdChYLCBULCBJbiwgT3V0LCAgICBfLCAgICAgXykgLS0+IHt2YXIoVCl9LCAhLCB1bmlmeV92YXIoWCwgVCwgSW4sIE91dCkuCisKKyUqKioqIFVuaWZ5aW5nIHR3byB2YXJpYWJsZXMgdG9nZXRoZXI6Cit1bmlmeV92YXIoWCwgWSwgSW4sICBJbikgLS0+IHsgIGluKFgsIEluKSwgICBpbihZLCBJbil9LCAhLCBbdW5pZnkoWCxZLGZhaWwpXS4KK3VuaWZ5X3ZhcihYLCBZLCBJbiwgT3V0KSAtLT4geyAgaW4oWCwgSW4pLCBcK2luKFksIEluKX0sICEsIFttb3ZlKFgsWSldLCB7aW5jbChZLCBJbiwgT3V0KX0uCit1bmlmeV92YXIoWCwgWSwgSW4sIE91dCkgLS0+IHtcK2luKFgsIEluKSwgICBpbihZLCBJbil9LCAhLCBbbW92ZShZLFgpXSwge2luY2woWCwgSW4sIE91dCl9LgordW5pZnlfdmFyKFgsIFksIEluLCBPdXQpIC0tPiB7XCtpbihYLCBJbiksIFwraW4oWSwgSW4pfSwgISwKKyAgICAgICAgW21vdmUodHZhcl5oLFgpLCBtb3ZlKHR2YXJeaCxZKSwgYWRkKDEsaCksIG1vdmUoWSxbaC0xXSldLAorICAgICAgICB7aW5jbChYLCBJbiwgTWlkKSwgaW5jbChZLCBNaWQsIE91dCl9LgorCislKioqKiBVbmlmeV9yZWFkbW9kZSBhc3N1bWVzIFggaXMgYSBkZXJlZmVyZW5jZWQgbm9udmFyaWFibGUKKyUgYXQgcnVuLXRpbWUgYW5kIFQgaXMgYSBub252YXJpYWJsZSBhdCBjb21waWxlLXRpbWUuCit1bmlmeV9yZWFkbW9kZShYLCBULCBJbiwgT3V0LCBMTGJscykgLS0+IHtzdHJ1Y3R1cmUoVCl9LCAhLCBbZXF1YWwoW1hdLHRhdG1eKEYvTiksZmFpbCldLAorICAgICAgICB7ZnVuY3RvcihULCBGLCBOKX0sIHVuaWZ5X2FyZ3MoMSwgTiwgVCwgSW4sIE91dCwgIDAsIFgsIExMYmxzKS4KK3VuaWZ5X3JlYWRtb2RlKFgsIFQsIEluLCBPdXQsIExMYmxzKSAtLT4ge2NvbnMoVCl9LCAhLAorICAgICAgICB1bmlmeV9hcmdzKDEsIDIsIFQsIEluLCBPdXQsIC0xLCBYLCBMTGJscykuCit1bmlmeV9yZWFkbW9kZShYLCBULCBJbiwgIEluLCAgICAgXykgLS0+IHthdG9taWMoVCl9LCAhLCBbZXF1YWwoWCx0YXRtXlQsZmFpbCldLgorCit1bmlmeV9hcmdzKEksIE4sIF8sIEluLCAgSW4sIF8sIF8sICAgICAgICAgXykgLS0+IHtJPk59LCAhLgordW5pZnlfYXJncyhJLCBOLCBULCBJbiwgT3V0LCBELCBYLCBbIF8gfCBMTGJsc10pIC0tPiB7ST1OfSwgISwKKyAgICAgICAgdW5pZnlfYXJnKEksIFQsIEluLCBPdXQsIEQsIFgsIGxhc3QsIExMYmxzKS4gCit1bmlmeV9hcmdzKEksIE4sIFQsIEluLCBPdXQsIEQsIFgsICAgICBMTGJscykgLS0+IHtJPE59LCAhLAorICAgICAgICB1bmlmeV9hcmcoSSwgVCwgSW4sIE1pZCwgRCwgWCwgbm9ubGFzdCwgXyksCisgICAgICAgIHtJMSBpcyBJKzF9LCB1bmlmeV9hcmdzKEkxLCBOLCBULCBNaWQsIE91dCwgRCwgWCwgTExibHMpLgorCit1bmlmeV9hcmcoSSwgVCwgSW4sIE91dCwgRCwgWCwgTGFzdCwgTExibHMpIC0tPiBbbW92ZShbWCtJRF0sWSldLAorICAgICAgICB7SUQgaXMgSStELCBpbmNsKFksIEluLCBNaWQpLCBhcmcoSSwgVCwgQSl9LAorICAgICAgICBpbml0KFksIEEsIE1pZCwgT3V0LCBMYXN0LCBMTGJscykuCisKKyUqKioqIFVuaWZ5X3dyaXRlbW9kZSBhc3N1bWVzIFggaXMgYSBkZXJlZmVyZW5jZWQgdW5ib3VuZAorJSB2YXJpYWJsZSBhdCBydW4tdGltZSBhbmQgVCBpcyBhIG5vbnZhcmlhYmxlIGF0IGNvbXBpbGUtdGltZS4KK3VuaWZ5X3dyaXRlbW9kZShYLCBULCBJbiwgTGFzdCwgTExibHMpIC0tPiB7JyRjb21wb3VuZCcoVCl9LCAhLCBbbW92ZShUYWdeaCxbWF0pXSwKKyAgICAgICAge3Rlcm10YWcoVCwgVGFnKX0sIHVuaWZ5X2Jsb2NrKExhc3QsIFQsIF8sIEluLCBfLCBMTGJscykuCit1bmlmeV93cml0ZW1vZGUoWCwgVCwgIF8sICAgIF8sICAgICBfKSAtLT4ge2F0b21pYyhUKX0sICEsIFttb3ZlKHRhdG1eVCxbWF0pXS4KKworJSoqKiogR2VuZXJhdGUgYSBtaW5pbWFsIHNlcXVlbmNlIG9mIG1vdmVzIHRvIGNyZWF0ZSBUIG9uIHRoZSBoZWFwOgordW5pZnlfYmxvY2soICAgbGFzdCwgVCwgU2l6ZSwgSW4sICBJbiwgW0xibCB8IF8gXSkgLS0+ICEsIFthZGQoU2l6ZSxoKSwganVtcChMYmwpXSwKKyAgICAgICAge3NpemUoVCwgMCwgU2l6ZSl9LgordW5pZnlfYmxvY2sobm9ubGFzdCwgVCwgU2l6ZSwgSW4sIE91dCwgWyBfIHwgTExibHNdKSAtLT4gISwgW2FkZChTaXplLGgpXSwKKyAgICAgICAge3NpemUoVCwgMCwgU2l6ZSksIE9mZnNldCBpcyAtU2l6ZX0sIGJsb2NrKFQsIE9mZnNldCwgMCwgSW4sIE91dCwgTExibHMpLgorCitibG9jayhULCBJbmYsIE91dGYsIEluLCBPdXQsIExMYmxzKSAtLT4ge3N0cnVjdHVyZShUKX0sICEsIFttb3ZlKHRhdG1eKEYvTiksIFtoK0luZl0pXSwKKyAgICAgICAge2Z1bmN0b3IoVCwgRiwgTiksIE1pZGYgaXMgSW5mK04rMSwgUyBpcyBJbmYrMX0sCisgICAgICAgIG1ha2Vfc2xvdHMoMSwgTiwgVCwgUywgT2Zmc2V0cywgSW4sIE1pZCksCisgICAgICAgIGJsb2NrX2FyZ3MoMSwgTiwgVCwgTWlkZiwgT3V0ZiwgT2Zmc2V0cywgTWlkLCBPdXQsIExMYmxzKS4KK2Jsb2NrKFQsIEluZiwgT3V0ZiwgSW4sIE91dCwgTExibHMpIC0tPiB7Y29ucyhUKX0sICEsCisgICAgICAgIHtNaWRmIGlzIEluZisyfSwKKyAgICAgICAgbWFrZV9zbG90cygxLCAyLCBULCBJbmYsIE9mZnNldHMsIEluLCBNaWQpLAorICAgICAgICBibG9ja19hcmdzKDEsIDIsIFQsIE1pZGYsIE91dGYsIE9mZnNldHMsIE1pZCwgT3V0LCBMTGJscykuCitibG9jayhULCBJbmYsICBJbmYsIEluLCAgSW4sICAgIFtdKSAtLT4ge2F0b21pYyhUKX0sICEuCitibG9jayhULCBJbmYsICBJbmYsIEluLCAgSW4sICAgIFtdKSAtLT4ge3ZhcihUKX0sICEuCisKK2Jsb2NrX2FyZ3MoSSwgTiwgXywgSW5mLCAgSW5mLCAgICBbXSwgSW4sICBJbiwgICAgICAgICAgW10pIC0tPiB7ST5OfSwgIS4KK2Jsb2NrX2FyZ3MoSSwgTiwgVCwgSW5mLCBPdXRmLCBbSW5mXSwgSW4sIE91dCwgW0xibCB8IExMYmxzXSkgLS0+IHtJPU59LCAhLCBbbGFiZWwoTGJsKV0sCisgICAgICAgIHthcmcoSSwgVCwgQSl9LCBibG9jayhBLCBJbmYsIE91dGYsIEluLCBPdXQsIExMYmxzKS4KK2Jsb2NrX2FyZ3MoSSwgTiwgVCwgSW5mLCBPdXRmLCBbSW5mIHwgT2Zmc2V0c10sIEluLE91dCxMTGJscykgLS0+IHtJPE59LCAhLAorICAgICAgICB7YXJnKEksIFQsIEEpfSwgYmxvY2soQSwgSW5mLCBNaWRmLCBJbiwgTWlkLCBfKSwge0kxIGlzIEkrMX0sCisgICAgICAgIGJsb2NrX2FyZ3MoSTEsIE4sIFQsIE1pZGYsIE91dGYsIE9mZnNldHMsIE1pZCwgT3V0LCBMTGJscykuCisKK21ha2Vfc2xvdHMoSSwgTiwgXywgXywgICAgICAgICAgICBbXSwgSW4sICBJbikgLS0+IHtJPk59LCAhLgorbWFrZV9zbG90cyhJLCBOLCBULCBTLCBbT2ZmIHwgT2Zmc2V0c10sIEluLCBPdXQpIC0tPiB7ST08Tn0sICEsCisgICAgICAgIHthcmcoSSwgVCwgQSl9LCBpbml0X3ZhcihBLCBTLCBJbiksCisgICAgICAgIHtpbmNsKEEsIEluLCBNaWQpLCBtYWtlX3dvcmQoQSwgT2ZmLCBXb3JkKX0sIFttb3ZlKFdvcmQsW2grU10pXSwKKyAgICAgICAge1MxIGlzIFMrMSwgSTEgaXMgSSsxfSwKKyAgICAgICAgbWFrZV9zbG90cyhJMSwgTiwgVCwgUzEsIE9mZnNldHMsIE1pZCwgT3V0KS4KKworJSBJbml0aWFsaXplIGZpcnN0LXRpbWUgdmFyaWFibGVzIGluIHdyaXRlIG1vZGU6Citpbml0X3ZhcihWLCBJLCBJbikgLS0+IHt2YXIoViksIFwraW4oViwgSW4pfSwgISwgW21vdmUodHZhcl4oaCtJKSxWKV0uCitpbml0X3ZhcihWLCBfLCBJbikgLS0+IHt2YXIoViksICAgaW4oViwgSW4pfSwgIS4KK2luaXRfdmFyKFYsIF8sICBfKSAtLT4ge25vbnZhcihWKX0sICEuCisKK21ha2Vfd29yZChDLCBPZmYsIFRhZ14oaCtPZmYpKSA6LSAnJGNvbXBvdW5kJyhDKSwgISwgdGVybXRhZyhDLCBUYWcpLgorbWFrZV93b3JkKFYsICAgXywgVikgICAgICAgICAgIDotIHZhcihWKSwgIS4KK21ha2Vfd29yZChBLCAgIF8sIHRhdG1eQSkgICAgICA6LSBhdG9taWMoQSksICEuCisKKyUgQ2FsY3VsYXRlIHRoZSBzaXplIG9mIFQgb24gdGhlIGhlYXA6CitzaXplKFQpIC0tPiB7c3RydWN0dXJlKFQpfSwgISwge2Z1bmN0b3IoVCwgXywgTil9LCBhZGQoMSksIGFkZChOKSwgc2l6ZV9hcmdzKDEsIE4sIFQpLgorc2l6ZShUKSAtLT4ge2NvbnMoVCl9LCAhLCBhZGQoMiksIHNpemVfYXJncygxLCAyLCBUKS4KK3NpemUoVCkgLS0+IHthdG9taWMoVCl9LCAhLgorc2l6ZShUKSAtLT4ge3ZhcihUKX0sICEuCisKK3NpemVfYXJncyhJLCBOLCBfKSAtLT4gIHtJPk59LCAhLgorc2l6ZV9hcmdzKEksIE4sIFQpIC0tPiB7ST08Tn0sICEsIHthcmcoSSwgVCwgQSl9LCBzaXplKEEpLCB7STEgaXMgSSsxfSwgc2l6ZV9hcmdzKEkxLCBOLCBUKS4KKworJSoqKiogVXRpbGl0eSByb3V0aW5lczoKKworYWRkKEksIFgsIFkpIDotIFkgaXMgWCtJLgorCitpbihBLCBbQnxTXSkgOi0KKyAgICAgICAgY29tcGFyZShPcmRlciwgQSwgQiksCisgICAgICAgIGluXzIoT3JkZXIsIEEsIFMpLgorCitpbl8yKD0sIF8sIF8pLgoraW5fMig+LCBBLCBTKSA6LSBpbihBLCBTKS4KKworaW5jbChBLCBTMSwgUykgOi0gaW5jbF8yKFMxLCBBLCBTKS4KKworaW5jbF8yKFtdLCBBLCBbQV0pLgoraW5jbF8yKFtCfFMxXSwgQSwgUykgOi0KKyAgICAgICAgY29tcGFyZShPcmRlciwgQSwgQiksCisgICAgICAgIGluY2xfMyhPcmRlciwgQSwgQiwgUzEsIFMpLgorCitpbmNsXzMoPCwgQSwgQiwgUzEsIFtBLEJ8UzFdKS4KK2luY2xfMyg9LCBfLCBCLCBTMSwgW0J8UzFdKS4KK2luY2xfMyg+LCBBLCBCLCBTMSwgW0J8U10pIDotIGluY2xfMihTMSwgQSwgUykuCisKKyckY29tcG91bmQnKFgpICA6LSBub252YXIoWCksIFwrYXRvbWljKFgpLgorY29ucyhYKSAgICAgIDotIG5vbnZhcihYKSwgWD1bX3xfXS4KK3N0cnVjdHVyZShYKSA6LSAnJGNvbXBvdW5kJyhYKSwgXCtYPVtffF9dLgorCit0ZXJtdGFnKFQsIHRzdHIpIDotIHN0cnVjdHVyZShUKS4KK3Rlcm10YWcoVCwgdGxzdCkgOi0gY29ucyhUKS4KK3Rlcm10YWcoVCwgdGF0bSkgOi0gYXRvbWljKFQpLgordGVybXRhZyhULCB0dmFyKSA6LSB2YXIoVCkuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci96ZWJyYS5pbiBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3plYnJhLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MGQyYWIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL2hvbG1lci96ZWJyYS5pbgpAQCAtMCwwICsxIEBACis6LSAnJGJlbmNobWFyaycoemVicmEsIDEwMDAsIG1haW4sICckZHVtbXknKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3plYnJhLnBsIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9ob2xtZXIvemVicmEucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFjZGQwZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvaG9sbWVyL3plYnJhLnBsCkBAIC0wLDAgKzEsNDkgQEAKKy8qIENIQU5HRUxPRyBieSBNLkJhbmJhcmEKKyAgIC0gY29tbWVudCBwcmludF9ob3VzZXMvMSBvdXQuCisqLworCisKKyUgV2hlcmUgZG9lcyB0aGUgemVicmEgbGl2ZT8KKyUgUHV6emxlIHNvbHV0aW9uIHdyaXR0ZW4gYnkgQ2xhdWRlIFNhbW11dC4KK21haW4gOi0KKwlob3VzZXMoSG91c2VzKSwKKwltZW1iZXIoaG91c2UocmVkLCBlbmdsaXNoLCBfLCBfLCBfKSwgSG91c2VzKSwKKwltZW1iZXIoaG91c2UoXywgc3BhbmlzaCwgZG9nLCBfLCBfKSwgSG91c2VzKSwKKwltZW1iZXIoaG91c2UoZ3JlZW4sIF8sIF8sIGNvZmZlZSwgXyksIEhvdXNlcyksCisJbWVtYmVyKGhvdXNlKF8sIHVrcmFpbmlhbiwgXywgdGVhLCBfKSwgSG91c2VzKSwKKwlyaWdodF9vZihob3VzZShncmVlbixfLF8sXyxfKSwgaG91c2UoaXZvcnksXyxfLF8sXyksIEhvdXNlcyksCisJbWVtYmVyKGhvdXNlKF8sIF8sIHNuYWlscywgXywgd2luc3RvbnMpLCBIb3VzZXMpLAorCW1lbWJlcihob3VzZSh5ZWxsb3csIF8sIF8sIF8sIGtvb2xzKSwgSG91c2VzKSwKKwlIb3VzZXMgPSBbXywgXywgaG91c2UoXywgXywgXywgbWlsaywgXyksIF8sX10sCisJSG91c2VzID0gW2hvdXNlKF8sIG5vcndlZ2lhbiwgXywgXywgXyl8X10sCisJbmV4dF90byhob3VzZShfLF8sXyxfLGNoZXN0ZXJmaWVsZHMpLCBob3VzZShfLF8sZm94LF8sXyksIEhvdXNlcyksCisJbmV4dF90byhob3VzZShfLF8sXyxfLGtvb2xzKSwgaG91c2UoXyxfLGhvcnNlLF8sXyksIEhvdXNlcyksCisJbWVtYmVyKGhvdXNlKF8sIF8sIF8sIG9yYW5nZV9qdWljZSwgbHVja3lfc3RyaWtlcyksIEhvdXNlcyksCisJbWVtYmVyKGhvdXNlKF8sIGphcGFuZXNlLCBfLCBfLCBwYXJsaWFtZW50cyksIEhvdXNlcyksCisJbmV4dF90byhob3VzZShfLG5vcndlZ2lhbixfLF8sXyksIGhvdXNlKGJsdWUsXyxfLF8sXyksIEhvdXNlcyksCisJbWVtYmVyKGhvdXNlKF8sIF8sIHplYnJhLCBfLCBfKSwgSG91c2VzKSwKKwltZW1iZXIoaG91c2UoXywgXywgXywgd2F0ZXIsIF8pLCBIb3VzZXMpLgorCSVwcmludF9ob3VzZXMoSG91c2VzKS4KKworaG91c2VzKFsKKwlob3VzZShfLCBfLCBfLCBfLCBfKSwKKwlob3VzZShfLCBfLCBfLCBfLCBfKSwKKwlob3VzZShfLCBfLCBfLCBfLCBfKSwKKwlob3VzZShfLCBfLCBfLCBfLCBfKSwKKwlob3VzZShfLCBfLCBfLCBfLCBfKQorXSkuCisKK3JpZ2h0X29mKEEsIEIsIFtCLCBBIHwgX10pLgorcmlnaHRfb2YoQSwgQiwgW18gfCBZXSkgOi0gcmlnaHRfb2YoQSwgQiwgWSkuCisKK25leHRfdG8oQSwgQiwgW0EsIEIgfCBfXSkuCituZXh0X3RvKEEsIEIsIFtCLCBBIHwgX10pLgorbmV4dF90byhBLCBCLCBbXyB8IFldKSA6LSBuZXh0X3RvKEEsIEIsIFkpLgorCittZW1iZXIoWCwgW1h8X10pLgorbWVtYmVyKFgsIFtffFldKSA6LSBtZW1iZXIoWCwgWSkuCisKK3ByaW50X2hvdXNlcyhbQXxCXSkgOi0gISwKKwl3cml0ZShBKSwgbmwsCisJcHJpbnRfaG91c2VzKEIpLgorcHJpbnRfaG91c2VzKFtdKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvbWluZXJ2YS9NYWtlZmlsZSBiL2V4YW1wbGVzL2JlbmNobWFya3MvbWluZXJ2YS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODEzMjcyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9taW5lcnZhL01ha2VmaWxlCkBAIC0wLDAgKzEsOTcgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIE1ha2VmaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitQTENBRkUgICAgICAgPSBwbGNhZmUKK1BMQ0FGRU9QVFMgICA9CitQTEpBUiAgICAgICAgPSBwbGphcgorUExKQVJPUFRTICAgID0gLXYKKworU0lDU1RVUyAgICAgID0gL3Vzci9sb2NhbC9iaW4vc2ljc3R1cworU0lDU1RVU09QVFMgID0gCisKK1NXSSAgICAgICAgICA9IC9vcHQvbG9jYWwvYmluL3N3aXBsCitTV0lPUFRTICAgICAgPSAtTDEwMG0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAucWwgLnFsZiAuamFyIC5wbCAuc2ljc3R1cyAuc3dpIC5wbGNhZmUgLmluICQoU1VGRklYRVMpCisKK3BsY2FmZTogY29tcF9wbGNhZmUgcnVuX3BsY2FmZQorCitzaWNzdHVzOiBjb21wX3NpY3N0dXMgcnVuX3NpY3N0dXMKKworc3dpOiBjb21wX3N3aSBydW5fc3dpCisKK2FsbDogY29tcCBydW4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBydW4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3BsY2FmZV9vdXRfb2JqZWN0cyAgOj0gJChwYXRzdWJzdCAlLmluLCUucGxjYWZlLCAkKHdpbGRjYXJkICouaW4pKQorc2ljc3R1c19vdXRfb2JqZWN0cyA6PSAkKHBhdHN1YnN0ICUuaW4sJS5zaWNzdHVzLCQod2lsZGNhcmQgKi5pbikpCitzd2lfb3V0X29iamVjdHMgICAgIDo9ICQocGF0c3Vic3QgJS5pbiwlLnN3aSwgICAgJCh3aWxkY2FyZCAqLmluKSkKKworLmluLnBsY2FmZToKKwktcm0gLWYgb3V0LyRACisJL2Jpbi9lY2hvICJbJyQ8J10sIGhhbHQuIiBcCisJfCAkKFBMQ0FGRSkgJChQTENBRkVPUFRTKSAtY3AgJCouamFyOmJlbmNoX3V0aWwuamFyID4gb3V0LyRACisKKy5pbi5zaWNzdHVzOgorCS1ybSAtZiBvdXQvJEAKKwkvYmluL2VjaG8gImVuc3VyZV9sb2FkZWQoJCopLCBlbnN1cmVfbG9hZGVkKGJlbmNoX3V0aWwpLCBbJyQ8J10sIGhhbHQuIiBcCisJfCAkKFNJQ1NUVVMpICQoU0lDU1RVU09QVFMpID4gb3V0LyRACisKKy5pbi5zd2k6CisJLXJtIC1mIG91dC8kQAorCS9iaW4vZWNobyAiZW5zdXJlX2xvYWRlZCgkKiksIGVuc3VyZV9sb2FkZWQoYmVuY2hfdXRpbCksIFsnJDwnXSwgaGFsdC4iIFwKKwl8ICQoU1dJKSAkKFNXSU9QVFMpID4gb3V0LyRACisKK3J1bjogcnVuX3BsY2FmZSBydW5fc2ljc3R1cyBydW5fc3dpCisKK3J1bl9wbGNhZmU6ICQocGxjYWZlX291dF9vYmplY3RzKQorCitydW5fc2ljc3R1czogJChzaWNzdHVzX291dF9vYmplY3RzKQorCitydW5fc3dpOiAkKHN3aV9vdXRfb2JqZWN0cykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBjb21waWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitqYXJfb2JqZWN0cyA6PSAkKHBhdHN1YnN0ICUucGwsJS5qYXIsJCh3aWxkY2FyZCAqLnBsKSkKK3FsX29iamVjdHMgIDo9ICQocGF0c3Vic3QgJS5wbCwlLnFsLCAkKHdpbGRjYXJkICoucGwpKQorcWxmX29iamVjdHMgOj0gJChwYXRzdWJzdCAlLnBsLCUucWxmLCQod2lsZGNhcmQgKi5wbCkpCisKKy5wbC5qYXI6CisJJChQTEpBUikgJChQTEpBUk9QVFMpICRAICQ8CisJLXJtIC1mIC1yICQqCisKKy5wbC5xbDoKKwkvYmluL2VjaG8gIlskKl0sIGZjb21waWxlKCQqKSwgaGFsdC4iIHwgJChTSUNTVFVTKSAkKFNJQ1NUVVNPUFRTKQorCisucGwucWxmOgorCS9iaW4vZWNobyAicWNvbXBpbGUoJCopLCBoYWx0LiIgfCAkKFNXSSkgJChTV0lPUFRTKQorIwkvYmluL2VjaG8gIlskKl0sIHFjb21waWxlKCQqKSwgaGFsdC4iIHwgJChTV0kpICQoU1dJT1BUUykKKworY29tcDogY29tcF9wbGNhZmUgY29tcF9zaWNzdHVzIGNvbXBfc3dpCisKK2NvbXBfcGxjYWZlOiAkKGphcl9vYmplY3RzKQorCitjb21wX3NpY3N0dXM6ICQocWxfb2JqZWN0cykKKworY29tcF9zd2k6ICQocWxmX29iamVjdHMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgY2xlYW4gdXAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2NsZWFuOgorCS1ybSAtZiBjb3JlICp+CisJLXJtIC1mIC9vdXQvY29yZSBvdXQvKn4KKwktcm0gLWYgKi5xbAorCS1ybSAtZiAqLnFsZgorCityZWFsY2xlYW46IGNsZWFuCisJLXJtIC1mICouamFyICouY2xhc3MKKwktcm0gLWYgb3V0LyoucGxjYWZlIG91dC8qLnNpY3N0dXMgb3V0Lyouc3dpCisKKyMgRU5ECisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvbWluZXJ2YS9iZW5jaF91dGlsLnBsIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9taW5lcnZhL2JlbmNoX3V0aWwucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5MDk2MgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvbWluZXJ2YS9iZW5jaF91dGlsLnBsCkBAIC0wLDAgKzEsNDcgQEAKKyUgICBGaWxlICAgOiBiZW5jaF91dGlsLnBsCislICAgQXV0aG9yczogTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorJSAgIFVwZGF0ZWQ6IDI0IEZlYnJ1YXJ5IDIwMDgKKyUgICBQdXJwb3NlOiBCZW5jaG1hcmsgdXRpbGl0aWVzCislICAgTm90ZSAgIDogYmFzZWQgb24gZHJpdmVyLnBsIGluIFBlcmVpcmEncyBiZW5jaG1hcmsKKworJyRnZXRfY3B1X3RpbWUnKFQpIDotIHN0YXRpc3RpY3MocnVudGltZSwgW1QsX10pLgorCisnJHJlcG9ydCcoTmFtZSwgTiwgVDAsIFQxLCBUMikgOi0KKyAgICAgICAgVGVzdFRpbWUgaXMgVDEtVDAsCisgICAgICAgIE92ZXJIZWFkIGlzIFQyLVQxLAorCVRpbWUgaXMgVGVzdFRpbWUtT3ZlckhlYWQsCisgICAgICAgIEF2ZXJhZ2UgaXMgVGltZS9OLAorCW5sLAorCXdyaXRlKCcjIE5hbWU6ICcpLCB3cml0ZShOYW1lKSwgbmwsCisgICAgICAgIHdyaXRlKCcjIEl0ZXJhdGlvbnM6ICcpLCB3cml0ZShOKSwgbmwsCisJd3JpdGUoJyMgVGVzdFRpbWU6ICcpLCB3cml0ZShUZXN0VGltZSksIHdyaXRlKCcgbXNlYy5cbicpLAorCXdyaXRlKCcjIE92ZXJIZWFkOiAnKSwgd3JpdGUoT3ZlckhlYWQpLCB3cml0ZSgnIG1zZWMuXG4nKSwKKwl3cml0ZSgnIyBUZXN0VGltZS1PdmVySGVhZDogJyksIHdyaXRlKFRpbWUpLCB3cml0ZSgnIG1zZWMuXG4nKSwKKwl3cml0ZSgnIyAoVGVzdFRpbWUtT3ZlckhlYWQpL0l0ZXJhdGlvbnM6ICcpLCB3cml0ZShBdmVyYWdlKSwgd3JpdGUoJyBtc2VjLlxuJyksCisJJyRyZXBvcnRfY3N2JyhbJyMjI0NTViMjIycsTmFtZSxOLFRlc3RUaW1lLE92ZXJIZWFkLFRpbWUsQXZlcmFnZV0sICcsJyksCisJbmwuCisKKyckcmVwb3J0X2NzdicoW10sIF8pIDotICEuCisnJHJlcG9ydF9jc3YnKFtYXSwgXykgOi0gISwgd3JpdGUoWCksIG5sLgorJyRyZXBvcnRfY3N2JyhbWHxYc10sIERlbGltKSA6LSB3cml0ZShYKSwgd3JpdGUoRGVsaW0pLCAnJHJlcG9ydF9jc3YnKFhzLCBEZWxpbSkuCisKKyckYmVuY2htYXJrJyhOYW1lLCBJdGVyYXRpb25zLCBBY3Rpb24sIENvbnRyb2wpIDotIAorICAgICAgICAnJGdldF9jcHVfdGltZScoVDApLAorICAgICAgICAoICAgJyRyZXBlYXQnKEl0ZXJhdGlvbnMpLCBvbmNlKEFjdGlvbiksIGZhaWwKKyAgICAgICAgOyAgICckZ2V0X2NwdV90aW1lJyhUMSkKKyAgICAgICAgKSwKKyAgICAgICAgKCAgICckcmVwZWF0JyhJdGVyYXRpb25zKSwgb25jZShDb250cm9sKSwgZmFpbAorICAgICAgICA7ICAgJyRnZXRfY3B1X3RpbWUnKFQyKQorICAgICAgICApLAorICAgICAgICAnJHJlcG9ydCcoTmFtZSwgSXRlcmF0aW9ucywgVDAsIFQxLCBUMikuCisKKyckcmVwZWF0JyhOKSA6LSBOID4gMCwgJyRmcm9tJygxLCBOKS4KKworJyRmcm9tJyhJLCBJKSA6LSAhLgorJyRmcm9tJyhMLCBVKSA6LSBNIGlzIChMK1UpPj4xLCAgICckZnJvbScoTCwgTSkuCisnJGZyb20nKEwsIFUpIDotIE0gaXMgKEwrVSk+PjErMSwgJyRmcm9tJyhNLCBVKS4KKworJyRkdW1teScuCisnJGR1bW15JyhfKS4KKyckZHVtbXknKF8sIF8pLgorJyRkdW1teScoXywgXywgXykuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL21pbmVydmEvbXJwX2FuZF9tcnMuaW4gYi9leGFtcGxlcy9iZW5jaG1hcmtzL21pbmVydmEvbXJwX2FuZF9tcnMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4MGEyOQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvbWluZXJ2YS9tcnBfYW5kX21ycy5pbgpAQCAtMCwwICsxLDMgQEAKKzotICckYmVuY2htYXJrJygnTXJQYW5kTXJTJywgMTAsIHBzLCAnJGR1bW15JykuCisKKwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9taW5lcnZhL21ycF9hbmRfbXJzLnBsIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9taW5lcnZhL21ycF9hbmRfbXJzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMDg1NmQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL21pbmVydmEvbXJwX2FuZF9tcnMucGwKQEAgLTAsMCArMSw1OSBAQAorLyogQ0hBTkdFTE9HIGJ5IE0uQmFuYmFyYQorICAtIGZvci8zIGlzIGFkZGVkLgorICAtIGNvbW1lbnQgb3V0IHdyaXRlLzEsIG5sLzAuCisqLworCislIEZpbGUgICA6IE1yUF9hbmRfTXJTLnBsCislIEF1dGhvcnM6IElGIENvbXB1dGVyCislIFB1cnBvc2U6ICBNYXJ0aW4gTmlsc3NvbidzIE1yLiBQIGFuZCBNci4gUyBwcm9ibGVtCislIE5vdGVzICA6IGh0dHA6Ly93d3cuaWZjb21wdXRlci5jb20vTUlORVJWQS9FeGFtcGxlUHJvZ3JhbXMvQmVuY2htYXJrcy9NclBhbmRNclMvaG9tZV9qcC5odG1sCisKKyVwcyAgOi0gdyhvMSwgXywgWCksIHdyaXRlKFgpLCBubC4KK3BzICA6LSB3KG8xLCBfLCBYKS4KKwordyhzMSwgKEksSiksIChNLE4pKSA6LQorCWZvcigyLCBNLCA5OSksCisJZm9yKDIsIE4sIE0pLAorCU0rTiA9Oj0gSStKLgordyhwMSwgKEksSiksIChNLE4pKSA6LQorCWZvcigyLCBNLCA5OSksCisJZm9yKDIsIE4sIE0pLAorCU0qTiA9Oj0gSSpKLgordyhzMiwgUywgWCkgOi0gdyhzMSwgUywgWCksIHAzKFgpLgordyhwMiwgUywgWCkgOi0gdyhwMSwgUywgWCksIHA0KFgpLgordyhzMywgUywgWCkgOi0gdyhzMiwgUywgWCksIHA1KFgpLgordyhvMSwgXywgKE0sTikpIDotCisJZm9yKDIsIE0sIDk5KSwgZm9yKDIsIE4sIE0pLCAld3JpdGUoKE0sTikpLCBubCwKKwlwMygoTSxOKSksICV3cml0ZShwMyksIG5sLAorCXA0KChNLE4pKSwgJXdyaXRlKHA0KSwgbmwsCisJcDUoKE0sTikpLCAld3JpdGUocDUpLCBubCwKKwlwNigoTSxOKSkuICV3cml0ZShwNiksIG5sLgorCitwMyhYKSA6LSBoYXNfdHdvX29yX21vcmVfc29sdXRpb25zKHcocDEsWCxfKSkuCitwNChYKSA6LSBoYXNfdHdvX29yX21vcmVfc29sdXRpb25zKHcoczIsWCxfKSksCisJYWxsX2luX2FyZShaLCAodyhzMSxYLFcpLHZhbHVlKHAzKFcpLFopKSx0cnVlKS4KK3A1KFgpIDotIGhhc19leGFjdGx5X29uZV9zb2x1dGlvbih3KHAyLFgsXykpLgorcDYoWCkgOi0gaGFzX2V4YWN0bHlfb25lX3NvbHV0aW9uKHcoczMsWCxfKSkuCisKK3ZhbHVlKFgsVikgOi0gKFgsIFY9dHJ1ZTsgVj1mYWxzZSksICEuCisKK2FsbF9pbl9hcmUoWCxHLFopIDotIFwrICgoRyxYIFw9IFopKSwgIS4KKworaGFzX2V4YWN0bHlfb25lX3NvbHV0aW9uKFgpIDotIAorCWNvcHlfdGVybShYLCBYMiksCisJWCwKKwlhbGxfaW5fYXJlKFgyLCBYMiwgWCksIAorCSEuCisKK2hhc190d29fb3JfbW9yZV9zb2x1dGlvbnMoWCkgOi0gCisJY29weV90ZXJtKFgsIFgyKSwKKwlYLAorCSEsCisJWDIsCisJWCBcPSBYMiwKKwkhLgorCitmb3IoTSwgSSwgTikgOi0gTSA9PCBOLCBJPU0uCitmb3IoTSwgSSwgTikgOi0gTSA9PCBOLCBNMSBpcyBNKzEsIGZvcihNMSwgSSwgTikuCisKKwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9wZXJlaXJhL01ha2VmaWxlIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9wZXJlaXJhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZjg3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL3BlcmVpcmEvTWFrZWZpbGUKQEAgLTAsMCArMSw5NSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgTWFrZWZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK1BMQ0FGRSAgICAgICA9IHBsY2FmZQorUExDQUZFT1BUUyAgID0gLUogJy1YbXg1MDBtJworUExKQVIgICAgICAgID0gcGxqYXIKK1BMSkFST1BUUyAgICA9IC12IC1KICctWG14MTAwbScgLUMgJy1KLVhteDMwMG0nCisKK1NJQ1NUVVMgICAgICA9IC91c3IvbG9jYWwvYmluL3NpY3N0dXMKK1NJQ1NUVVNPUFRTICA9IAorCitTV0kgICAgICAgICAgPSAvb3B0L2xvY2FsL2Jpbi9zd2lwbAorU1dJT1BUUyAgICAgID0gLUwxMDBtCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5xbCAucWxmIC5qYXIgLnBsIC5zaWNzdHVzIC5zd2kgLnBsY2FmZSAuaW4gJChTVUZGSVhFUykKKworcGxjYWZlOiBjb21wX3BsY2FmZSBydW5fcGxjYWZlCisKK3NpY3N0dXM6IGNvbXBfc2ljc3R1cyBydW5fc2ljc3R1cworCitzd2k6IGNvbXBfc3dpIHJ1bl9zd2kKKworYWxsOiBjb21wIHJ1bgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHJ1bgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworcGxjYWZlX291dF9vYmplY3RzICA6PSAkKHBhdHN1YnN0ICUuaW4sJS5wbGNhZmUsICQod2lsZGNhcmQgKi5pbikpCitzaWNzdHVzX291dF9vYmplY3RzIDo9ICQocGF0c3Vic3QgJS5pbiwlLnNpY3N0dXMsJCh3aWxkY2FyZCAqLmluKSkKK3N3aV9vdXRfb2JqZWN0cyAgICAgOj0gJChwYXRzdWJzdCAlLmluLCUuc3dpLCAgICAkKHdpbGRjYXJkICouaW4pKQorCisuaW4ucGxjYWZlOgorCS1ybSAtZiBvdXQvJEAKKwkvYmluL2VjaG8gIlsnJDwnXSwgaGFsdC4iIFwKKwl8ICQoUExDQUZFKSAkKFBMQ0FGRU9QVFMpIC1jcCAkKi5qYXIgPiBvdXQvJEAKKworLmluLnNpY3N0dXM6CisJLXJtIC1mIG91dC8kQAorCS9iaW4vZWNobyAiZW5zdXJlX2xvYWRlZCgkKiksIFsnJDwnXSwgaGFsdC4iIFwKKwl8ICQoU0lDU1RVUykgJChTSUNTVFVTT1BUUykgPiBvdXQvJEAKKworLmluLnN3aToKKwktcm0gLWYgb3V0LyRACisJL2Jpbi9lY2hvICJlbnN1cmVfbG9hZGVkKCQqKSwgWyckPCddLCBoYWx0LiIgXAorCXwgJChTV0kpICQoU1dJT1BUUykgPiBvdXQvJEAKKworcnVuOiBydW5fcGxjYWZlIHJ1bl9zaWNzdHVzIHJ1bl9zd2kKKworcnVuX3BsY2FmZTogJChwbGNhZmVfb3V0X29iamVjdHMpCisKK3J1bl9zaWNzdHVzOiAkKHNpY3N0dXNfb3V0X29iamVjdHMpCisKK3J1bl9zd2k6ICQoc3dpX291dF9vYmplY3RzKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGNvbXBpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2phcl9vYmplY3RzIDo9ICQocGF0c3Vic3QgJS5wbCwlLmphciwkKHdpbGRjYXJkICoucGwpKQorcWxfb2JqZWN0cyAgOj0gJChwYXRzdWJzdCAlLnBsLCUucWwsICQod2lsZGNhcmQgKi5wbCkpCitxbGZfb2JqZWN0cyA6PSAkKHBhdHN1YnN0ICUucGwsJS5xbGYsJCh3aWxkY2FyZCAqLnBsKSkKKworLnBsLmphcjoKKwkkKFBMSkFSKSAkKFBMSkFST1BUUykgJEAgJDwKKwktcm0gLWYgLXIgJCoKKworLnBsLnFsOgorCS9iaW4vZWNobyAiWyQqXSwgZmNvbXBpbGUoJCopLCBoYWx0LiIgfCAkKFNJQ1NUVVMpICQoU0lDU1RVU09QVFMpCisKKy5wbC5xbGY6CisJL2Jpbi9lY2hvICJxY29tcGlsZSgkKiksIGhhbHQuIiB8ICQoU1dJKSAkKFNXSU9QVFMpCisKK2NvbXA6IGNvbXBfcGxjYWZlIGNvbXBfc2ljc3R1cyBjb21wX3N3aQorCitjb21wX3BsY2FmZTogJChqYXJfb2JqZWN0cykKKworY29tcF9zaWNzdHVzOiAkKHFsX29iamVjdHMpCisKK2NvbXBfc3dpOiAkKHFsZl9vYmplY3RzKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGNsZWFuIHVwCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitjbGVhbjoKKwktcm0gLWYgY29yZSAqfgorCS1ybSAtZiAvb3V0L2NvcmUgb3V0Lyp+CisJLXJtIC1mICoucWwKKwktcm0gLWYgKi5xbGYKKworcmVhbGNsZWFuOiBjbGVhbgorCS1ybSAtZiAqLmphciAqLmNsYXNzCisJLXJtIC1mIG91dC8qLnBsY2FmZSBvdXQvKi5zaWNzdHVzIG91dC8qLnN3aQorCisjIEVORAorCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL3BlcmVpcmEvcGVyZWlyYS5pbiBiL2V4YW1wbGVzL2JlbmNobWFya3MvcGVyZWlyYS9wZXJlaXJhLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YWYxNjEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL3BlcmVpcmEvcGVyZWlyYS5pbgpAQCAtMCwwICsxLDIgQEAKKzotIGJlbmNoZXMuCisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvcGVyZWlyYS9wZXJlaXJhLnBsIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9wZXJlaXJhL3BlcmVpcmEucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3NzlkNwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvcGVyZWlyYS9wZXJlaXJhLnBsCkBAIC0wLDAgKzEsMTg3MyBAQAorJSUlIEZlcm5hbmRvIFBlcmVpcmEncyBiZW5jaG1hcmtzICgyNi1ERUMtODYpCisKKy8qIAorIENIQU5HRUxPRyBieSBNLkJhbmJhcmEgCisgICAtIGFib2xpc2gvMiAtLT4gIGFib2xpc2gvMQorICAgLSBkeW5hbWljIGRpeC8yIGlzIGFkZC4KKyAgIC0gZHluYW1pYyB1YS8zIGlzIGFkZC4KKyAgIC0gb3AoMTE1MCxmeCwocHVibGljKSkgaXMgYWRkZWQuCisgICAtIG9wKDExNTAsZngsKG1vZGUpKSBpcyBhZGRlZC4KKyAgIC0gcmVwb3J0LzQgLS0+IHJlcG9ydC81CisgICAtIGJlbmNoX21hcmsvMSBpcyBtb2RpZmllZC4KKyovCis6LSBkeW5hbWljIGRpeC8yLgorOi0gZHluYW1pYyB1YS8zLgorOi0gb3AoMTE1MCwgZngsIChwdWJsaWMpKS4KKzotIG9wKDExNTAsIGZ4LCAobW9kZSkpLgorCisvKiBJJ3ZlIHJlY2VpdmVkIHNldmVyYWwgcmVxdWVzdHMgZm9yIHRoZSBiZW5jaG1hcmtzIHRoYXQgd2VyZSB1c2VkIGluCit0aGUgSnVuZSBpc3N1ZSBvZiBBSSBFeHBlcnQuIFRoZSBwdXJwb3NlIG9mIHRoZXNlIGJlbmNobWFya3MgaXMgdG8gdHJ5Cit0byBpZGVudGlmeSBzdHJlbmd0aHMgYW5kIHdlYWtuZXNzZXMgaW4gdGhlIGJhc2ljIGVuZ2luZSBvZiBhIFByb2xvZworc3lzdGVtLiAgSW4gcGFydGljdWxhciwgSSB0cnkgdG8gc2VwYXJhdGUgY29zdHMgbm9ybWFseSBjb25mbGF0ZWQgaW4KK290aGVyIGJlbmNobWFyayBzdWl0ZXMsIHN1Y2ggYXMgcHJvY2VkdXJlIGNhbGwgY29zdCwgdGVybSBtYXRjaGluZyBhbmQKK3Rlcm0gY29uc3RydWN0aW9uIGNvc3RzIGFuZCB0aGUgY29zdHMgb2YgdGFpbCBjYWxscyB2cy4gbm9udGFpbCBjYWxscy4KK0knbSBzdXJlIHRoZSBiZW5jaG1hcmtzIGNvdWxkIGJlIGltcHJvdmVkLCBidXQgSSBkb24ndCBoYXZlIHRpbWUgdG8KK3dvcmsgb24gdGhlbSByaWdodCBub3cuIEFsc28sIEkgbXVzdCBzYXkgdGhhdCBJIGhhdmUgcmVsYXRpdmVseSBsaXR0bGUKK2ZhaXRoIG9uIHNtYWxsIGJlbmNobWFyayBwcm9ncmFtcy4gSSBmaW5kIHRoYXQgcGVyZm9ybWFuY2UgKGJvdGggdGltZQorYW5kIHNwYWNlKSBvbiBzdWJzdGFudGlhbCBwcm9ncmFtcywgcmVsaWFiaWxpdHksIGFkaGVyZW5jZSB0byBkZSBmYWN0bworc3RhbmRhcmRzIGFuZCBlYXNlIG9mIHVzZSBhcmUgZmFyIG1vcmUgaW1wb3J0YW50IGluIHByYWN0aWNlLiBJJ3ZlCit0cmllZCBzZXZlcmFsIFByb2xvZyBzeXN0ZW1zIHRoYXQgcGVyZm9ybWVkIHZlcnkgd2VsbCBvbiBzbWFsbAorYmVuY2htYXJrcyAoaW5jbHVkaW5nIG1pbmUpLCBidXQgdGhhdCBmYWlsZWQgYmFkbHkgb24gb25lIG9yIG1vcmUgb2YKK3RoZXNlIGNyaXRlcmlhLgorCitTb21lIG9mIHRoZSBiZW5jaG1hcmtzIGFyZSBpbnNwaXJlZCBvbiBhIGJlbmNobWFyayBzdWl0ZSBkZXZlbG9wZWQgYXQKK0lDT1QgZm9yIHRoZWlyIFNJTSBwcm9qZWN0LCBhbmQgb3RoZXIgYmVuY2htYXJrIGNob2ljZXMgd2VyZQoraW5mbHVlbmNlZCBieSBkaXNjdXNzaW9ucyB3aXRoIElDT1QgcmVzZWFyY2hlcnMgb24gdGhlIHJlbGF0aXZlCitwZXJmb3JtYW5jZSBvZiBTSU0tSSB2cy4gIFByb2xvZy0yMC4KKworLS0gRmVybmFuZG8gUGVyZWlyYQorKi8KKworJSAgIEZpbGUgICA6IGRyaXZlci5wbAorJSAgIEF1dGhvciA6IFJpY2hhcmQgTydLZWVmZSBiYXNlZCBvbiBlYXJsaWVyIHZlcnNpb25zIGR1ZSB0bworJSAgICAgICAgICAgIFBhdWwgV2lsaywgRmVybmFuZG8gUGVyZWlyYSwgRGF2aWQgV2FycmVuIGV0IGFsLgorJSAgIFVwZGF0ZWQ6IDI5IERlY2VtYmVyIDE5ODYKKyUgICBEZWZpbmVzOiBmcm9tLzMgYW5kIGdldF9jcHVfdGltZS8xLgorJSAgIFZlcnNpb246IERlYy0xMCBQcm9sb2cgJiBRdWludHVzIFByb2xvZy4KKworOi0gcHVibGljCisgICAgICAgIGZyb20vMywKKyAgICAgICAgZ2V0X2NwdV90aW1lLzEuCisKKzotIG1vZGUKKyAgICAgICAgZnJvbSgrLCArLCAtKSwKKyAgICAgICAgZ2V0X2NwdV90aW1lKC0pLgorCislICAgZnJvbShMb3dlckJvdW5kLCBVcHBlckJvdW5kLCBJKQorJSAgIGJpbmRzIEkgdG8gc3VjY2Vzc2l2ZSBpbnRlZ2VycyBpbiB0aGUgcmFuZ2UgTG93ZXJCb3VuZC4uVXBwZXJCb3VuZC4KKyUgICBJdCBpcyBkZXNpZ25lZCBzb2xlbHkgZm9yIHVzZSBpbiB0aGlzIGFwcGxpY2F0aW9uOyBmb3IgYSBnZW5lcmFsCislICAgd2F5IG9mIGRvaW5nIHRoaXMgdXNlIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IHByZWRpY2F0ZSBiZXR3ZWVuLzMsIG9yCislICAgcGVyaGFwcyByZXBlYXQvMS4KKworZnJvbShJLCBJLCBJKSA6LSAhLgorZnJvbShMLCBVLCBJKSA6LSBNIGlzIChMK1UpID4+IDEsICAgICAgIGZyb20oTCwgTSwgSSkuCitmcm9tKEwsIFUsIEkpIDotIE0gaXMgKEwrVSkgPj4gMSArIDEsICAgZnJvbShNLCBVLCBJKS4KKworCislICAgZ2V0X2NwdV90aW1lKFQpCislICAgdW5pZmllcyBUIHdpdGggdGhlIHJ1biB0aW1lIHNpbmNlIHN0YXJ0LXVwIGluIG1pbGxpc2Vjb25kcy4KKyUgICAoV2UgY2FuJ3QgdXNlIHRoZSBzZWNvbmQgZWxlbWVudCBvZiB0aGUgbGlzdCwgYXMgc29tZSBvZiB0aGUKKyUgICB0ZXN0cyB3aWxsIGNhbGwgc3RhdGlzdGljcy8yIGFuZCByZXNldCBpdC4pCisKK2dldF9jcHVfdGltZShUKSA6LQorICAgICAgICBzdGF0aXN0aWNzKHJ1bnRpbWUsIFtULF9dKS4KKworCislICAgcmVwb3J0KE4sIFQwLCBUMSwgVDIpCislICAgdGFrZXMgdGhlIHRocmVlIHRpbWVzIHlpZWxkZWQgYnkgZ2V0X2NwdV90aW1lIGFuZCB0aGUgbnVtYmVyCislICAgb2YgaXRlcmF0aW9ucyBhbmQgcHJpbnRzIHRoZSB0b3RhbCwgb3ZlcmhlYWQsIGFuZCBhdmVyYWdlLgorCislcmVwb3J0KE4sIFQwLCBUMSwgVDIpIDotCislICAgICAgICBUZXN0VGltZSBpcyBUMS1UMCwKKyUgICAgICAgIE92ZXJIZWFkIGlzIFQyLVQxLAorJSAgICAgICAgQXZlcmFnZSAgaXMgKFRlc3RUaW1lLU92ZXJIZWFkKS9OLAorJSAgICAgICAgd3JpdGUoKFRlc3RUaW1lLU92ZXJIZWFkKS9OPUF2ZXJhZ2UpLAorJSAgICAgICAgd3JpdGUoJyBtaWxsaS1zZWNvbmRzL2l0ZXJhdGlvbicpLCBubC4KKworcmVwb3J0KE5hbWUsIE4sIFQwLCBUMSwgVDIpIDotCisgICAgICAgIFRlc3RUaW1lIGlzIFQxLVQwLAorICAgICAgICBPdmVySGVhZCBpcyBUMi1UMSwKKwlUaW1lIGlzIFRlc3RUaW1lLU92ZXJIZWFkLAorICAgICAgICBBdmVyYWdlIGlzIFRpbWUvTiwKKwlubCwKKwl3cml0ZSgnIyBOYW1lOiAnKSwgd3JpdGUoTmFtZSksIG5sLAorICAgICAgICB3cml0ZSgnIyBJdGVyYXRpb25zOiAnKSwgd3JpdGUoTiksIG5sLAorCXdyaXRlKCcjIFRlc3RUaW1lOiAnKSwgd3JpdGUoVGVzdFRpbWUpLCB3cml0ZSgnIG1zZWMuXG4nKSwKKwl3cml0ZSgnIyBPdmVySGVhZDogJyksIHdyaXRlKE92ZXJIZWFkKSwgd3JpdGUoJyBtc2VjLlxuJyksCisJd3JpdGUoJyMgVGVzdFRpbWUtT3ZlckhlYWQ6ICcpLCB3cml0ZShUaW1lKSwgd3JpdGUoJyBtc2VjLlxuJyksCisJd3JpdGUoJyMgKFRlc3RUaW1lLU92ZXJIZWFkKS9JdGVyYXRpb25zOiAnKSwgd3JpdGUoQXZlcmFnZSksIHdyaXRlKCcgbXNlYy5cbicpLAorCXJlcG9ydF9jc3YoWycjIyNDU1YjIyMnLE5hbWUsTixUZXN0VGltZSxPdmVySGVhZCxUaW1lLEF2ZXJhZ2VdLCAnLCcpLAorCW5sLgorCityZXBvcnRfY3N2KFtdLCBfKSA6LSAhLgorcmVwb3J0X2NzdihbWF0sIF8pIDotICEsIHdyaXRlKFgpLCBubC4KK3JlcG9ydF9jc3YoW1h8WHNdLCBEZWxpbSkgOi0gd3JpdGUoWCksIHdyaXRlKERlbGltKSwgcmVwb3J0X2NzdihYcywgRGVsaW0pLgorCislICAgYmVuY2hfbWFyayhOYW1lKQorJSAgIGlzIHRoZSBuZXcgdG9wIGxldmVsLiAgSXQgY2FsbHMgYmVuY2hfbWFyay80IHRvIGZpbmQgb3V0CislICAgaG93IG1hbnkgSXRlcmF0aW9ucyBvZiB0aGUgQWN0aW9uIGFuZCBpdHMgQ29udHJvbCB0byBwZXJmb3JtLgorJSAgIFRvIGdldCB0aGUgb2xkIGVmZmVjdCwgZG8gc29tZXRoaW5nIGxpa2UKKyUgICBiZW5jaF9tYXJrKG5yZXYsIDUwLCBucmV2KEwpLCBkdW1teShMKSkgOi0gZGF0YShMKS4KKworYmVuY2hfbWFyayhOYW1lKSA6LQorICAgICAgICBiZW5jaF9tYXJrKE5hbWUsIEl0ZXJhdGlvbnMsIEFjdGlvbiwgQ29udHJvbCksCisgICAgICAgIGdldF9jcHVfdGltZShUMCksCisgICAgICAgICggICByZXBlYXQoSXRlcmF0aW9ucyksIGNhbGwoQWN0aW9uKSwgZmFpbAorICAgICAgICA7ICAgZ2V0X2NwdV90aW1lKFQxKQorICAgICAgICApLAorICAgICAgICAoICAgcmVwZWF0KEl0ZXJhdGlvbnMpLCBjYWxsKENvbnRyb2wpLCBmYWlsCisgICAgICAgIDsgICBnZXRfY3B1X3RpbWUoVDIpCisgICAgICAgICksCisgICAgICAgIHJlcG9ydChOYW1lLCBJdGVyYXRpb25zLCBUMCwgVDEsIFQyKS4KKyAgICAgICAgJXdyaXRlKE5hbWUpLCB3cml0ZSgnIHRvb2sgJyksCisgICAgICAgICVyZXBvcnQoSXRlcmF0aW9ucywgVDAsIFQxLCBUMikuCisKKworJSAgIHJlcGVhdChOKQorJSAgIHN1Y2NlZWRzIHByZWNpc2VseSBOIHRpbWVzLgorCityZXBlYXQoTikgOi0KKyAgICAgICAgTiA+IDAsCisgICAgICAgIGZyb20oMSwgTikuCisKK2Zyb20oSSwgSSkgOi0gIS4KK2Zyb20oTCwgVSkgOi0gTSBpcyAoTCtVKT4+MSwgICBmcm9tKEwsIE0pLgorZnJvbShMLCBVKSA6LSBNIGlzIChMK1UpPj4xKzEsIGZyb20oTSwgVSkuCisKKyUgRmlsZSAgIDogYmVuY2hlcy5wbAorJSBBdXRob3IgOiBGZXJuYW5kbyBQZXJlaXJhCislIFVwZGF0ZWQ6IDI5IERlY2VtYmVyIDE5ODYKKyUgRGVmaW5lczogYmVuY2hlcy8wLCBiZW5jaF9tYXJrLzEKKyUgUHVycG9zZToKKyUgSGVyZSBhcmUgYWxsIHRoZSBiZW5jaG1hcmtzLiBTb21lIGFyZSBiYXNlZCBvbiB0aGUgSUNPVCBiZW5jaG1hcmsgc2V0CislICh2ZXJzaW9uIG9mIEphbnVhcnkgMjQsIDE5ODUpLCBvdGhlcnMgYXJlIGRpZmZlcmVudC4gQWxsIHRoZSBiZW5jaG1hcmtzCislIGF0dGVtcHQgdG8gbWVhc3VyZSBqdXN0IG9uZSB0aGluZywgZWcuIGRldGVybWluYXRlIHByb2NlZHVyZSBjYWxsLCBsaXN0CislIGNvbnN0cnVjdGlvbiwgbGlzdCBkZXN0cnVjdGlvbi4KKyUgVG8gcnVuIHRoZSB3aG9sZSBzZXQsIGNhbGwgJ2JlbmNoZXMnLgorCislIERvIGFsbCB0aGUgYmVuY2htYXJrcworCis6LSBwdWJsaWMgYmVuY2hlcy8wLCBiZW5jaF9tYXJrLzEuCisKK2JlbmNoZXMgOi0KKyAgICBiZW5jaF9tYXJrKE5hbWUsIF8sIF8sIF8pLAorICAgIGJlbmNoX21hcmsoTmFtZSksCisgICAgZmFpbC4KK2JlbmNoZXMuCisKKyUgVHJpdmlhbCBwcmVkaWNhdGVzIGZvciB1c2UgaW4gY29udHJvbHMuCisKKzotIHB1YmxpYyBkdW1teS8wLCBkdW1teS8xLCBkdW1teS8yLCBkdW1teS8zLgorCitkdW1teS4KKworZHVtbXkoXykuCisKK2R1bW15KF8sIF8pLgorCitkdW1teShfLCBfLCBfKS4KKworJSBUaGUgYWN0dWFsIGJlbmNoYW1hcmtzCisKKyUgMS4gMTAwIGRldGVybWluYXRlIHRhaWwgY2FsbHMKKworYmVuY2hfbWFyayh0YWlsX2NhbGxfYXRvbV9hdG9tLCAyMDAwMDAsIHAxKGEpLCBkdW1teShhKSkuCisKKzotIHB1YmxpYyBwMS8xLgorCitwMShhKSA6LSBwMihhKS4KK3AyKGEpIDotIHAzKGEpLgorcDMoYSkgOi0gcDQoYSkuCitwNChhKSA6LSBwNShhKS4KK3A1KGEpIDotIHA2KGEpLgorcDYoYSkgOi0gcDcoYSkuCitwNyhhKSA6LSBwOChhKS4KK3A4KGEpIDotIHA5KGEpLgorcDkoYSkgOi0gcDEwKGEpLgorcDEwKGEpIDotIHAxMShhKS4KK3AxMShhKSA6LSBwMTIoYSkuCitwMTIoYSkgOi0gcDEzKGEpLgorcDEzKGEpIDotIHAxNChhKS4KK3AxNChhKSA6LSBwMTUoYSkuCitwMTUoYSkgOi0gcDE2KGEpLgorcDE2KGEpIDotIHAxNyhhKS4KK3AxNyhhKSA6LSBwMTgoYSkuCitwMTgoYSkgOi0gcDE5KGEpLgorcDE5KGEpIDotIHAyMChhKS4KK3AyMChhKSA6LSBwMjEoYSkuCitwMjEoYSkgOi0gcDIyKGEpLgorcDIyKGEpIDotIHAyMyhhKS4KK3AyMyhhKSA6LSBwMjQoYSkuCitwMjQoYSkgOi0gcDI1KGEpLgorcDI1KGEpIDotIHAyNihhKS4KK3AyNihhKSA6LSBwMjcoYSkuCitwMjcoYSkgOi0gcDI4KGEpLgorcDI4KGEpIDotIHAyOShhKS4KK3AyOShhKSA6LSBwMzAoYSkuCitwMzAoYSkgOi0gcDMxKGEpLgorcDMxKGEpIDotIHAzMihhKS4KK3AzMihhKSA6LSBwMzMoYSkuCitwMzMoYSkgOi0gcDM0KGEpLgorcDM0KGEpIDotIHAzNShhKS4KK3AzNShhKSA6LSBwMzYoYSkuCitwMzYoYSkgOi0gcDM3KGEpLgorcDM3KGEpIDotIHAzOChhKS4KK3AzOChhKSA6LSBwMzkoYSkuCitwMzkoYSkgOi0gcDQwKGEpLgorcDQwKGEpIDotIHA0MShhKS4KK3A0MShhKSA6LSBwNDIoYSkuCitwNDIoYSkgOi0gcDQzKGEpLgorcDQzKGEpIDotIHA0NChhKS4KK3A0NChhKSA6LSBwNDUoYSkuCitwNDUoYSkgOi0gcDQ2KGEpLgorcDQ2KGEpIDotIHA0NyhhKS4KK3A0NyhhKSA6LSBwNDgoYSkuCitwNDgoYSkgOi0gcDQ5KGEpLgorcDQ5KGEpIDotIHA1MChhKS4KK3A1MChhKSA6LSBwNTEoYSkuCitwNTEoYSkgOi0gcDUyKGEpLgorcDUyKGEpIDotIHA1MyhhKS4KK3A1MyhhKSA6LSBwNTQoYSkuCitwNTQoYSkgOi0gcDU1KGEpLgorcDU1KGEpIDotIHA1NihhKS4KK3A1NihhKSA6LSBwNTcoYSkuCitwNTcoYSkgOi0gcDU4KGEpLgorcDU4KGEpIDotIHA1OShhKS4KK3A1OShhKSA6LSBwNjAoYSkuCitwNjAoYSkgOi0gcDYxKGEpLgorcDYxKGEpIDotIHA2MihhKS4KK3A2MihhKSA6LSBwNjMoYSkuCitwNjMoYSkgOi0gcDY0KGEpLgorcDY0KGEpIDotIHA2NShhKS4KK3A2NShhKSA6LSBwNjYoYSkuCitwNjYoYSkgOi0gcDY3KGEpLgorcDY3KGEpIDotIHA2OChhKS4KK3A2OChhKSA6LSBwNjkoYSkuCitwNjkoYSkgOi0gcDcwKGEpLgorcDcwKGEpIDotIHA3MShhKS4KK3A3MShhKSA6LSBwNzIoYSkuCitwNzIoYSkgOi0gcDczKGEpLgorcDczKGEpIDotIHA3NChhKS4KK3A3NChhKSA6LSBwNzUoYSkuCitwNzUoYSkgOi0gcDc2KGEpLgorcDc2KGEpIDotIHA3NyhhKS4KK3A3NyhhKSA6LSBwNzgoYSkuCitwNzgoYSkgOi0gcDc5KGEpLgorcDc5KGEpIDotIHA4MChhKS4KK3A4MChhKSA6LSBwODEoYSkuCitwODEoYSkgOi0gcDgyKGEpLgorcDgyKGEpIDotIHA4MyhhKS4KK3A4MyhhKSA6LSBwODQoYSkuCitwODQoYSkgOi0gcDg1KGEpLgorcDg1KGEpIDotIHA4NihhKS4KK3A4NihhKSA6LSBwODcoYSkuCitwODcoYSkgOi0gcDg4KGEpLgorcDg4KGEpIDotIHA4OShhKS4KK3A4OShhKSA6LSBwOTAoYSkuCitwOTAoYSkgOi0gcDkxKGEpLgorcDkxKGEpIDotIHA5MihhKS4KK3A5MihhKSA6LSBwOTMoYSkuCitwOTMoYSkgOi0gcDk0KGEpLgorcDk0KGEpIDotIHA5NShhKS4KK3A5NShhKSA6LSBwOTYoYSkuCitwOTYoYSkgOi0gcDk3KGEpLgorcDk3KGEpIDotIHA5OChhKS4KK3A5OChhKSA6LSBwOTkoYSkuCitwOTkoYSkgOi0gcDEwMChhKS4KK3AxMDAoYSkuCisKKyUgMi4gNjMgZGV0ZXJtaW5hdGUgbm9udGFpbCBjYWxscywgNjQgZGV0ZXJtaW5hdGUgdGFpbCBjYWxscy4KKworYmVuY2hfbWFyayhiaW5hcnlfY2FsbF9hdG9tX2F0b20sIDIwMDAwMCwgcTEoYSksIGR1bW15KGEpKS4KKworOi0gcHVibGljIHExLzEuCisKK3ExKGEpIDotIHEyKGEpLCBxMyhhKS4KK3EyKGEpIDotIHE0KGEpLCBxNShhKS4KK3EzKGEpIDotIHE2KGEpLCBxNyhhKS4KK3E0KGEpIDotIHE4KGEpLCBxOShhKS4KK3E1KGEpIDotIHExMChhKSwgcTExKGEpLgorcTYoYSkgOi0gcTEyKGEpLCBxMTMoYSkuCitxNyhhKSA6LSBxMTQoYSksIHExNShhKS4KK3E4KGEpIDotIHExNihhKSwgcTE3KGEpLgorcTkoYSkgOi0gcTE4KGEpLCBxMTkoYSkuCitxMTAoYSkgOi0gcTIwKGEpLCBxMjEoYSkuCitxMTEoYSkgOi0gcTIyKGEpLCBxMjMoYSkuCitxMTIoYSkgOi0gcTI0KGEpLCBxMjUoYSkuCitxMTMoYSkgOi0gcTI2KGEpLCBxMjcoYSkuCitxMTQoYSkgOi0gcTI4KGEpLCBxMjkoYSkuCitxMTUoYSkgOi0gcTMwKGEpLCBxMzEoYSkuCitxMTYoYSkgOi0gcTMyKGEpLCBxMzMoYSkuCitxMTcoYSkgOi0gcTM0KGEpLCBxMzUoYSkuCitxMTgoYSkgOi0gcTM2KGEpLCBxMzcoYSkuCitxMTkoYSkgOi0gcTM4KGEpLCBxMzkoYSkuCitxMjAoYSkgOi0gcTQwKGEpLCBxNDEoYSkuCitxMjEoYSkgOi0gcTQyKGEpLCBxNDMoYSkuCitxMjIoYSkgOi0gcTQ0KGEpLCBxNDUoYSkuCitxMjMoYSkgOi0gcTQ2KGEpLCBxNDcoYSkuCitxMjQoYSkgOi0gcTQ4KGEpLCBxNDkoYSkuCitxMjUoYSkgOi0gcTUwKGEpLCBxNTEoYSkuCitxMjYoYSkgOi0gcTUyKGEpLCBxNTMoYSkuCitxMjcoYSkgOi0gcTU0KGEpLCBxNTUoYSkuCitxMjgoYSkgOi0gcTU2KGEpLCBxNTcoYSkuCitxMjkoYSkgOi0gcTU4KGEpLCBxNTkoYSkuCitxMzAoYSkgOi0gcTYwKGEpLCBxNjEoYSkuCitxMzEoYSkgOi0gcTYyKGEpLCBxNjMoYSkuCitxMzIoYSkgOi0gcTY0KGEpLCBxNjUoYSkuCitxMzMoYSkgOi0gcTY2KGEpLCBxNjcoYSkuCitxMzQoYSkgOi0gcTY4KGEpLCBxNjkoYSkuCitxMzUoYSkgOi0gcTcwKGEpLCBxNzEoYSkuCitxMzYoYSkgOi0gcTcyKGEpLCBxNzMoYSkuCitxMzcoYSkgOi0gcTc0KGEpLCBxNzUoYSkuCitxMzgoYSkgOi0gcTc2KGEpLCBxNzcoYSkuCitxMzkoYSkgOi0gcTc4KGEpLCBxNzkoYSkuCitxNDAoYSkgOi0gcTgwKGEpLCBxODEoYSkuCitxNDEoYSkgOi0gcTgyKGEpLCBxODMoYSkuCitxNDIoYSkgOi0gcTg0KGEpLCBxODUoYSkuCitxNDMoYSkgOi0gcTg2KGEpLCBxODcoYSkuCitxNDQoYSkgOi0gcTg4KGEpLCBxODkoYSkuCitxNDUoYSkgOi0gcTkwKGEpLCBxOTEoYSkuCitxNDYoYSkgOi0gcTkyKGEpLCBxOTMoYSkuCitxNDcoYSkgOi0gcTk0KGEpLCBxOTUoYSkuCitxNDgoYSkgOi0gcTk2KGEpLCBxOTcoYSkuCitxNDkoYSkgOi0gcTk4KGEpLCBxOTkoYSkuCitxNTAoYSkgOi0gcTEwMChhKSwgcTEwMShhKS4KK3E1MShhKSA6LSBxMTAyKGEpLCBxMTAzKGEpLgorcTUyKGEpIDotIHExMDQoYSksIHExMDUoYSkuCitxNTMoYSkgOi0gcTEwNihhKSwgcTEwNyhhKS4KK3E1NChhKSA6LSBxMTA4KGEpLCBxMTA5KGEpLgorcTU1KGEpIDotIHExMTAoYSksIHExMTEoYSkuCitxNTYoYSkgOi0gcTExMihhKSwgcTExMyhhKS4KK3E1NyhhKSA6LSBxMTE0KGEpLCBxMTE1KGEpLgorcTU4KGEpIDotIHExMTYoYSksIHExMTcoYSkuCitxNTkoYSkgOi0gcTExOChhKSwgcTExOShhKS4KK3E2MChhKSA6LSBxMTIwKGEpLCBxMTIxKGEpLgorcTYxKGEpIDotIHExMjIoYSksIHExMjMoYSkuCitxNjIoYSkgOi0gcTEyNChhKSwgcTEyNShhKS4KK3E2MyhhKSA6LSBxMTI2KGEpLCBxMTI3KGEpLgorcTY0KGEpLgorcTY1KGEpLgorcTY2KGEpLgorcTY3KGEpLgorcTY4KGEpLgorcTY5KGEpLgorcTcwKGEpLgorcTcxKGEpLgorcTcyKGEpLgorcTczKGEpLgorcTc0KGEpLgorcTc1KGEpLgorcTc2KGEpLgorcTc3KGEpLgorcTc4KGEpLgorcTc5KGEpLgorcTgwKGEpLgorcTgxKGEpLgorcTgyKGEpLgorcTgzKGEpLgorcTg0KGEpLgorcTg1KGEpLgorcTg2KGEpLgorcTg3KGEpLgorcTg4KGEpLgorcTg5KGEpLgorcTkwKGEpLgorcTkxKGEpLgorcTkyKGEpLgorcTkzKGEpLgorcTk0KGEpLgorcTk1KGEpLgorcTk2KGEpLgorcTk3KGEpLgorcTk4KGEpLgorcTk5KGEpLgorcTEwMChhKS4KK3ExMDEoYSkuCitxMTAyKGEpLgorcTEwMyhhKS4KK3ExMDQoYSkuCitxMTA1KGEpLgorcTEwNihhKS4KK3ExMDcoYSkuCitxMTA4KGEpLgorcTEwOShhKS4KK3ExMTAoYSkuCitxMTExKGEpLgorcTExMihhKS4KK3ExMTMoYSkuCitxMTE0KGEpLgorcTExNShhKS4KK3ExMTYoYSkuCitxMTE3KGEpLgorcTExOChhKS4KK3ExMTkoYSkuCitxMTIwKGEpLgorcTEyMShhKS4KK3ExMjIoYSkuCitxMTIzKGEpLgorcTEyNChhKS4KK3ExMjUoYSkuCitxMTI2KGEpLgorcTEyNyhhKS4KKworJSAzLiBDb25zdHJ1Y3Qgb25lIDEwMCBlbGVtZW50IGxpc3QsIG5vbnJlY3Vyc2l2ZWx5LgorCitiZW5jaF9tYXJrKGNvbnNfbGlzdCwgMjAwMDAwLCByMShMKSwgZHVtbXkoTCkpLgorCis6LSBwdWJsaWMgcjEvMS4KKworJSA0LiBXYWxrIGRvd24gYSAxMDAgZWxlbWVudCBsaXN0LCBub25yZWN1cnNpdmVseQorCitiZW5jaF9tYXJrKHdhbGtfbGlzdCwgMjAwMDAwLCByMShMKSwgZHVtbXkoTCkpIDotIHIxKEwpLgorCislIDUuIFdhbGsgZG93biBhIDEwMCBlbGVtZW50IGxpc3QsIHJlY3Vyc2l2ZWx5CisKK2JlbmNoX21hcmsod2Fsa19saXN0X3JlYywgMjAwMDAwLCB3bHIoTCksIGR1bW15KEwpKSA6LSByMShMKS4KKworOi0gcHVibGljIHdsci8xLgorCislIDYuIFdhbGsgZG93biBOIDEwMCBjb3BpZXMgb2YgdGhlIHNhbWUgMTAwIGVsZW1lbnQgbGlzdCwgcmVjdXJzaXZlbHkuCisKKyViZW5jaF9tYXJrKGFyZ3MoTiksIDIwMDAwMCwgYXJncyhOLCBMKSwgZHVtbXkoTiwgTCkpIDotIGFyZ3MoTiksIHIxKEwpLgorYmVuY2hfbWFyayh3YWxrX2xpc3QoTiksIDIwMDAwMCwgYXJncyhOLCBMKSwgZHVtbXkoTiwgTCkpIDotIGFyZ3MoTiksIHIxKEwpLgorCis6LSBwdWJsaWMgYXJncy8yLgorCithcmdzKDEpLiAgYXJncygyKS4gIGFyZ3MoNCkuICBhcmdzKDgpLiAgYXJncygxNikuCisKK2FyZ3MoMSwgTCkgOi0gd2xyKEwpLgorYXJncygyLCBMKSA6LSB3bHIoTCwgTCkuCithcmdzKDQsIEwpIDotIHdscihMLCBMLCBMLCBMKS4KK2FyZ3MoOCwgTCkgOi0gd2xyKEwsIEwsIEwsIEwsIEwsIEwsIEwsIEwpLgorYXJncygxNiwgTCkgOi0gd2xyKEwsIEwsIEwsIEwsIEwsIEwsIEwsIEwsIEwsIEwsIEwsIEwsIEwsIEwsIEwsIEwpLgorCit3bHIoW10pLgord2xyKFtffExdKSA6LSB3bHIoTCkuCisKK3dscihbXSwgW10pLgord2xyKFtffEwxXSwgW198TDJdKSA6LSB3bHIoTDEsIEwyKS4KKword2xyKFtdLCBbXSwgW10sIFtdKS4KK3dscihbX3xMMV0sIFtffEwyXSwgW198TDNdLCBbX3xMNF0pIDotIHdscihMMSwgTDIsIEwzLCBMNCkuCisKK3dscihbXSwgW10sIFtdLCBbXSwgW10sIFtdLCBbXSwgW10pLgord2xyKFtffEwxXSwgW198TDJdLCBbX3xMM10sIFtffEw0XSwgW198TDVdLCBbX3xMNl0sIFtffEw3XSwgW198TDhdKSA6LQorICAgd2xyKEwxLCBMMiwgTDMsIEw0LCBMNSwgTDYsIEw3LCBMOCkuCisKK3dscihbXSwgW10sIFtdLCBbXSwgW10sIFtdLCBbXSwgW10sIFtdLCBbXSwgW10sIFtdLCBbXSwgW10sIFtdLCBbXSkuCit3bHIoW198TDFdLCBbX3xMMl0sIFtffEwzXSwgW198TDRdLCBbX3xMNV0sIFtffEw2XSwgW198TDddLCBbX3xMOF0sCisgICAgW198TDldLCBbX3xMMTBdLCBbX3xMMTFdLCBbX3xMMTJdLCBbX3xMMTNdLCBbX3xMMTRdLCBbX3xMMTVdLCBbX3xMMTZdKSA6LQorICAgd2xyKEwxLCBMMiwgTDMsIEw0LCBMNSwgTDYsIEw3LCBMOCwgTDksIEwxMCwgTDExLCBMMTIsIEwxMywgTDE0LCBMMTUsIEwxNikuCisKKyUgTm9ucmVjdXJzaXZlIGxpc3QgY3J1bmNoZXIKKworcjEoWzF8Ul0pIDotIHIyKFIpLgorcjIoWzJ8Ul0pIDotIHIzKFIpLgorcjMoWzN8Ul0pIDotIHI0KFIpLgorcjQoWzR8Ul0pIDotIHI1KFIpLgorcjUoWzV8Ul0pIDotIHI2KFIpLgorcjYoWzZ8Ul0pIDotIHI3KFIpLgorcjcoWzd8Ul0pIDotIHI4KFIpLgorcjgoWzh8Ul0pIDotIHI5KFIpLgorcjkoWzl8Ul0pIDotIHIxMChSKS4KK3IxMChbMTB8Ul0pIDotIHIxMShSKS4KK3IxMShbMTF8Ul0pIDotIHIxMihSKS4KK3IxMihbMTJ8Ul0pIDotIHIxMyhSKS4KK3IxMyhbMTN8Ul0pIDotIHIxNChSKS4KK3IxNChbMTR8Ul0pIDotIHIxNShSKS4KK3IxNShbMTV8Ul0pIDotIHIxNihSKS4KK3IxNihbMTZ8Ul0pIDotIHIxNyhSKS4KK3IxNyhbMTd8Ul0pIDotIHIxOChSKS4KK3IxOChbMTh8Ul0pIDotIHIxOShSKS4KK3IxOShbMTl8Ul0pIDotIHIyMChSKS4KK3IyMChbMjB8Ul0pIDotIHIyMShSKS4KK3IyMShbMjF8Ul0pIDotIHIyMihSKS4KK3IyMihbMjJ8Ul0pIDotIHIyMyhSKS4KK3IyMyhbMjN8Ul0pIDotIHIyNChSKS4KK3IyNChbMjR8Ul0pIDotIHIyNShSKS4KK3IyNShbMjV8Ul0pIDotIHIyNihSKS4KK3IyNihbMjZ8Ul0pIDotIHIyNyhSKS4KK3IyNyhbMjd8Ul0pIDotIHIyOChSKS4KK3IyOChbMjh8Ul0pIDotIHIyOShSKS4KK3IyOShbMjl8Ul0pIDotIHIzMChSKS4KK3IzMChbMzB8Ul0pIDotIHIzMShSKS4KK3IzMShbMzF8Ul0pIDotIHIzMihSKS4KK3IzMihbMzJ8Ul0pIDotIHIzMyhSKS4KK3IzMyhbMzN8Ul0pIDotIHIzNChSKS4KK3IzNChbMzR8Ul0pIDotIHIzNShSKS4KK3IzNShbMzV8Ul0pIDotIHIzNihSKS4KK3IzNihbMzZ8Ul0pIDotIHIzNyhSKS4KK3IzNyhbMzd8Ul0pIDotIHIzOChSKS4KK3IzOChbMzh8Ul0pIDotIHIzOShSKS4KK3IzOShbMzl8Ul0pIDotIHI0MChSKS4KK3I0MChbNDB8Ul0pIDotIHI0MShSKS4KK3I0MShbNDF8Ul0pIDotIHI0MihSKS4KK3I0MihbNDJ8Ul0pIDotIHI0MyhSKS4KK3I0MyhbNDN8Ul0pIDotIHI0NChSKS4KK3I0NChbNDR8Ul0pIDotIHI0NShSKS4KK3I0NShbNDV8Ul0pIDotIHI0NihSKS4KK3I0NihbNDZ8Ul0pIDotIHI0NyhSKS4KK3I0NyhbNDd8Ul0pIDotIHI0OChSKS4KK3I0OChbNDh8Ul0pIDotIHI0OShSKS4KK3I0OShbNDl8Ul0pIDotIHI1MChSKS4KK3I1MChbNTB8Ul0pIDotIHI1MShSKS4KK3I1MShbNTF8Ul0pIDotIHI1MihSKS4KK3I1MihbNTJ8Ul0pIDotIHI1MyhSKS4KK3I1MyhbNTN8Ul0pIDotIHI1NChSKS4KK3I1NChbNTR8Ul0pIDotIHI1NShSKS4KK3I1NShbNTV8Ul0pIDotIHI1NihSKS4KK3I1NihbNTZ8Ul0pIDotIHI1NyhSKS4KK3I1NyhbNTd8Ul0pIDotIHI1OChSKS4KK3I1OChbNTh8Ul0pIDotIHI1OShSKS4KK3I1OShbNTl8Ul0pIDotIHI2MChSKS4KK3I2MChbNjB8Ul0pIDotIHI2MShSKS4KK3I2MShbNjF8Ul0pIDotIHI2MihSKS4KK3I2MihbNjJ8Ul0pIDotIHI2MyhSKS4KK3I2MyhbNjN8Ul0pIDotIHI2NChSKS4KK3I2NChbNjR8Ul0pIDotIHI2NShSKS4KK3I2NShbNjV8Ul0pIDotIHI2NihSKS4KK3I2NihbNjZ8Ul0pIDotIHI2NyhSKS4KK3I2NyhbNjd8Ul0pIDotIHI2OChSKS4KK3I2OChbNjh8Ul0pIDotIHI2OShSKS4KK3I2OShbNjl8Ul0pIDotIHI3MChSKS4KK3I3MChbNzB8Ul0pIDotIHI3MShSKS4KK3I3MShbNzF8Ul0pIDotIHI3MihSKS4KK3I3MihbNzJ8Ul0pIDotIHI3MyhSKS4KK3I3MyhbNzN8Ul0pIDotIHI3NChSKS4KK3I3NChbNzR8Ul0pIDotIHI3NShSKS4KK3I3NShbNzV8Ul0pIDotIHI3NihSKS4KK3I3NihbNzZ8Ul0pIDotIHI3NyhSKS4KK3I3NyhbNzd8Ul0pIDotIHI3OChSKS4KK3I3OChbNzh8Ul0pIDotIHI3OShSKS4KK3I3OShbNzl8Ul0pIDotIHI4MChSKS4KK3I4MChbODB8Ul0pIDotIHI4MShSKS4KK3I4MShbODF8Ul0pIDotIHI4MihSKS4KK3I4MihbODJ8Ul0pIDotIHI4MyhSKS4KK3I4MyhbODN8Ul0pIDotIHI4NChSKS4KK3I4NChbODR8Ul0pIDotIHI4NShSKS4KK3I4NShbODV8Ul0pIDotIHI4NihSKS4KK3I4NihbODZ8Ul0pIDotIHI4NyhSKS4KK3I4NyhbODd8Ul0pIDotIHI4OChSKS4KK3I4OChbODh8Ul0pIDotIHI4OShSKS4KK3I4OShbODl8Ul0pIDotIHI5MChSKS4KK3I5MChbOTB8Ul0pIDotIHI5MShSKS4KK3I5MShbOTF8Ul0pIDotIHI5MihSKS4KK3I5MihbOTJ8Ul0pIDotIHI5MyhSKS4KK3I5MyhbOTN8Ul0pIDotIHI5NChSKS4KK3I5NChbOTR8Ul0pIDotIHI5NShSKS4KK3I5NShbOTV8Ul0pIDotIHI5NihSKS4KK3I5NihbOTZ8Ul0pIDotIHI5NyhSKS4KK3I5NyhbOTd8Ul0pIDotIHI5OChSKS4KK3I5OChbOTh8Ul0pIDotIHI5OShSKS4KK3I5OShbOTl8Ul0pIDotIHIxMDAoUikuCityMTAwKFsxMDB8Ul0pIDotIHIxMDEoUikuCityMTAxKFtdKS4KKworJSA3LiBDb25zdHJ1Y3QgYSB0ZXJtIHdpdGggMTAwIG5vZGVzLCBub25yZWN1cnNpdmVseQorCitiZW5jaF9tYXJrKGNvbnNfdGVybSwgMjAwMDAwLCBzMShUKSwgZHVtbXkoVCkpLgorCis6LSBwdWJsaWMgczEvMS4KKworJSA4LiBXYWxrIGRvd24gYSB0ZXJtIHdpdGggMTAwIG5vZGVzLCBub25yZWN1cnNpdmVseS4KKworYmVuY2hfbWFyayh3YWxrX3Rlcm0sIDIwMDAwMCwgczEoVCksIGR1bW15KFQpKSA6LSBzMShUKS4KKworJSA5LiBXYWxrIGRvd24gYSB0ZXJtIHdpdGggMTAwIG5vZGVzLCByZWN1cnNpdmVseS4KKworYmVuY2hfbWFyayh3YWxrX3Rlcm1fcmVjLCAyMDAwMDAsIHd0cihUKSwgZHVtbXkoVCkpIDotIHMxKFQpLgorCis6LSBwdWJsaWMgd3RyLzEuCisKK3d0cihuaWwpLgord3RyKGYoXyxSKSkgOi0gd3RyKFIpLgorCislIE5vbnJlY3Vyc2l2ZSB0ZXJtIGNydW5jaGVyCisKK3MxKGYoMSwgUikpIDotIHMyKFIpLgorczIoZigyLCBSKSkgOi0gczMoUikuCitzMyhmKDMsIFIpKSA6LSBzNChSKS4KK3M0KGYoNCwgUikpIDotIHM1KFIpLgorczUoZig1LCBSKSkgOi0gczYoUikuCitzNihmKDYsIFIpKSA6LSBzNyhSKS4KK3M3KGYoNywgUikpIDotIHM4KFIpLgorczgoZig4LCBSKSkgOi0gczkoUikuCitzOShmKDksIFIpKSA6LSBzMTAoUikuCitzMTAoZigxMCwgUikpIDotIHMxMShSKS4KK3MxMShmKDExLCBSKSkgOi0gczEyKFIpLgorczEyKGYoMTIsIFIpKSA6LSBzMTMoUikuCitzMTMoZigxMywgUikpIDotIHMxNChSKS4KK3MxNChmKDE0LCBSKSkgOi0gczE1KFIpLgorczE1KGYoMTUsIFIpKSA6LSBzMTYoUikuCitzMTYoZigxNiwgUikpIDotIHMxNyhSKS4KK3MxNyhmKDE3LCBSKSkgOi0gczE4KFIpLgorczE4KGYoMTgsIFIpKSA6LSBzMTkoUikuCitzMTkoZigxOSwgUikpIDotIHMyMChSKS4KK3MyMChmKDIwLCBSKSkgOi0gczIxKFIpLgorczIxKGYoMjEsIFIpKSA6LSBzMjIoUikuCitzMjIoZigyMiwgUikpIDotIHMyMyhSKS4KK3MyMyhmKDIzLCBSKSkgOi0gczI0KFIpLgorczI0KGYoMjQsIFIpKSA6LSBzMjUoUikuCitzMjUoZigyNSwgUikpIDotIHMyNihSKS4KK3MyNihmKDI2LCBSKSkgOi0gczI3KFIpLgorczI3KGYoMjcsIFIpKSA6LSBzMjgoUikuCitzMjgoZigyOCwgUikpIDotIHMyOShSKS4KK3MyOShmKDI5LCBSKSkgOi0gczMwKFIpLgorczMwKGYoMzAsIFIpKSA6LSBzMzEoUikuCitzMzEoZigzMSwgUikpIDotIHMzMihSKS4KK3MzMihmKDMyLCBSKSkgOi0gczMzKFIpLgorczMzKGYoMzMsIFIpKSA6LSBzMzQoUikuCitzMzQoZigzNCwgUikpIDotIHMzNShSKS4KK3MzNShmKDM1LCBSKSkgOi0gczM2KFIpLgorczM2KGYoMzYsIFIpKSA6LSBzMzcoUikuCitzMzcoZigzNywgUikpIDotIHMzOChSKS4KK3MzOChmKDM4LCBSKSkgOi0gczM5KFIpLgorczM5KGYoMzksIFIpKSA6LSBzNDAoUikuCitzNDAoZig0MCwgUikpIDotIHM0MShSKS4KK3M0MShmKDQxLCBSKSkgOi0gczQyKFIpLgorczQyKGYoNDIsIFIpKSA6LSBzNDMoUikuCitzNDMoZig0MywgUikpIDotIHM0NChSKS4KK3M0NChmKDQ0LCBSKSkgOi0gczQ1KFIpLgorczQ1KGYoNDUsIFIpKSA6LSBzNDYoUikuCitzNDYoZig0NiwgUikpIDotIHM0NyhSKS4KK3M0NyhmKDQ3LCBSKSkgOi0gczQ4KFIpLgorczQ4KGYoNDgsIFIpKSA6LSBzNDkoUikuCitzNDkoZig0OSwgUikpIDotIHM1MChSKS4KK3M1MChmKDUwLCBSKSkgOi0gczUxKFIpLgorczUxKGYoNTEsIFIpKSA6LSBzNTIoUikuCitzNTIoZig1MiwgUikpIDotIHM1MyhSKS4KK3M1MyhmKDUzLCBSKSkgOi0gczU0KFIpLgorczU0KGYoNTQsIFIpKSA6LSBzNTUoUikuCitzNTUoZig1NSwgUikpIDotIHM1NihSKS4KK3M1NihmKDU2LCBSKSkgOi0gczU3KFIpLgorczU3KGYoNTcsIFIpKSA6LSBzNTgoUikuCitzNTgoZig1OCwgUikpIDotIHM1OShSKS4KK3M1OShmKDU5LCBSKSkgOi0gczYwKFIpLgorczYwKGYoNjAsIFIpKSA6LSBzNjEoUikuCitzNjEoZig2MSwgUikpIDotIHM2MihSKS4KK3M2MihmKDYyLCBSKSkgOi0gczYzKFIpLgorczYzKGYoNjMsIFIpKSA6LSBzNjQoUikuCitzNjQoZig2NCwgUikpIDotIHM2NShSKS4KK3M2NShmKDY1LCBSKSkgOi0gczY2KFIpLgorczY2KGYoNjYsIFIpKSA6LSBzNjcoUikuCitzNjcoZig2NywgUikpIDotIHM2OChSKS4KK3M2OChmKDY4LCBSKSkgOi0gczY5KFIpLgorczY5KGYoNjksIFIpKSA6LSBzNzAoUikuCitzNzAoZig3MCwgUikpIDotIHM3MShSKS4KK3M3MShmKDcxLCBSKSkgOi0gczcyKFIpLgorczcyKGYoNzIsIFIpKSA6LSBzNzMoUikuCitzNzMoZig3MywgUikpIDotIHM3NChSKS4KK3M3NChmKDc0LCBSKSkgOi0gczc1KFIpLgorczc1KGYoNzUsIFIpKSA6LSBzNzYoUikuCitzNzYoZig3NiwgUikpIDotIHM3NyhSKS4KK3M3NyhmKDc3LCBSKSkgOi0gczc4KFIpLgorczc4KGYoNzgsIFIpKSA6LSBzNzkoUikuCitzNzkoZig3OSwgUikpIDotIHM4MChSKS4KK3M4MChmKDgwLCBSKSkgOi0gczgxKFIpLgorczgxKGYoODEsIFIpKSA6LSBzODIoUikuCitzODIoZig4MiwgUikpIDotIHM4MyhSKS4KK3M4MyhmKDgzLCBSKSkgOi0gczg0KFIpLgorczg0KGYoODQsIFIpKSA6LSBzODUoUikuCitzODUoZig4NSwgUikpIDotIHM4NihSKS4KK3M4NihmKDg2LCBSKSkgOi0gczg3KFIpLgorczg3KGYoODcsIFIpKSA6LSBzODgoUikuCitzODgoZig4OCwgUikpIDotIHM4OShSKS4KK3M4OShmKDg5LCBSKSkgOi0gczkwKFIpLgorczkwKGYoOTAsIFIpKSA6LSBzOTEoUikuCitzOTEoZig5MSwgUikpIDotIHM5MihSKS4KK3M5MihmKDkyLCBSKSkgOi0gczkzKFIpLgorczkzKGYoOTMsIFIpKSA6LSBzOTQoUikuCitzOTQoZig5NCwgUikpIDotIHM5NShSKS4KK3M5NShmKDk1LCBSKSkgOi0gczk2KFIpLgorczk2KGYoOTYsIFIpKSA6LSBzOTcoUikuCitzOTcoZig5NywgUikpIDotIHM5OChSKS4KK3M5OChmKDk4LCBSKSkgOi0gczk5KFIpLgorczk5KGYoOTksIFIpKSA6LSBzMTAwKFIpLgorczEwMChmKDEwMCwgUikpIDotIHMxMDEoUikuCitzMTAxKG5pbCkuCisKKyUgMTAuIDk5IHNoYWxsb3cgZmFpbHVyZXM7IGFzc3VtZXMgbm8gaW5kZXhpbmcgb24gMm5kIGFyZ3VtZW50CisKK2JlbmNoX21hcmsoc2hhbGxvd19iYWNrdHJhY2tpbmcsIDIwMDAwMCwgc2hhbGxvdywgZHVtbXkpLgorCis6LSBwdWJsaWMgc2hhbGxvdy8wLgorCislIDExLiA5OSBkZWVwIGZhaWx1cmVzOyBhc3N1bWVzIG5vIGluZGV4aW5nIG9uIDJuZCBhcmd1bWVudAorCitiZW5jaF9tYXJrKGRlZXBfYmFja3RyYWNraW5nLCAyMDAwMDAsIGRlZXAsIGR1bW15KS4KKworOi0gcHVibGljIGRlZXAvMC4KKworc2hhbGxvdyA6LSBiKF9YLCAxMDApLgorZGVlcCA6LSBiKF9YLCBZKSwgWSA9IDEwMC4KKworYihfWCwgMSkuCitiKF9YLCAyKS4KK2IoX1gsIDMpLgorYihfWCwgNCkuCitiKF9YLCA1KS4KK2IoX1gsIDYpLgorYihfWCwgNykuCitiKF9YLCA4KS4KK2IoX1gsIDkpLgorYihfWCwgMTApLgorYihfWCwgMTEpLgorYihfWCwgMTIpLgorYihfWCwgMTMpLgorYihfWCwgMTQpLgorYihfWCwgMTUpLgorYihfWCwgMTYpLgorYihfWCwgMTcpLgorYihfWCwgMTgpLgorYihfWCwgMTkpLgorYihfWCwgMjApLgorYihfWCwgMjEpLgorYihfWCwgMjIpLgorYihfWCwgMjMpLgorYihfWCwgMjQpLgorYihfWCwgMjUpLgorYihfWCwgMjYpLgorYihfWCwgMjcpLgorYihfWCwgMjgpLgorYihfWCwgMjkpLgorYihfWCwgMzApLgorYihfWCwgMzEpLgorYihfWCwgMzIpLgorYihfWCwgMzMpLgorYihfWCwgMzQpLgorYihfWCwgMzUpLgorYihfWCwgMzYpLgorYihfWCwgMzcpLgorYihfWCwgMzgpLgorYihfWCwgMzkpLgorYihfWCwgNDApLgorYihfWCwgNDEpLgorYihfWCwgNDIpLgorYihfWCwgNDMpLgorYihfWCwgNDQpLgorYihfWCwgNDUpLgorYihfWCwgNDYpLgorYihfWCwgNDcpLgorYihfWCwgNDgpLgorYihfWCwgNDkpLgorYihfWCwgNTApLgorYihfWCwgNTEpLgorYihfWCwgNTIpLgorYihfWCwgNTMpLgorYihfWCwgNTQpLgorYihfWCwgNTUpLgorYihfWCwgNTYpLgorYihfWCwgNTcpLgorYihfWCwgNTgpLgorYihfWCwgNTkpLgorYihfWCwgNjApLgorYihfWCwgNjEpLgorYihfWCwgNjIpLgorYihfWCwgNjMpLgorYihfWCwgNjQpLgorYihfWCwgNjUpLgorYihfWCwgNjYpLgorYihfWCwgNjcpLgorYihfWCwgNjgpLgorYihfWCwgNjkpLgorYihfWCwgNzApLgorYihfWCwgNzEpLgorYihfWCwgNzIpLgorYihfWCwgNzMpLgorYihfWCwgNzQpLgorYihfWCwgNzUpLgorYihfWCwgNzYpLgorYihfWCwgNzcpLgorYihfWCwgNzgpLgorYihfWCwgNzkpLgorYihfWCwgODApLgorYihfWCwgODEpLgorYihfWCwgODIpLgorYihfWCwgODMpLgorYihfWCwgODQpLgorYihfWCwgODUpLgorYihfWCwgODYpLgorYihfWCwgODcpLgorYihfWCwgODgpLgorYihfWCwgODkpLgorYihfWCwgOTApLgorYihfWCwgOTEpLgorYihfWCwgOTIpLgorYihfWCwgOTMpLgorYihfWCwgOTQpLgorYihfWCwgOTUpLgorYihfWCwgOTYpLgorYihfWCwgOTcpLgorYihfWCwgOTgpLgorYihfWCwgOTkpLgorYihfWCwgMTAwKS4KKworCislIDEyLiBQdXNoIDEwMCBjaG9pY2UgcG9pbnRzCislIEFzc3VtZXMgbm8gc3VwZXItY2xldmVyIChtdWx0aXByZWRpY2F0ZSkgb3B0aW1pemVyCisKK2JlbmNoX21hcmsoY2hvaWNlX3BvaW50LCAyMDAwMDAsIGNob2ljZSwgZHVtbXkpLgorCis6LSBwdWJsaWMgY2hvaWNlLzAuCisKK2Nob2ljZSA6LSBjMShhKSwgIS4KKworYzEoYSkgOi0gYzIoYSkuCitjMShhKS4KK2MyKGEpIDotIGMzKGEpLgorYzIoYSkuCitjMyhhKSA6LSBjNChhKS4KK2MzKGEpLgorYzQoYSkgOi0gYzUoYSkuCitjNChhKS4KK2M1KGEpIDotIGM2KGEpLgorYzUoYSkuCitjNihhKSA6LSBjNyhhKS4KK2M2KGEpLgorYzcoYSkgOi0gYzgoYSkuCitjNyhhKS4KK2M4KGEpIDotIGM5KGEpLgorYzgoYSkuCitjOShhKSA6LSBjMTAoYSkuCitjOShhKS4KK2MxMChhKSA6LSBjMTEoYSkuCitjMTAoYSkuCitjMTEoYSkgOi0gYzEyKGEpLgorYzExKGEpLgorYzEyKGEpIDotIGMxMyhhKS4KK2MxMihhKS4KK2MxMyhhKSA6LSBjMTQoYSkuCitjMTMoYSkuCitjMTQoYSkgOi0gYzE1KGEpLgorYzE0KGEpLgorYzE1KGEpIDotIGMxNihhKS4KK2MxNShhKS4KK2MxNihhKSA6LSBjMTcoYSkuCitjMTYoYSkuCitjMTcoYSkgOi0gYzE4KGEpLgorYzE3KGEpLgorYzE4KGEpIDotIGMxOShhKS4KK2MxOChhKS4KK2MxOShhKSA6LSBjMjAoYSkuCitjMTkoYSkuCitjMjAoYSkgOi0gYzIxKGEpLgorYzIwKGEpLgorYzIxKGEpIDotIGMyMihhKS4KK2MyMShhKS4KK2MyMihhKSA6LSBjMjMoYSkuCitjMjIoYSkuCitjMjMoYSkgOi0gYzI0KGEpLgorYzIzKGEpLgorYzI0KGEpIDotIGMyNShhKS4KK2MyNChhKS4KK2MyNShhKSA6LSBjMjYoYSkuCitjMjUoYSkuCitjMjYoYSkgOi0gYzI3KGEpLgorYzI2KGEpLgorYzI3KGEpIDotIGMyOChhKS4KK2MyNyhhKS4KK2MyOChhKSA6LSBjMjkoYSkuCitjMjgoYSkuCitjMjkoYSkgOi0gYzMwKGEpLgorYzI5KGEpLgorYzMwKGEpIDotIGMzMShhKS4KK2MzMChhKS4KK2MzMShhKSA6LSBjMzIoYSkuCitjMzEoYSkuCitjMzIoYSkgOi0gYzMzKGEpLgorYzMyKGEpLgorYzMzKGEpIDotIGMzNChhKS4KK2MzMyhhKS4KK2MzNChhKSA6LSBjMzUoYSkuCitjMzQoYSkuCitjMzUoYSkgOi0gYzM2KGEpLgorYzM1KGEpLgorYzM2KGEpIDotIGMzNyhhKS4KK2MzNihhKS4KK2MzNyhhKSA6LSBjMzgoYSkuCitjMzcoYSkuCitjMzgoYSkgOi0gYzM5KGEpLgorYzM4KGEpLgorYzM5KGEpIDotIGM0MChhKS4KK2MzOShhKS4KK2M0MChhKSA6LSBjNDEoYSkuCitjNDAoYSkuCitjNDEoYSkgOi0gYzQyKGEpLgorYzQxKGEpLgorYzQyKGEpIDotIGM0MyhhKS4KK2M0MihhKS4KK2M0MyhhKSA6LSBjNDQoYSkuCitjNDMoYSkuCitjNDQoYSkgOi0gYzQ1KGEpLgorYzQ0KGEpLgorYzQ1KGEpIDotIGM0NihhKS4KK2M0NShhKS4KK2M0NihhKSA6LSBjNDcoYSkuCitjNDYoYSkuCitjNDcoYSkgOi0gYzQ4KGEpLgorYzQ3KGEpLgorYzQ4KGEpIDotIGM0OShhKS4KK2M0OChhKS4KK2M0OShhKSA6LSBjNTAoYSkuCitjNDkoYSkuCitjNTAoYSkgOi0gYzUxKGEpLgorYzUwKGEpLgorYzUxKGEpIDotIGM1MihhKS4KK2M1MShhKS4KK2M1MihhKSA6LSBjNTMoYSkuCitjNTIoYSkuCitjNTMoYSkgOi0gYzU0KGEpLgorYzUzKGEpLgorYzU0KGEpIDotIGM1NShhKS4KK2M1NChhKS4KK2M1NShhKSA6LSBjNTYoYSkuCitjNTUoYSkuCitjNTYoYSkgOi0gYzU3KGEpLgorYzU2KGEpLgorYzU3KGEpIDotIGM1OChhKS4KK2M1NyhhKS4KK2M1OChhKSA6LSBjNTkoYSkuCitjNTgoYSkuCitjNTkoYSkgOi0gYzYwKGEpLgorYzU5KGEpLgorYzYwKGEpIDotIGM2MShhKS4KK2M2MChhKS4KK2M2MShhKSA6LSBjNjIoYSkuCitjNjEoYSkuCitjNjIoYSkgOi0gYzYzKGEpLgorYzYyKGEpLgorYzYzKGEpIDotIGM2NChhKS4KK2M2MyhhKS4KK2M2NChhKSA6LSBjNjUoYSkuCitjNjQoYSkuCitjNjUoYSkgOi0gYzY2KGEpLgorYzY1KGEpLgorYzY2KGEpIDotIGM2NyhhKS4KK2M2NihhKS4KK2M2NyhhKSA6LSBjNjgoYSkuCitjNjcoYSkuCitjNjgoYSkgOi0gYzY5KGEpLgorYzY4KGEpLgorYzY5KGEpIDotIGM3MChhKS4KK2M2OShhKS4KK2M3MChhKSA6LSBjNzEoYSkuCitjNzAoYSkuCitjNzEoYSkgOi0gYzcyKGEpLgorYzcxKGEpLgorYzcyKGEpIDotIGM3MyhhKS4KK2M3MihhKS4KK2M3MyhhKSA6LSBjNzQoYSkuCitjNzMoYSkuCitjNzQoYSkgOi0gYzc1KGEpLgorYzc0KGEpLgorYzc1KGEpIDotIGM3NihhKS4KK2M3NShhKS4KK2M3NihhKSA6LSBjNzcoYSkuCitjNzYoYSkuCitjNzcoYSkgOi0gYzc4KGEpLgorYzc3KGEpLgorYzc4KGEpIDotIGM3OShhKS4KK2M3OChhKS4KK2M3OShhKSA6LSBjODAoYSkuCitjNzkoYSkuCitjODAoYSkgOi0gYzgxKGEpLgorYzgwKGEpLgorYzgxKGEpIDotIGM4MihhKS4KK2M4MShhKS4KK2M4MihhKSA6LSBjODMoYSkuCitjODIoYSkuCitjODMoYSkgOi0gYzg0KGEpLgorYzgzKGEpLgorYzg0KGEpIDotIGM4NShhKS4KK2M4NChhKS4KK2M4NShhKSA6LSBjODYoYSkuCitjODUoYSkuCitjODYoYSkgOi0gYzg3KGEpLgorYzg2KGEpLgorYzg3KGEpIDotIGM4OChhKS4KK2M4NyhhKS4KK2M4OChhKSA6LSBjODkoYSkuCitjODgoYSkuCitjODkoYSkgOi0gYzkwKGEpLgorYzg5KGEpLgorYzkwKGEpIDotIGM5MShhKS4KK2M5MChhKS4KK2M5MShhKSA6LSBjOTIoYSkuCitjOTEoYSkuCitjOTIoYSkgOi0gYzkzKGEpLgorYzkyKGEpLgorYzkzKGEpIDotIGM5NChhKS4KK2M5MyhhKS4KK2M5NChhKSA6LSBjOTUoYSkuCitjOTQoYSkuCitjOTUoYSkgOi0gYzk2KGEpLgorYzk1KGEpLgorYzk2KGEpIDotIGM5NyhhKS4KK2M5NihhKS4KK2M5NyhhKSA6LSBjOTgoYSkuCitjOTcoYSkuCitjOTgoYSkgOi0gYzk5KGEpLgorYzk4KGEpLgorYzk5KGEpIDotIGMxMDAoYSkuCitjOTkoYSkuCitjMTAwKGEpLgorYzEwMChhKS4KKworJSAxMy4gQ3JlYXRlIDEwMCBjaG9pY2UgcG9pbnRzIGFuZCB0cmFpbCAxMDAgdmFyaWFibGVzCisKK2JlbmNoX21hcmsodHJhaWxfdmFyaWFibGVzLCAyMDAwMDAsIHRyYWlsLCBkdW1teSkuCisKKzotIHB1YmxpYyB0cmFpbC8wLgorCit0cmFpbCA6LSB0MShfWCksICEuCisKK3QxKGEpIDotIHQyKF9YKS4KK3QxKGIpLgordDIoYSkgOi0gdDMoX1gpLgordDIoYikuCit0MyhhKSA6LSB0NChfWCkuCit0MyhiKS4KK3Q0KGEpIDotIHQ1KF9YKS4KK3Q0KGIpLgordDUoYSkgOi0gdDYoX1gpLgordDUoYikuCit0NihhKSA6LSB0NyhfWCkuCit0NihiKS4KK3Q3KGEpIDotIHQ4KF9YKS4KK3Q3KGIpLgordDgoYSkgOi0gdDkoX1gpLgordDgoYikuCit0OShhKSA6LSB0MTAoX1gpLgordDkoYikuCit0MTAoYSkgOi0gdDExKF9YKS4KK3QxMChiKS4KK3QxMShhKSA6LSB0MTIoX1gpLgordDExKGIpLgordDEyKGEpIDotIHQxMyhfWCkuCit0MTIoYikuCit0MTMoYSkgOi0gdDE0KF9YKS4KK3QxMyhiKS4KK3QxNChhKSA6LSB0MTUoX1gpLgordDE0KGIpLgordDE1KGEpIDotIHQxNihfWCkuCit0MTUoYikuCit0MTYoYSkgOi0gdDE3KF9YKS4KK3QxNihiKS4KK3QxNyhhKSA6LSB0MTgoX1gpLgordDE3KGIpLgordDE4KGEpIDotIHQxOShfWCkuCit0MTgoYikuCit0MTkoYSkgOi0gdDIwKF9YKS4KK3QxOShiKS4KK3QyMChhKSA6LSB0MjEoX1gpLgordDIwKGIpLgordDIxKGEpIDotIHQyMihfWCkuCit0MjEoYikuCit0MjIoYSkgOi0gdDIzKF9YKS4KK3QyMihiKS4KK3QyMyhhKSA6LSB0MjQoX1gpLgordDIzKGIpLgordDI0KGEpIDotIHQyNShfWCkuCit0MjQoYikuCit0MjUoYSkgOi0gdDI2KF9YKS4KK3QyNShiKS4KK3QyNihhKSA6LSB0MjcoX1gpLgordDI2KGIpLgordDI3KGEpIDotIHQyOChfWCkuCit0MjcoYikuCit0MjgoYSkgOi0gdDI5KF9YKS4KK3QyOChiKS4KK3QyOShhKSA6LSB0MzAoX1gpLgordDI5KGIpLgordDMwKGEpIDotIHQzMShfWCkuCit0MzAoYikuCit0MzEoYSkgOi0gdDMyKF9YKS4KK3QzMShiKS4KK3QzMihhKSA6LSB0MzMoX1gpLgordDMyKGIpLgordDMzKGEpIDotIHQzNChfWCkuCit0MzMoYikuCit0MzQoYSkgOi0gdDM1KF9YKS4KK3QzNChiKS4KK3QzNShhKSA6LSB0MzYoX1gpLgordDM1KGIpLgordDM2KGEpIDotIHQzNyhfWCkuCit0MzYoYikuCit0MzcoYSkgOi0gdDM4KF9YKS4KK3QzNyhiKS4KK3QzOChhKSA6LSB0MzkoX1gpLgordDM4KGIpLgordDM5KGEpIDotIHQ0MChfWCkuCit0MzkoYikuCit0NDAoYSkgOi0gdDQxKF9YKS4KK3Q0MChiKS4KK3Q0MShhKSA6LSB0NDIoX1gpLgordDQxKGIpLgordDQyKGEpIDotIHQ0MyhfWCkuCit0NDIoYikuCit0NDMoYSkgOi0gdDQ0KF9YKS4KK3Q0MyhiKS4KK3Q0NChhKSA6LSB0NDUoX1gpLgordDQ0KGIpLgordDQ1KGEpIDotIHQ0NihfWCkuCit0NDUoYikuCit0NDYoYSkgOi0gdDQ3KF9YKS4KK3Q0NihiKS4KK3Q0NyhhKSA6LSB0NDgoX1gpLgordDQ3KGIpLgordDQ4KGEpIDotIHQ0OShfWCkuCit0NDgoYikuCit0NDkoYSkgOi0gdDUwKF9YKS4KK3Q0OShiKS4KK3Q1MChhKSA6LSB0NTEoX1gpLgordDUwKGIpLgordDUxKGEpIDotIHQ1MihfWCkuCit0NTEoYikuCit0NTIoYSkgOi0gdDUzKF9YKS4KK3Q1MihiKS4KK3Q1MyhhKSA6LSB0NTQoX1gpLgordDUzKGIpLgordDU0KGEpIDotIHQ1NShfWCkuCit0NTQoYikuCit0NTUoYSkgOi0gdDU2KF9YKS4KK3Q1NShiKS4KK3Q1NihhKSA6LSB0NTcoX1gpLgordDU2KGIpLgordDU3KGEpIDotIHQ1OChfWCkuCit0NTcoYikuCit0NTgoYSkgOi0gdDU5KF9YKS4KK3Q1OChiKS4KK3Q1OShhKSA6LSB0NjAoX1gpLgordDU5KGIpLgordDYwKGEpIDotIHQ2MShfWCkuCit0NjAoYikuCit0NjEoYSkgOi0gdDYyKF9YKS4KK3Q2MShiKS4KK3Q2MihhKSA6LSB0NjMoX1gpLgordDYyKGIpLgordDYzKGEpIDotIHQ2NChfWCkuCit0NjMoYikuCit0NjQoYSkgOi0gdDY1KF9YKS4KK3Q2NChiKS4KK3Q2NShhKSA6LSB0NjYoX1gpLgordDY1KGIpLgordDY2KGEpIDotIHQ2NyhfWCkuCit0NjYoYikuCit0NjcoYSkgOi0gdDY4KF9YKS4KK3Q2NyhiKS4KK3Q2OChhKSA6LSB0NjkoX1gpLgordDY4KGIpLgordDY5KGEpIDotIHQ3MChfWCkuCit0NjkoYikuCit0NzAoYSkgOi0gdDcxKF9YKS4KK3Q3MChiKS4KK3Q3MShhKSA6LSB0NzIoX1gpLgordDcxKGIpLgordDcyKGEpIDotIHQ3MyhfWCkuCit0NzIoYikuCit0NzMoYSkgOi0gdDc0KF9YKS4KK3Q3MyhiKS4KK3Q3NChhKSA6LSB0NzUoX1gpLgordDc0KGIpLgordDc1KGEpIDotIHQ3NihfWCkuCit0NzUoYikuCit0NzYoYSkgOi0gdDc3KF9YKS4KK3Q3NihiKS4KK3Q3NyhhKSA6LSB0NzgoX1gpLgordDc3KGIpLgordDc4KGEpIDotIHQ3OShfWCkuCit0NzgoYikuCit0NzkoYSkgOi0gdDgwKF9YKS4KK3Q3OShiKS4KK3Q4MChhKSA6LSB0ODEoX1gpLgordDgwKGIpLgordDgxKGEpIDotIHQ4MihfWCkuCit0ODEoYikuCit0ODIoYSkgOi0gdDgzKF9YKS4KK3Q4MihiKS4KK3Q4MyhhKSA6LSB0ODQoX1gpLgordDgzKGIpLgordDg0KGEpIDotIHQ4NShfWCkuCit0ODQoYikuCit0ODUoYSkgOi0gdDg2KF9YKS4KK3Q4NShiKS4KK3Q4NihhKSA6LSB0ODcoX1gpLgordDg2KGIpLgordDg3KGEpIDotIHQ4OChfWCkuCit0ODcoYikuCit0ODgoYSkgOi0gdDg5KF9YKS4KK3Q4OChiKS4KK3Q4OShhKSA6LSB0OTAoX1gpLgordDg5KGIpLgordDkwKGEpIDotIHQ5MShfWCkuCit0OTAoYikuCit0OTEoYSkgOi0gdDkyKF9YKS4KK3Q5MShiKS4KK3Q5MihhKSA6LSB0OTMoX1gpLgordDkyKGIpLgordDkzKGEpIDotIHQ5NChfWCkuCit0OTMoYikuCit0OTQoYSkgOi0gdDk1KF9YKS4KK3Q5NChiKS4KK3Q5NShhKSA6LSB0OTYoX1gpLgordDk1KGIpLgordDk2KGEpIDotIHQ5NyhfWCkuCit0OTYoYikuCit0OTcoYSkgOi0gdDk4KF9YKS4KK3Q5NyhiKS4KK3Q5OChhKSA6LSB0OTkoX1gpLgordDk4KGIpLgordDk5KGEpIDotIHQxMDAoX1gpLgordDk5KGIpLgordDEwMChhKS4KK3QxMDAoYikuCisKKyUgMTQuIFVuaWZ5IHRlcm1zIHRoYXQgYXJlIHNtYWxsIGluIHNwYWNlIGJ1dCB0ZXh0dWFsbHkgbGFyZ2UuCisKK2JlbmNoX21hcmsobWVkaXVtX3VuaWZ5LCAyMDAwMDAsIGVxdWFsKFRlcm0xLCBUZXJtMiksIGR1bW15KFRlcm0xLCBUZXJtMikpIDotCisgICB0ZXJtNjQoVGVybTEpLAorICAgdGVybTY0KFRlcm0yKS4KK2JlbmNoX21hcmsoZGVlcF91bmlmeSwgMjAwMDAwLCBlcXVhbChUZXJtMSwgVGVybTIpLCBkdW1teShUZXJtMSwgVGVybTIpKSA6LQorICAgdGVybTQwOTYoVGVybTEpLAorICAgdGVybTQwOTYoVGVybTIpLgorCis6LSBwdWJsaWMgZXF1YWwvMi4KKworZXF1YWwoWCwgWCkuCisKK3Rlcm02NChYMSkgOi0KKyAgIFgxID0gZihYMiwgWDIpLAorICAgWDIgPSBmKFg0LCBYNCksCisgICBYNCA9IGYoWDgsIFg4KSwKKyAgIFg4ID0gZihYMTYsIFgxNiksCisgICBYMTYgPSBmKFgzMiwgWDMyKSwKKyAgIFgzMiA9IGYoWDY0LCBYNjQpLgorCit0ZXJtNDA5NihYMSkgOi0KKyAgIFgxID0gZihYMiwgWDIpLAorICAgWDIgPSBmKFg0LCBYNCksCisgICBYNCA9IGYoWDgsIFg4KSwKKyAgIFg4ID0gZihYMTYsIFgxNiksCisgICBYMTYgPSBmKFgzMiwgWDMyKSwKKyAgIFgzMiA9IGYoWDY0LCBYNjQpLAorICAgWDY0ID0gZihYMTI4LCBYMTI4KSwKKyAgIFgxMjggPSBmKFgyNTYsIFgyNTYpLAorICAgWDI1NiA9IGYoWDUxMiwgWDUxMiksCisgICBYNTEyID0gZihYMTAyNCwgWDEwMjQpLAorICAgWDEwMjQgPSBmKFgyMDQ4LCBYMjA0OCksCisgICBYMjA0OCA9IGYoWDQwOTYsIFg0MDk2KS4KKworJSAxNS4gRG8gMTAwIGludGVnZXIgYWRkaXRpb25zIG5vbnJlY3Vyc2l2ZWx5LAorJSBhdm9pZGluZyBvYnZpb3VzIGNvbXBpbGVyIG9wdGltaXphdGlvbnMuCisKK2JlbmNoX21hcmsoaW50ZWdlcl9hZGQsIDIwMDAwMCwgYTEoMCwgMSwgUiksIGR1bW15KDAsIDEsIFIpKS4KKworOi0gcHVibGljIGExLzMuCisKK2ExKE0sIEssIFApIDotIE4gaXMgTSArIEssIGEyKE4sIDIsIFApLgorYTIoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTMoTiwgMywgUCkuCithMyhNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhNChOLCA0LCBQKS4KK2E0KE0sIEssIFApIDotIE4gaXMgTSArIEssIGE1KE4sIDUsIFApLgorYTUoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTYoTiwgNiwgUCkuCithNihNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhNyhOLCA3LCBQKS4KK2E3KE0sIEssIFApIDotIE4gaXMgTSArIEssIGE4KE4sIDgsIFApLgorYTgoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTkoTiwgOSwgUCkuCithOShNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhMTAoTiwgMTAsIFApLgorYTEwKE0sIEssIFApIDotIE4gaXMgTSArIEssIGExMShOLCAxMSwgUCkuCithMTEoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTEyKE4sIDEyLCBQKS4KK2ExMihNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhMTMoTiwgMTMsIFApLgorYTEzKE0sIEssIFApIDotIE4gaXMgTSArIEssIGExNChOLCAxNCwgUCkuCithMTQoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTE1KE4sIDE1LCBQKS4KK2ExNShNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhMTYoTiwgMTYsIFApLgorYTE2KE0sIEssIFApIDotIE4gaXMgTSArIEssIGExNyhOLCAxNywgUCkuCithMTcoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTE4KE4sIDE4LCBQKS4KK2ExOChNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhMTkoTiwgMTksIFApLgorYTE5KE0sIEssIFApIDotIE4gaXMgTSArIEssIGEyMChOLCAyMCwgUCkuCithMjAoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTIxKE4sIDIxLCBQKS4KK2EyMShNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhMjIoTiwgMjIsIFApLgorYTIyKE0sIEssIFApIDotIE4gaXMgTSArIEssIGEyMyhOLCAyMywgUCkuCithMjMoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTI0KE4sIDI0LCBQKS4KK2EyNChNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhMjUoTiwgMjUsIFApLgorYTI1KE0sIEssIFApIDotIE4gaXMgTSArIEssIGEyNihOLCAyNiwgUCkuCithMjYoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTI3KE4sIDI3LCBQKS4KK2EyNyhNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhMjgoTiwgMjgsIFApLgorYTI4KE0sIEssIFApIDotIE4gaXMgTSArIEssIGEyOShOLCAyOSwgUCkuCithMjkoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTMwKE4sIDMwLCBQKS4KK2EzMChNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhMzEoTiwgMzEsIFApLgorYTMxKE0sIEssIFApIDotIE4gaXMgTSArIEssIGEzMihOLCAzMiwgUCkuCithMzIoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTMzKE4sIDMzLCBQKS4KK2EzMyhNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhMzQoTiwgMzQsIFApLgorYTM0KE0sIEssIFApIDotIE4gaXMgTSArIEssIGEzNShOLCAzNSwgUCkuCithMzUoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTM2KE4sIDM2LCBQKS4KK2EzNihNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhMzcoTiwgMzcsIFApLgorYTM3KE0sIEssIFApIDotIE4gaXMgTSArIEssIGEzOChOLCAzOCwgUCkuCithMzgoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTM5KE4sIDM5LCBQKS4KK2EzOShNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhNDAoTiwgNDAsIFApLgorYTQwKE0sIEssIFApIDotIE4gaXMgTSArIEssIGE0MShOLCA0MSwgUCkuCithNDEoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTQyKE4sIDQyLCBQKS4KK2E0MihNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhNDMoTiwgNDMsIFApLgorYTQzKE0sIEssIFApIDotIE4gaXMgTSArIEssIGE0NChOLCA0NCwgUCkuCithNDQoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTQ1KE4sIDQ1LCBQKS4KK2E0NShNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhNDYoTiwgNDYsIFApLgorYTQ2KE0sIEssIFApIDotIE4gaXMgTSArIEssIGE0NyhOLCA0NywgUCkuCithNDcoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTQ4KE4sIDQ4LCBQKS4KK2E0OChNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhNDkoTiwgNDksIFApLgorYTQ5KE0sIEssIFApIDotIE4gaXMgTSArIEssIGE1MChOLCA1MCwgUCkuCithNTAoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTUxKE4sIDUxLCBQKS4KK2E1MShNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhNTIoTiwgNTIsIFApLgorYTUyKE0sIEssIFApIDotIE4gaXMgTSArIEssIGE1MyhOLCA1MywgUCkuCithNTMoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTU0KE4sIDU0LCBQKS4KK2E1NChNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhNTUoTiwgNTUsIFApLgorYTU1KE0sIEssIFApIDotIE4gaXMgTSArIEssIGE1NihOLCA1NiwgUCkuCithNTYoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTU3KE4sIDU3LCBQKS4KK2E1NyhNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhNTgoTiwgNTgsIFApLgorYTU4KE0sIEssIFApIDotIE4gaXMgTSArIEssIGE1OShOLCA1OSwgUCkuCithNTkoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTYwKE4sIDYwLCBQKS4KK2E2MChNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhNjEoTiwgNjEsIFApLgorYTYxKE0sIEssIFApIDotIE4gaXMgTSArIEssIGE2MihOLCA2MiwgUCkuCithNjIoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTYzKE4sIDYzLCBQKS4KK2E2MyhNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhNjQoTiwgNjQsIFApLgorYTY0KE0sIEssIFApIDotIE4gaXMgTSArIEssIGE2NShOLCA2NSwgUCkuCithNjUoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTY2KE4sIDY2LCBQKS4KK2E2NihNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhNjcoTiwgNjcsIFApLgorYTY3KE0sIEssIFApIDotIE4gaXMgTSArIEssIGE2OChOLCA2OCwgUCkuCithNjgoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTY5KE4sIDY5LCBQKS4KK2E2OShNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhNzAoTiwgNzAsIFApLgorYTcwKE0sIEssIFApIDotIE4gaXMgTSArIEssIGE3MShOLCA3MSwgUCkuCithNzEoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTcyKE4sIDcyLCBQKS4KK2E3MihNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhNzMoTiwgNzMsIFApLgorYTczKE0sIEssIFApIDotIE4gaXMgTSArIEssIGE3NChOLCA3NCwgUCkuCithNzQoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTc1KE4sIDc1LCBQKS4KK2E3NShNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhNzYoTiwgNzYsIFApLgorYTc2KE0sIEssIFApIDotIE4gaXMgTSArIEssIGE3NyhOLCA3NywgUCkuCithNzcoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTc4KE4sIDc4LCBQKS4KK2E3OChNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhNzkoTiwgNzksIFApLgorYTc5KE0sIEssIFApIDotIE4gaXMgTSArIEssIGE4MChOLCA4MCwgUCkuCithODAoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTgxKE4sIDgxLCBQKS4KK2E4MShNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhODIoTiwgODIsIFApLgorYTgyKE0sIEssIFApIDotIE4gaXMgTSArIEssIGE4MyhOLCA4MywgUCkuCithODMoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTg0KE4sIDg0LCBQKS4KK2E4NChNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhODUoTiwgODUsIFApLgorYTg1KE0sIEssIFApIDotIE4gaXMgTSArIEssIGE4NihOLCA4NiwgUCkuCithODYoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTg3KE4sIDg3LCBQKS4KK2E4NyhNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhODgoTiwgODgsIFApLgorYTg4KE0sIEssIFApIDotIE4gaXMgTSArIEssIGE4OShOLCA4OSwgUCkuCithODkoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTkwKE4sIDkwLCBQKS4KK2E5MChNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhOTEoTiwgOTEsIFApLgorYTkxKE0sIEssIFApIDotIE4gaXMgTSArIEssIGE5MihOLCA5MiwgUCkuCithOTIoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTkzKE4sIDkzLCBQKS4KK2E5MyhNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhOTQoTiwgOTQsIFApLgorYTk0KE0sIEssIFApIDotIE4gaXMgTSArIEssIGE5NShOLCA5NSwgUCkuCithOTUoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTk2KE4sIDk2LCBQKS4KK2E5NihNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhOTcoTiwgOTcsIFApLgorYTk3KE0sIEssIFApIDotIE4gaXMgTSArIEssIGE5OChOLCA5OCwgUCkuCithOTgoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgYTk5KE4sIDk5LCBQKS4KK2E5OShNLCBLLCBQKSA6LSBOIGlzIE0gKyBLLCBhMTAwKE4sIDEwMCwgUCkuCithMTAwKE0sIEssIFApIDotIFAgaXMgTSArIEsuCisKKyUgMTYuIDEwMCBmbG9hdGluZyBhZGRpdGlvbnMKKworYmVuY2hfbWFyayhmbG9hdGluZ19hZGQsIDIwMDAwMCwgZmExKDAuMSwgMS4xLCBSKSwgZHVtbXkoMC4xLCAxLjEsIFIpKS4KKworOi0gcHVibGljIGZhMS8zLgorCitmYTEoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEyKE4sIDIuMSwgUCkuCitmYTIoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEzKE4sIDMuMSwgUCkuCitmYTMoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE0KE4sIDQuMSwgUCkuCitmYTQoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE1KE4sIDUuMSwgUCkuCitmYTUoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE2KE4sIDYuMSwgUCkuCitmYTYoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE3KE4sIDcuMSwgUCkuCitmYTcoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE4KE4sIDguMSwgUCkuCitmYTgoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE5KE4sIDkuMSwgUCkuCitmYTkoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmExMChOLCAxMC4xLCBQKS4KK2ZhMTAoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmExMShOLCAxMS4xLCBQKS4KK2ZhMTEoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmExMihOLCAxMi4xLCBQKS4KK2ZhMTIoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmExMyhOLCAxMy4xLCBQKS4KK2ZhMTMoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmExNChOLCAxNC4xLCBQKS4KK2ZhMTQoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmExNShOLCAxNS4xLCBQKS4KK2ZhMTUoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmExNihOLCAxNi4xLCBQKS4KK2ZhMTYoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmExNyhOLCAxNy4xLCBQKS4KK2ZhMTcoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmExOChOLCAxOC4xLCBQKS4KK2ZhMTgoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmExOShOLCAxOS4xLCBQKS4KK2ZhMTkoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEyMChOLCAyMC4xLCBQKS4KK2ZhMjAoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEyMShOLCAyMS4xLCBQKS4KK2ZhMjEoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEyMihOLCAyMi4xLCBQKS4KK2ZhMjIoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEyMyhOLCAyMy4xLCBQKS4KK2ZhMjMoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEyNChOLCAyNC4xLCBQKS4KK2ZhMjQoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEyNShOLCAyNS4xLCBQKS4KK2ZhMjUoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEyNihOLCAyNi4xLCBQKS4KK2ZhMjYoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEyNyhOLCAyNy4xLCBQKS4KK2ZhMjcoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEyOChOLCAyOC4xLCBQKS4KK2ZhMjgoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEyOShOLCAyOS4xLCBQKS4KK2ZhMjkoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEzMChOLCAzMC4xLCBQKS4KK2ZhMzAoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEzMShOLCAzMS4xLCBQKS4KK2ZhMzEoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEzMihOLCAzMi4xLCBQKS4KK2ZhMzIoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEzMyhOLCAzMy4xLCBQKS4KK2ZhMzMoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEzNChOLCAzNC4xLCBQKS4KK2ZhMzQoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEzNShOLCAzNS4xLCBQKS4KK2ZhMzUoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEzNihOLCAzNi4xLCBQKS4KK2ZhMzYoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEzNyhOLCAzNy4xLCBQKS4KK2ZhMzcoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEzOChOLCAzOC4xLCBQKS4KK2ZhMzgoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmEzOShOLCAzOS4xLCBQKS4KK2ZhMzkoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE0MChOLCA0MC4xLCBQKS4KK2ZhNDAoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE0MShOLCA0MS4xLCBQKS4KK2ZhNDEoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE0MihOLCA0Mi4xLCBQKS4KK2ZhNDIoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE0MyhOLCA0My4xLCBQKS4KK2ZhNDMoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE0NChOLCA0NC4xLCBQKS4KK2ZhNDQoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE0NShOLCA0NS4xLCBQKS4KK2ZhNDUoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE0NihOLCA0Ni4xLCBQKS4KK2ZhNDYoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE0NyhOLCA0Ny4xLCBQKS4KK2ZhNDcoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE0OChOLCA0OC4xLCBQKS4KK2ZhNDgoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE0OShOLCA0OS4xLCBQKS4KK2ZhNDkoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE1MChOLCA1MC4xLCBQKS4KK2ZhNTAoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE1MShOLCA1MS4xLCBQKS4KK2ZhNTEoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE1MihOLCA1Mi4xLCBQKS4KK2ZhNTIoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE1MyhOLCA1My4xLCBQKS4KK2ZhNTMoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE1NChOLCA1NC4xLCBQKS4KK2ZhNTQoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE1NShOLCA1NS4xLCBQKS4KK2ZhNTUoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE1NihOLCA1Ni4xLCBQKS4KK2ZhNTYoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE1NyhOLCA1Ny4xLCBQKS4KK2ZhNTcoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE1OChOLCA1OC4xLCBQKS4KK2ZhNTgoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE1OShOLCA1OS4xLCBQKS4KK2ZhNTkoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE2MChOLCA2MC4xLCBQKS4KK2ZhNjAoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE2MShOLCA2MS4xLCBQKS4KK2ZhNjEoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE2MihOLCA2Mi4xLCBQKS4KK2ZhNjIoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE2MyhOLCA2My4xLCBQKS4KK2ZhNjMoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE2NChOLCA2NC4xLCBQKS4KK2ZhNjQoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE2NShOLCA2NS4xLCBQKS4KK2ZhNjUoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE2NihOLCA2Ni4xLCBQKS4KK2ZhNjYoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE2NyhOLCA2Ny4xLCBQKS4KK2ZhNjcoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE2OChOLCA2OC4xLCBQKS4KK2ZhNjgoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE2OShOLCA2OS4xLCBQKS4KK2ZhNjkoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE3MChOLCA3MC4xLCBQKS4KK2ZhNzAoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE3MShOLCA3MS4xLCBQKS4KK2ZhNzEoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE3MihOLCA3Mi4xLCBQKS4KK2ZhNzIoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE3MyhOLCA3My4xLCBQKS4KK2ZhNzMoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE3NChOLCA3NC4xLCBQKS4KK2ZhNzQoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE3NShOLCA3NS4xLCBQKS4KK2ZhNzUoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE3NihOLCA3Ni4xLCBQKS4KK2ZhNzYoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE3NyhOLCA3Ny4xLCBQKS4KK2ZhNzcoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE3OChOLCA3OC4xLCBQKS4KK2ZhNzgoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE3OShOLCA3OS4xLCBQKS4KK2ZhNzkoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE4MChOLCA4MC4xLCBQKS4KK2ZhODAoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE4MShOLCA4MS4xLCBQKS4KK2ZhODEoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE4MihOLCA4Mi4xLCBQKS4KK2ZhODIoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE4MyhOLCA4My4xLCBQKS4KK2ZhODMoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE4NChOLCA4NC4xLCBQKS4KK2ZhODQoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE4NShOLCA4NS4xLCBQKS4KK2ZhODUoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE4NihOLCA4Ni4xLCBQKS4KK2ZhODYoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE4NyhOLCA4Ny4xLCBQKS4KK2ZhODcoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE4OChOLCA4OC4xLCBQKS4KK2ZhODgoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE4OShOLCA4OS4xLCBQKS4KK2ZhODkoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE5MChOLCA5MC4xLCBQKS4KK2ZhOTAoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE5MShOLCA5MS4xLCBQKS4KK2ZhOTEoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE5MihOLCA5Mi4xLCBQKS4KK2ZhOTIoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE5MyhOLCA5My4xLCBQKS4KK2ZhOTMoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE5NChOLCA5NC4xLCBQKS4KK2ZhOTQoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE5NShOLCA5NS4xLCBQKS4KK2ZhOTUoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE5NihOLCA5Ni4xLCBQKS4KK2ZhOTYoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE5NyhOLCA5Ny4xLCBQKS4KK2ZhOTcoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE5OChOLCA5OC4xLCBQKS4KK2ZhOTgoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmE5OShOLCA5OS4xLCBQKS4KK2ZhOTkoTSwgSywgUCkgOi0gTiBpcyBNICsgSywgZmExMDAoTiwgMTAwLjEsIFApLgorZmExMDAoTSwgSywgUCkgOi0gUCBpcyBNICsgSy4KKworJSAxNy4gMTAwIGNhbGxzIHRvIGFyZyBhdCBwb3NpdGlvbiBOCisKK2JlbmNoX21hcmsoYXJnKE4pLCAyMDAwMDAsIGFyZzEoTiwgVGVybSwgUiksIGR1bW15KE4sIFRlcm0sIFIpKSA6LQorICAgYXJncyhOKSwKKyAgIGNvbXBsZXhfbmFyeV90ZXJtKDEwMCwgTiwgVGVybSkuCisKKzotIHB1YmxpYyBhcmcxLzMuCisKK2NvbXBsZXhfbmFyeV90ZXJtKDAsIE4sIE4pIDotICEuCitjb21wbGV4X25hcnlfdGVybShJLCBOLCBUZXJtKSA6LQorICAgSSA+IDAsIEogaXMgSSAtIDEsCisgICBjb21wbGV4X25hcnlfdGVybShKLCBOLCBTdWJUZXJtKSwKKyAgIG5hcnlfdGVybShOLCBTdWJUZXJtLCBUZXJtKS4KKworbmFyeV90ZXJtKE4sIFN1YlRlcm0sIFRlcm0pIDotCisgICBmdW5jdG9yKFRlcm0sIGYsIE4pLAorICAgZmlsbF9uYXJ5X3Rlcm0oTiwgU3ViVGVybSwgVGVybSkuCisKK2ZpbGxfbmFyeV90ZXJtKDAsIF8sIF8pIDotICEuCitmaWxsX25hcnlfdGVybShOLCBTdWJUZXJtLCBUZXJtKSA6LQorICAgTiA+IDAsIE0gaXMgTiAtIDEsCisgICBhcmcoTiwgVGVybSwgU3ViVGVybSksCisgICBmaWxsX25hcnlfdGVybShNLCBTdWJUZXJtLCBUZXJtKS4KKworYXJnMShOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzIoTiwgWCwgUikuCithcmcyKE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnMyhOLCBYLCBSKS4KK2FyZzMoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc0KE4sIFgsIFIpLgorYXJnNChOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzUoTiwgWCwgUikuCithcmc1KE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnNihOLCBYLCBSKS4KK2FyZzYoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc3KE4sIFgsIFIpLgorYXJnNyhOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzgoTiwgWCwgUikuCithcmc4KE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnOShOLCBYLCBSKS4KK2FyZzkoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmcxMChOLCBYLCBSKS4KK2FyZzEwKE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnMTEoTiwgWCwgUikuCithcmcxMShOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzEyKE4sIFgsIFIpLgorYXJnMTIoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmcxMyhOLCBYLCBSKS4KK2FyZzEzKE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnMTQoTiwgWCwgUikuCithcmcxNChOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzE1KE4sIFgsIFIpLgorYXJnMTUoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmcxNihOLCBYLCBSKS4KK2FyZzE2KE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnMTcoTiwgWCwgUikuCithcmcxNyhOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzE4KE4sIFgsIFIpLgorYXJnMTgoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmcxOShOLCBYLCBSKS4KK2FyZzE5KE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnMjAoTiwgWCwgUikuCithcmcyMChOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzIxKE4sIFgsIFIpLgorYXJnMjEoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmcyMihOLCBYLCBSKS4KK2FyZzIyKE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnMjMoTiwgWCwgUikuCithcmcyMyhOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzI0KE4sIFgsIFIpLgorYXJnMjQoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmcyNShOLCBYLCBSKS4KK2FyZzI1KE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnMjYoTiwgWCwgUikuCithcmcyNihOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzI3KE4sIFgsIFIpLgorYXJnMjcoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmcyOChOLCBYLCBSKS4KK2FyZzI4KE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnMjkoTiwgWCwgUikuCithcmcyOShOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzMwKE4sIFgsIFIpLgorYXJnMzAoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmczMShOLCBYLCBSKS4KK2FyZzMxKE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnMzIoTiwgWCwgUikuCithcmczMihOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzMzKE4sIFgsIFIpLgorYXJnMzMoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmczNChOLCBYLCBSKS4KK2FyZzM0KE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnMzUoTiwgWCwgUikuCithcmczNShOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzM2KE4sIFgsIFIpLgorYXJnMzYoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmczNyhOLCBYLCBSKS4KK2FyZzM3KE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnMzgoTiwgWCwgUikuCithcmczOChOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzM5KE4sIFgsIFIpLgorYXJnMzkoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc0MChOLCBYLCBSKS4KK2FyZzQwKE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnNDEoTiwgWCwgUikuCithcmc0MShOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzQyKE4sIFgsIFIpLgorYXJnNDIoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc0MyhOLCBYLCBSKS4KK2FyZzQzKE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnNDQoTiwgWCwgUikuCithcmc0NChOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzQ1KE4sIFgsIFIpLgorYXJnNDUoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc0NihOLCBYLCBSKS4KK2FyZzQ2KE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnNDcoTiwgWCwgUikuCithcmc0NyhOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzQ4KE4sIFgsIFIpLgorYXJnNDgoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc0OShOLCBYLCBSKS4KK2FyZzQ5KE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnNTAoTiwgWCwgUikuCithcmc1MChOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzUxKE4sIFgsIFIpLgorYXJnNTEoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc1MihOLCBYLCBSKS4KK2FyZzUyKE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnNTMoTiwgWCwgUikuCithcmc1MyhOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzU0KE4sIFgsIFIpLgorYXJnNTQoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc1NShOLCBYLCBSKS4KK2FyZzU1KE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnNTYoTiwgWCwgUikuCithcmc1NihOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzU3KE4sIFgsIFIpLgorYXJnNTcoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc1OChOLCBYLCBSKS4KK2FyZzU4KE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnNTkoTiwgWCwgUikuCithcmc1OShOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzYwKE4sIFgsIFIpLgorYXJnNjAoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc2MShOLCBYLCBSKS4KK2FyZzYxKE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnNjIoTiwgWCwgUikuCithcmc2MihOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzYzKE4sIFgsIFIpLgorYXJnNjMoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc2NChOLCBYLCBSKS4KK2FyZzY0KE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnNjUoTiwgWCwgUikuCithcmc2NShOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzY2KE4sIFgsIFIpLgorYXJnNjYoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc2NyhOLCBYLCBSKS4KK2FyZzY3KE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnNjgoTiwgWCwgUikuCithcmc2OChOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzY5KE4sIFgsIFIpLgorYXJnNjkoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc3MChOLCBYLCBSKS4KK2FyZzcwKE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnNzEoTiwgWCwgUikuCithcmc3MShOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzcyKE4sIFgsIFIpLgorYXJnNzIoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc3MyhOLCBYLCBSKS4KK2FyZzczKE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnNzQoTiwgWCwgUikuCithcmc3NChOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzc1KE4sIFgsIFIpLgorYXJnNzUoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc3NihOLCBYLCBSKS4KK2FyZzc2KE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnNzcoTiwgWCwgUikuCithcmc3NyhOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzc4KE4sIFgsIFIpLgorYXJnNzgoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc3OShOLCBYLCBSKS4KK2FyZzc5KE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnODAoTiwgWCwgUikuCithcmc4MChOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzgxKE4sIFgsIFIpLgorYXJnODEoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc4MihOLCBYLCBSKS4KK2FyZzgyKE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnODMoTiwgWCwgUikuCithcmc4MyhOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzg0KE4sIFgsIFIpLgorYXJnODQoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc4NShOLCBYLCBSKS4KK2FyZzg1KE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnODYoTiwgWCwgUikuCithcmc4NihOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzg3KE4sIFgsIFIpLgorYXJnODcoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc4OChOLCBYLCBSKS4KK2FyZzg4KE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnODkoTiwgWCwgUikuCithcmc4OShOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzkwKE4sIFgsIFIpLgorYXJnOTAoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc5MShOLCBYLCBSKS4KK2FyZzkxKE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnOTIoTiwgWCwgUikuCithcmc5MihOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzkzKE4sIFgsIFIpLgorYXJnOTMoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc5NChOLCBYLCBSKS4KK2FyZzk0KE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnOTUoTiwgWCwgUikuCithcmc5NShOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzk2KE4sIFgsIFIpLgorYXJnOTYoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmc5NyhOLCBYLCBSKS4KK2FyZzk3KE4sIFQsIFIpIDotIGFyZyhOLCBULCBYKSwgYXJnOTgoTiwgWCwgUikuCithcmc5OChOLCBULCBSKSA6LSBhcmcoTiwgVCwgWCksIGFyZzk5KE4sIFgsIFIpLgorYXJnOTkoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFgpLCBhcmcxMDAoTiwgWCwgUikuCithcmcxMDAoTiwgVCwgUikgOi0gYXJnKE4sIFQsIFIpLgorCislIDE4LiAxMDAgaW5kZXhlZCBjYWxsczsgc29tZSBzeXN0ZW1zIG1heSByZXF1aXJlIGV4dHJhIGRlY2xhcmF0aW9ucyB0bworJSBwdXQgYW4gaW5kZXggb24gdGhlIGZpcnN0IGFyZ3VtZW50LgorCitiZW5jaF9tYXJrKGluZGV4LCAyMDAwMDAsIGl4KDEpLCBkdW1teSgxKSkuCisKKzotIHB1YmxpYyBpeC8xLgorCitpeCgxKSA6LSBpeCgxMDAwMCkuCitpeCg0KS4KK2l4KDkpIDotIGl4KDQpLgoraXgoMTYpIDotIGl4KDkpLgoraXgoMjUpIDotIGl4KDE2KS4KK2l4KDM2KSA6LSBpeCgyNSkuCitpeCg0OSkgOi0gaXgoMzYpLgoraXgoNjQpIDotIGl4KDQ5KS4KK2l4KDgxKSA6LSBpeCg2NCkuCitpeCgxMDApIDotIGl4KDgxKS4KK2l4KDEyMSkgOi0gaXgoMTAwKS4KK2l4KDE0NCkgOi0gaXgoMTIxKS4KK2l4KDE2OSkgOi0gaXgoMTQ0KS4KK2l4KDE5NikgOi0gaXgoMTY5KS4KK2l4KDIyNSkgOi0gaXgoMTk2KS4KK2l4KDI1NikgOi0gaXgoMjI1KS4KK2l4KDI4OSkgOi0gaXgoMjU2KS4KK2l4KDMyNCkgOi0gaXgoMjg5KS4KK2l4KDM2MSkgOi0gaXgoMzI0KS4KK2l4KDQwMCkgOi0gaXgoMzYxKS4KK2l4KDQ0MSkgOi0gaXgoNDAwKS4KK2l4KDQ4NCkgOi0gaXgoNDQxKS4KK2l4KDUyOSkgOi0gaXgoNDg0KS4KK2l4KDU3NikgOi0gaXgoNTI5KS4KK2l4KDYyNSkgOi0gaXgoNTc2KS4KK2l4KDY3NikgOi0gaXgoNjI1KS4KK2l4KDcyOSkgOi0gaXgoNjc2KS4KK2l4KDc4NCkgOi0gaXgoNzI5KS4KK2l4KDg0MSkgOi0gaXgoNzg0KS4KK2l4KDkwMCkgOi0gaXgoODQxKS4KK2l4KDk2MSkgOi0gaXgoOTAwKS4KK2l4KDEwMjQpIDotIGl4KDk2MSkuCitpeCgxMDg5KSA6LSBpeCgxMDI0KS4KK2l4KDExNTYpIDotIGl4KDEwODkpLgoraXgoMTIyNSkgOi0gaXgoMTE1NikuCitpeCgxMjk2KSA6LSBpeCgxMjI1KS4KK2l4KDEzNjkpIDotIGl4KDEyOTYpLgoraXgoMTQ0NCkgOi0gaXgoMTM2OSkuCitpeCgxNTIxKSA6LSBpeCgxNDQ0KS4KK2l4KDE2MDApIDotIGl4KDE1MjEpLgoraXgoMTY4MSkgOi0gaXgoMTYwMCkuCitpeCgxNzY0KSA6LSBpeCgxNjgxKS4KK2l4KDE4NDkpIDotIGl4KDE3NjQpLgoraXgoMTkzNikgOi0gaXgoMTg0OSkuCitpeCgyMDI1KSA6LSBpeCgxOTM2KS4KK2l4KDIxMTYpIDotIGl4KDIwMjUpLgoraXgoMjIwOSkgOi0gaXgoMjExNikuCitpeCgyMzA0KSA6LSBpeCgyMjA5KS4KK2l4KDI0MDEpIDotIGl4KDIzMDQpLgoraXgoMjUwMCkgOi0gaXgoMjQwMSkuCitpeCgyNjAxKSA6LSBpeCgyNTAwKS4KK2l4KDI3MDQpIDotIGl4KDI2MDEpLgoraXgoMjgwOSkgOi0gaXgoMjcwNCkuCitpeCgyOTE2KSA6LSBpeCgyODA5KS4KK2l4KDMwMjUpIDotIGl4KDI5MTYpLgoraXgoMzEzNikgOi0gaXgoMzAyNSkuCitpeCgzMjQ5KSA6LSBpeCgzMTM2KS4KK2l4KDMzNjQpIDotIGl4KDMyNDkpLgoraXgoMzQ4MSkgOi0gaXgoMzM2NCkuCitpeCgzNjAwKSA6LSBpeCgzNDgxKS4KK2l4KDM3MjEpIDotIGl4KDM2MDApLgoraXgoMzg0NCkgOi0gaXgoMzcyMSkuCitpeCgzOTY5KSA6LSBpeCgzODQ0KS4KK2l4KDQwOTYpIDotIGl4KDM5NjkpLgoraXgoNDIyNSkgOi0gaXgoNDA5NikuCitpeCg0MzU2KSA6LSBpeCg0MjI1KS4KK2l4KDQ0ODkpIDotIGl4KDQzNTYpLgoraXgoNDYyNCkgOi0gaXgoNDQ4OSkuCitpeCg0NzYxKSA6LSBpeCg0NjI0KS4KK2l4KDQ5MDApIDotIGl4KDQ3NjEpLgoraXgoNTA0MSkgOi0gaXgoNDkwMCkuCitpeCg1MTg0KSA6LSBpeCg1MDQxKS4KK2l4KDUzMjkpIDotIGl4KDUxODQpLgoraXgoNTQ3NikgOi0gaXgoNTMyOSkuCitpeCg1NjI1KSA6LSBpeCg1NDc2KS4KK2l4KDU3NzYpIDotIGl4KDU2MjUpLgoraXgoNTkyOSkgOi0gaXgoNTc3NikuCitpeCg2MDg0KSA6LSBpeCg1OTI5KS4KK2l4KDYyNDEpIDotIGl4KDYwODQpLgoraXgoNjQwMCkgOi0gaXgoNjI0MSkuCitpeCg2NTYxKSA6LSBpeCg2NDAwKS4KK2l4KDY3MjQpIDotIGl4KDY1NjEpLgoraXgoNjg4OSkgOi0gaXgoNjcyNCkuCitpeCg3MDU2KSA6LSBpeCg2ODg5KS4KK2l4KDcyMjUpIDotIGl4KDcwNTYpLgoraXgoNzM5NikgOi0gaXgoNzIyNSkuCitpeCg3NTY5KSA6LSBpeCg3Mzk2KS4KK2l4KDc3NDQpIDotIGl4KDc1NjkpLgoraXgoNzkyMSkgOi0gaXgoNzc0NCkuCitpeCg4MTAwKSA6LSBpeCg3OTIxKS4KK2l4KDgyODEpIDotIGl4KDgxMDApLgoraXgoODQ2NCkgOi0gaXgoODI4MSkuCitpeCg4NjQ5KSA6LSBpeCg4NDY0KS4KK2l4KDg4MzYpIDotIGl4KDg2NDkpLgoraXgoOTAyNSkgOi0gaXgoODgzNikuCitpeCg5MjE2KSA6LSBpeCg5MDI1KS4KK2l4KDk0MDkpIDotIGl4KDkyMTYpLgoraXgoOTYwNCkgOi0gaXgoOTQwOSkuCitpeCg5ODAxKSA6LSBpeCg5NjA0KS4KK2l4KDEwMDAwKSA6LSBpeCg5ODAxKS4KKworJSAxOS4gTWFrZSAxMDAwIGFzc2VydHMgb2YgdW5pdCBjbGF1c2VzCitiZW5jaF9tYXJrKGFzc2VydF91bml0LCAxMDAsIGFzc2VydF9jbGF1c2VzKEwpLCBkdW1teShMKSkgOi0KKyAgICVhYm9saXNoKHVhLDMpLAorICAgYWJvbGlzaCh1YS8zKSwKKyAgIGNyZWF0ZV91bml0cygxLCAxMDAwLCBMKS4KKworOi0gcHVibGljIGFzc2VydF9jbGF1c2VzLzEuCisKK2NyZWF0ZV91bml0cyhJLCBOLCBbXSkgOi0gSSA+IE4sICEuCitjcmVhdGVfdW5pdHMoSSwgTiwgW3VhKEssIFgsIGYoSywgWCkpfFJlc3RdKSA6LQorICAgIEsgaXMgSSAqICgxICsgSS8vMTAwKSwKKyAgICBKIGlzIEkgKyAxLAorICAgIGNyZWF0ZV91bml0cyhKLCBOLCBSZXN0KS4KKworYXNzZXJ0X2NsYXVzZXMoW10pLgorYXNzZXJ0X2NsYXVzZXMoW0NsYXVzZXxSZXN0XSkgOi0KKyAgIGFzc2VydChDbGF1c2UpLAorICAgYXNzZXJ0X2NsYXVzZXMoUmVzdCkuCisKKyUgMjAuIEFjY2VzcyAxMDAgZHluYW1pY2FsbHktY3JlYXRlZCBjbGF1c2VzIHdpdGggMXN0IGFyZy4gaW5zdGFudGlhdGVkCisKK2JlbmNoX21hcmsoYWNjZXNzX3VuaXQsIDUwMDAsIGFjY2Vzc19kaXgoMSwgMSksIGR1bW15KDEsIDEpKSA6LQorICAgJWFib2xpc2goZGl4LCAyKSwKKyAgIGFib2xpc2goZGl4LzIpLAorICAgZGl4X2NsYXVzZXMoMSwgMTAwLCBMKSwKKyAgIGFzc2VydF9jbGF1c2VzKEwpLgorCis6LSBwdWJsaWMgYWNjZXNzX2RpeC8yLgorCitkaXhfY2xhdXNlcyhJLCBOLCBbXSkgOi0gSSA+IE4sICEuCitkaXhfY2xhdXNlcyhJLCBOLCBbZGl4KFAsIFEpIHwgTF0pIDotCisgICBJID08IE4sCisgICBQIGlzIEkqSSwKKyAgIFIgaXMgMSArIChJK04tMikgbW9kIE4sCisgICBRIGlzIFIqUiwKKyAgIEogaXMgSSArIDEsCisgICBkaXhfY2xhdXNlcyhKLCBOLCBMKS4KKworYWNjZXNzX2RpeChTdGFydCwgRW5kKSA6LQorICAgZGl4KFN0YXJ0LCBXaGVyZSksCisgKCBXaGVyZSA9IEVuZCAtPiB0cnVlIHwgYWNjZXNzX2RpeChXaGVyZSwgRW5kKSApLgorCislIDIxLiBBY2Nlc3MgMTAwIGR5bmFtaWMgdW5pdCBjbGF1c2VzICgybmQgYXJndW1lbnQgaW5zdGFudGlhdGVkKQorCis6LSBwdWJsaWMgYWNjZXNzX2JhY2svMi4KKworYmVuY2hfbWFyayhzbG93X2FjY2Vzc191bml0LCAxMDAwLCBhY2Nlc3NfYmFjaygxLCAxKSwgZHVtbXkoMSwgMSkpIDotCisgICAlYWJvbGlzaChkaXgsIDIpLAorICAgYWJvbGlzaChkaXgvMiksCisgICBkaXhfY2xhdXNlcygxLCAxMDAsIEwpLAorICAgYXNzZXJ0X2NsYXVzZXMoTCkuCisKK2FjY2Vzc19iYWNrKFN0YXJ0LCBFbmQpIDotCisgICBkaXgoV2hlcmUsIFN0YXJ0KSwKKyAoIFdoZXJlID0gRW5kIC0+IHRydWUgfCBhY2Nlc3NfYmFjayhXaGVyZSwgRW5kKSApLgorCislIDIyLiBTZXRvZiBhbmQgYmFnb2YKKworYmVuY2hfbWFyayhzZXRvZiwgMTAwMDAsIHNldG9mKFgsIFlecHIoWCwgWSksIFMpLCBkdW1teShYLCBZXnByKFgsIFkpLCBTKSkuCitiZW5jaF9tYXJrKHBhaXJfc2V0b2YsIDEwMDAwLAorICAgc2V0b2YoKFgsWSksIHByKFgsIFkpLCBTKSwKKyAgIGR1bW15KChYLFkpLCBwcihYLCBZKSwgUykpLgorYmVuY2hfbWFyayhkb3VibGVfc2V0b2YsIDEwMDAwLCBzZXRvZigoWCxTKSwgc2V0b2YoWSwgcHIoWCwgWSksIFMpLCBUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZHVtbXkoUywgc2V0b2YoWSwgcHIoWCwgWSksIFMpLCBUKSkuCitiZW5jaF9tYXJrKGJhZ29mLCAxMDAwMCwgYmFnb2YoWCwgWV5wcihYLCBZKSwgUyksIGR1bW15KFgsIFlecHIoWCwgWSksIFMpKS4KKworcHIoOTksIDEpLgorcHIoOTgsIDIpLgorcHIoOTcsIDMpLgorcHIoOTYsIDQpLgorcHIoOTUsIDUpLgorcHIoOTQsIDYpLgorcHIoOTMsIDcpLgorcHIoOTIsIDgpLgorcHIoOTEsIDkpLgorcHIoOTAsIDEwKS4KK3ByKDg5LCAxMSkuCitwcig4OCwgMTIpLgorcHIoODcsIDEzKS4KK3ByKDg2LCAxNCkuCitwcig4NSwgMTUpLgorcHIoODQsIDE2KS4KK3ByKDgzLCAxNykuCitwcig4MiwgMTgpLgorcHIoODEsIDE5KS4KK3ByKDgwLCAyMCkuCitwcig3OSwgMjEpLgorcHIoNzgsIDIyKS4KK3ByKDc3LCAyMykuCitwcig3NiwgMjQpLgorcHIoNzUsIDI1KS4KK3ByKDc0LCAyNikuCitwcig3MywgMjcpLgorcHIoNzIsIDI4KS4KK3ByKDcxLCAyOSkuCitwcig3MCwgMzApLgorcHIoNjksIDMxKS4KK3ByKDY4LCAzMikuCitwcig2NywgMzMpLgorcHIoNjYsIDM0KS4KK3ByKDY1LCAzNSkuCitwcig2NCwgMzYpLgorcHIoNjMsIDM3KS4KK3ByKDYyLCAzOCkuCitwcig2MSwgMzkpLgorcHIoNjAsIDQwKS4KK3ByKDU5LCA0MSkuCitwcig1OCwgNDIpLgorcHIoNTcsIDQzKS4KK3ByKDU2LCA0NCkuCitwcig1NSwgNDUpLgorcHIoNTQsIDQ2KS4KK3ByKDUzLCA0NykuCitwcig1MiwgNDgpLgorcHIoNTEsIDQ5KS4KK3ByKDUwLCA1MCkuCitwcig0OSwgNTEpLgorcHIoNDgsIDUyKS4KK3ByKDQ3LCA1MykuCitwcig0NiwgNTQpLgorcHIoNDUsIDU1KS4KK3ByKDQ0LCA1NikuCitwcig0MywgNTcpLgorcHIoNDIsIDU4KS4KK3ByKDQxLCA1OSkuCitwcig0MCwgNjApLgorcHIoMzksIDYxKS4KK3ByKDM4LCA2MikuCitwcigzNywgNjMpLgorcHIoMzYsIDY0KS4KK3ByKDM1LCA2NSkuCitwcigzNCwgNjYpLgorcHIoMzMsIDY3KS4KK3ByKDMyLCA2OCkuCitwcigzMSwgNjkpLgorcHIoMzAsIDcwKS4KK3ByKDI5LCA3MSkuCitwcigyOCwgNzIpLgorcHIoMjcsIDczKS4KK3ByKDI2LCA3NCkuCitwcigyNSwgNzUpLgorcHIoMjQsIDc2KS4KK3ByKDIzLCA3NykuCitwcigyMiwgNzgpLgorcHIoMjEsIDc5KS4KK3ByKDIwLCA4MCkuCitwcigxOSwgODEpLgorcHIoMTgsIDgyKS4KK3ByKDE3LCA4MykuCitwcigxNiwgODQpLgorcHIoMTUsIDg1KS4KK3ByKDE0LCA4NikuCitwcigxMywgODcpLgorcHIoMTIsIDg4KS4KK3ByKDExLCA4OSkuCitwcigxMCwgOTApLgorcHIoOSwgOTEpLgorcHIoOCwgOTIpLgorcHIoNywgOTMpLgorcHIoNiwgOTQpLgorcHIoNSwgOTUpLgorcHIoNCwgOTYpLgorcHIoMywgOTcpLgorcHIoMiwgOTgpLgorcHIoMSwgOTkpLgorcHIoMCwgMTAwKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvTWFrZWZpbGUgYi9leGFtcGxlcy9iZW5jaG1hcmtzL3BvcnRsYW5kL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOWVjOTIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL3BvcnRsYW5kL01ha2VmaWxlCkBAIC0wLDAgKzEsOTcgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIE1ha2VmaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitQTENBRkUgICAgICAgPSBwbGNhZmUKK1BMQ0FGRU9QVFMgICA9IC1KICctWG14MTAwbScKK1BMSkFSICAgICAgICA9IHBsamFyCitQTEpBUk9QVFMgICAgPSAtdiAtSiAnLVhteDEwMG0nIC1DICctSi1YbXgxMDBtJworCitTSUNTVFVTICAgICAgPSAvdXNyL2xvY2FsL2Jpbi9zaWNzdHVzCitTSUNTVFVTT1BUUyAgPSAKKworU1dJICAgICAgICAgID0gL29wdC9sb2NhbC9iaW4vc3dpcGwKK1NXSU9QVFMgICAgICA9IC1MMTAwbQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5xbCAucWxmIC5qYXIgLnBsIC5zaWNzdHVzIC5zd2kgLnBsY2FmZSAuaW4gJChTVUZGSVhFUykKKworcGxjYWZlOiBjb21wX3BsY2FmZSBydW5fcGxjYWZlCisKK3NpY3N0dXM6IGNvbXBfc2ljc3R1cyBydW5fc2ljc3R1cworCitzd2k6IGNvbXBfc3dpIHJ1bl9zd2kKKworYWxsOiBjb21wIHJ1bgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHJ1bgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworcGxjYWZlX291dF9vYmplY3RzICA6PSAkKHBhdHN1YnN0ICUuaW4sJS5wbGNhZmUsICQod2lsZGNhcmQgKi5pbikpCitzaWNzdHVzX291dF9vYmplY3RzIDo9ICQocGF0c3Vic3QgJS5pbiwlLnNpY3N0dXMsJCh3aWxkY2FyZCAqLmluKSkKK3N3aV9vdXRfb2JqZWN0cyAgICAgOj0gJChwYXRzdWJzdCAlLmluLCUuc3dpLCAgICAkKHdpbGRjYXJkICouaW4pKQorCisuaW4ucGxjYWZlOgorCS1ybSAtZiBvdXQvJEAKKwkvYmluL2VjaG8gIlsnJDwnXSwgaGFsdC4iIFwKKwl8ICQoUExDQUZFKSAkKFBMQ0FGRU9QVFMpIC1jcCAkKi5qYXI6YmVuY2hfdXRpbC5qYXIgPiBvdXQvJEAKKworLmluLnNpY3N0dXM6CisJLXJtIC1mIG91dC8kQAorCS9iaW4vZWNobyAiZW5zdXJlX2xvYWRlZCgkKiksIGVuc3VyZV9sb2FkZWQoYmVuY2hfdXRpbCksIFsnJDwnXSwgaGFsdC4iIFwKKwl8ICQoU0lDU1RVUykgJChTSUNTVFVTT1BUUykgPiBvdXQvJEAKKworLmluLnN3aToKKwktcm0gLWYgb3V0LyRACisJL2Jpbi9lY2hvICJlbnN1cmVfbG9hZGVkKCQqKSwgZW5zdXJlX2xvYWRlZChiZW5jaF91dGlsKSwgWyckPCddLCBoYWx0LiIgXAorCXwgJChTV0kpICQoU1dJT1BUUykgPiBvdXQvJEAKKworcnVuOiBydW5fcGxjYWZlIHJ1bl9zaWNzdHVzIHJ1bl9zd2kKKworcnVuX3BsY2FmZTogJChwbGNhZmVfb3V0X29iamVjdHMpCisKK3J1bl9zaWNzdHVzOiAkKHNpY3N0dXNfb3V0X29iamVjdHMpCisKK3J1bl9zd2k6ICQoc3dpX291dF9vYmplY3RzKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGNvbXBpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2phcl9vYmplY3RzIDo9ICQocGF0c3Vic3QgJS5wbCwlLmphciwkKHdpbGRjYXJkICoucGwpKQorcWxfb2JqZWN0cyAgOj0gJChwYXRzdWJzdCAlLnBsLCUucWwsICQod2lsZGNhcmQgKi5wbCkpCitxbGZfb2JqZWN0cyA6PSAkKHBhdHN1YnN0ICUucGwsJS5xbGYsJCh3aWxkY2FyZCAqLnBsKSkKKworLnBsLmphcjoKKwkkKFBMSkFSKSAkKFBMSkFST1BUUykgJEAgJDwKKwktcm0gLWYgLXIgJCoKKworLnBsLnFsOgorCS9iaW4vZWNobyAiWyQqXSwgZmNvbXBpbGUoJCopLCBoYWx0LiIgfCAkKFNJQ1NUVVMpICQoU0lDU1RVU09QVFMpCisKKy5wbC5xbGY6CisJL2Jpbi9lY2hvICJxY29tcGlsZSgkKiksIGhhbHQuIiB8ICQoU1dJKSAkKFNXSU9QVFMpCisjCS9iaW4vZWNobyAiWyQqXSwgcWNvbXBpbGUoJCopLCBoYWx0LiIgfCAkKFNXSSkgJChTV0lPUFRTKQorCitjb21wOiBjb21wX3BsY2FmZSBjb21wX3NpY3N0dXMgY29tcF9zd2kKKworY29tcF9wbGNhZmU6ICQoamFyX29iamVjdHMpCisKK2NvbXBfc2ljc3R1czogJChxbF9vYmplY3RzKQorCitjb21wX3N3aTogJChxbGZfb2JqZWN0cykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBjbGVhbiB1cAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworY2xlYW46CisJLXJtIC1mIGNvcmUgKn4KKwktcm0gLWYgL291dC9jb3JlIG91dC8qfgorCS1ybSAtZiAqLnFsCisJLXJtIC1mICoucWxmCisKK3JlYWxjbGVhbjogY2xlYW4KKwktcm0gLWYgKi5qYXIgKi5jbGFzcworCS1ybSAtZiBvdXQvKi5wbGNhZmUgb3V0Lyouc2ljc3R1cyBvdXQvKi5zd2kKKworIyBFTkQKKwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9iZW5jaF91dGlsLnBsIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9iZW5jaF91dGlsLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OTA5NjIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL3BvcnRsYW5kL2JlbmNoX3V0aWwucGwKQEAgLTAsMCArMSw0NyBAQAorJSAgIEZpbGUgICA6IGJlbmNoX3V0aWwucGwKKyUgICBBdXRob3JzOiBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCislICAgVXBkYXRlZDogMjQgRmVicnVhcnkgMjAwOAorJSAgIFB1cnBvc2U6IEJlbmNobWFyayB1dGlsaXRpZXMKKyUgICBOb3RlICAgOiBiYXNlZCBvbiBkcml2ZXIucGwgaW4gUGVyZWlyYSdzIGJlbmNobWFyaworCisnJGdldF9jcHVfdGltZScoVCkgOi0gc3RhdGlzdGljcyhydW50aW1lLCBbVCxfXSkuCisKKyckcmVwb3J0JyhOYW1lLCBOLCBUMCwgVDEsIFQyKSA6LQorICAgICAgICBUZXN0VGltZSBpcyBUMS1UMCwKKyAgICAgICAgT3ZlckhlYWQgaXMgVDItVDEsCisJVGltZSBpcyBUZXN0VGltZS1PdmVySGVhZCwKKyAgICAgICAgQXZlcmFnZSBpcyBUaW1lL04sCisJbmwsCisJd3JpdGUoJyMgTmFtZTogJyksIHdyaXRlKE5hbWUpLCBubCwKKyAgICAgICAgd3JpdGUoJyMgSXRlcmF0aW9uczogJyksIHdyaXRlKE4pLCBubCwKKwl3cml0ZSgnIyBUZXN0VGltZTogJyksIHdyaXRlKFRlc3RUaW1lKSwgd3JpdGUoJyBtc2VjLlxuJyksCisJd3JpdGUoJyMgT3ZlckhlYWQ6ICcpLCB3cml0ZShPdmVySGVhZCksIHdyaXRlKCcgbXNlYy5cbicpLAorCXdyaXRlKCcjIFRlc3RUaW1lLU92ZXJIZWFkOiAnKSwgd3JpdGUoVGltZSksIHdyaXRlKCcgbXNlYy5cbicpLAorCXdyaXRlKCcjIChUZXN0VGltZS1PdmVySGVhZCkvSXRlcmF0aW9uczogJyksIHdyaXRlKEF2ZXJhZ2UpLCB3cml0ZSgnIG1zZWMuXG4nKSwKKwknJHJlcG9ydF9jc3YnKFsnIyMjQ1NWIyMjJyxOYW1lLE4sVGVzdFRpbWUsT3ZlckhlYWQsVGltZSxBdmVyYWdlXSwgJywnKSwKKwlubC4KKworJyRyZXBvcnRfY3N2JyhbXSwgXykgOi0gIS4KKyckcmVwb3J0X2NzdicoW1hdLCBfKSA6LSAhLCB3cml0ZShYKSwgbmwuCisnJHJlcG9ydF9jc3YnKFtYfFhzXSwgRGVsaW0pIDotIHdyaXRlKFgpLCB3cml0ZShEZWxpbSksICckcmVwb3J0X2NzdicoWHMsIERlbGltKS4KKworJyRiZW5jaG1hcmsnKE5hbWUsIEl0ZXJhdGlvbnMsIEFjdGlvbiwgQ29udHJvbCkgOi0gCisgICAgICAgICckZ2V0X2NwdV90aW1lJyhUMCksCisgICAgICAgICggICAnJHJlcGVhdCcoSXRlcmF0aW9ucyksIG9uY2UoQWN0aW9uKSwgZmFpbAorICAgICAgICA7ICAgJyRnZXRfY3B1X3RpbWUnKFQxKQorICAgICAgICApLAorICAgICAgICAoICAgJyRyZXBlYXQnKEl0ZXJhdGlvbnMpLCBvbmNlKENvbnRyb2wpLCBmYWlsCisgICAgICAgIDsgICAnJGdldF9jcHVfdGltZScoVDIpCisgICAgICAgICksCisgICAgICAgICckcmVwb3J0JyhOYW1lLCBJdGVyYXRpb25zLCBUMCwgVDEsIFQyKS4KKworJyRyZXBlYXQnKE4pIDotIE4gPiAwLCAnJGZyb20nKDEsIE4pLgorCisnJGZyb20nKEksIEkpIDotICEuCisnJGZyb20nKEwsIFUpIDotIE0gaXMgKEwrVSk+PjEsICAgJyRmcm9tJyhMLCBNKS4KKyckZnJvbScoTCwgVSkgOi0gTSBpcyAoTCtVKT4+MSsxLCAnJGZyb20nKE0sIFUpLgorCisnJGR1bW15Jy4KKyckZHVtbXknKF8pLgorJyRkdW1teScoXywgXykuCisnJGR1bW15JyhfLCBfLCBfKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvYmludHJlZS5pbiBiL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvYmludHJlZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWNmMmRjCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9iaW50cmVlLmluCkBAIC0wLDAgKzEgQEAKKzotIFAgPSAxMDAsIG1ha2VfbGlzdChQLCBMKSwgJyRiZW5jaG1hcmsnKGJpbnRyZWUoUCksIDEwMDAsIG1ha2VfdHJlZShfLEwpLCAnJGR1bW15JyhfLEwpKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvYmludHJlZS5wbCBiL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvYmludHJlZS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjMxZjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9iaW50cmVlLnBsCkBAIC0wLDAgKzEsNDYgQEAKKzotIGR5bmFtaWMgc2VlZC8xLgorCisvKiAgVkFYIEMtUHJvbG9nIEJlbmNobWFyayBQYWNrYWdlICAqLworLyogIENvcHlyaWdodCAxOTg1IGJ5IFRla3Ryb25peCwgSW5jLiwgYW5kIFBvcnRsYW5kIFN0YXRlIFVuaXZlcnNpdHkgICovCisKK2JpbnRyZWUoTixUKSA6LQorCW1ha2VfbGlzdChOLEwpLAorCW1ha2VfdHJlZShULEwpLgorCittYWtlX3RyZWUoVCxbSHxMXSkgOi0KKwljcmVhdGVfbm9kZShULEgpLAorCWJ1aWxkX3RyZWUoVCxMKSwgIS4KKworY3JlYXRlX25vZGUoTixWKSA6LQorCU4gPS4uIFtub2RlLFYsXyxfXS4KKworYnVpbGRfdHJlZShfLFtdKSA6LSAhLgorCitidWlsZF90cmVlKFQsW0h8TF0pIDotCisJaW5zZXJ0KFQsSCksCisJYnVpbGRfdHJlZShULEwpLgorCitpbnNlcnQobm9kZShDLEwsUiksVikgOi0KKwlWPEMsIHZhcihMKSwgY3JlYXRlX25vZGUoTCxWKS4KKworaW5zZXJ0KG5vZGUoQyxMLFIpLFYpIDotCisJVjxDLCBub252YXIoTCksIGluc2VydChMLFYpLgorCitpbnNlcnQobm9kZShDLEwsUiksVikgOi0KKwlWPj1DLCB2YXIoUiksIGNyZWF0ZV9ub2RlKFIsVikuCisKK2luc2VydChub2RlKEMsTCxSKSxWKSA6LQorCVY+PUMsIG5vbnZhcihSKSwgaW5zZXJ0KFIsVikuCittYWtlX2xpc3QoMCxbXSkgOi0gIS4KKworbWFrZV9saXN0KE4sW1h8TF0pIDotCisJcm5kKDEwMCxYKSwKKwlOMSBpcyBOLTEsCisJbWFrZV9saXN0KE4xLEwpLgorCitzZWVkKDEzKS4KKworcm5kKFIsTikgOi0KKwlyZXRyYWN0KHNlZWQoUykpLCBOIGlzIChTIG1vZCBSKSArIDEsCisJTmV3c2VlZCBpcyAoMTI1KlMrMSkgbW9kIDQwOTYsCisJYXNzZXJ0YShzZWVkKE5ld3NlZWQpKSwgIS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvY2QuaW4gYi9leGFtcGxlcy9iZW5jaG1hcmtzL3BvcnRsYW5kL2NkLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NjEwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL3BvcnRsYW5kL2NkLmluCkBAIC0wLDAgKzEgQEAKKzotIFAgPSAxMDAwMCwgJyRiZW5jaG1hcmsnKGNkKFApLCAxMDAwLCBjZChQLCAwKSwgJyRkdW1teScoUCwwKSkuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL3BvcnRsYW5kL2NkLnBsIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9jZC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODBlZGEzCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9jZC5wbApAQCAtMCwwICsxLDExIEBACisvKiAgVkFYIEMtUHJvbG9nIEJlbmNobWFyayBQYWNrYWdlICAqLworLyogIENvcHlyaWdodCAxOTg1IGJ5IFRla3Ryb25peCwgSW5jLiwgYW5kIFBvcnRsYW5kIFN0YXRlIFVuaXZlcnNpdHkgICovCisKKy8qICBjZChVcCxEb3duKSBjb3VudHMgZG93biBmcm9tIFVwIHRvIERvd24gICovCisKK2NkKFgsIFgpLgorCitjZChVcCwgRG93bikgOi0KKwlYIGlzIFVwLTEsIAorCWNkKFgsRG93bikuCisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvZ2VubGlzdC5pbiBiL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvZ2VubGlzdC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDJjZmYxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9nZW5saXN0LmluCkBAIC0wLDAgKzEgQEAKKzotIFAgPSAzMDAsICckYmVuY2htYXJrJyhtYWtlX2xpc3QoUCksIDEwMDAsIG1ha2VfbGlzdChQLF8pLCAnJGR1bW15JyhQLF8pKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvZ2VubGlzdC5wbCBiL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvZ2VubGlzdC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTVhOTFkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9nZW5saXN0LnBsCkBAIC0wLDAgKzEsMTggQEAKKzotIGR5bmFtaWMgc2VlZC8xLgorCisvKiAgVkFYIEMtUHJvbG9nIEJlbmNobWFyayBQYWNrYWdlICAqLworLyogIENvcHlyaWdodCAxOTg1IGJ5IFRla3Ryb25peCwgSW5jLiwgYW5kIFBvcnRsYW5kIFN0YXRlIFVuaXZlcnNpdHkgICovCisKK21ha2VfbGlzdCgwLFtdKSA6LSAhLgorCittYWtlX2xpc3QoTixbWHxMXSkgOi0KKwlybmQoMTAwLFgpLAorCU4xIGlzIE4tMSwKKwltYWtlX2xpc3QoTjEsTCkuCisKK3NlZWQoMTMpLgorCitybmQoUixOKSA6LQorCXJldHJhY3Qoc2VlZChTKSksIE4gaXMgKFMgbW9kIFIpICsgMSwKKwlOZXdzZWVkIGlzICgxMjUqUysxKSBtb2QgNDA5NiwKKwlhc3NlcnRhKHNlZWQoTmV3c2VlZCkpLCAhLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9oYW5vaS5pbiBiL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvaGFub2kuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyNDAwMQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvaGFub2kuaW4KQEAgLTAsMCArMSBAQAorOi0gUCA9IDIwLCAnJGJlbmNobWFyaycoaGFub2koUCksIDEwLCBoYW5vaShQKSwgJyRkdW1teScoUCkpLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9oYW5vaS5wbCBiL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvaGFub2kucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNlOGM3MQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvaGFub2kucGwKQEAgLTAsMCArMSw4IEBACisvKiAgVkFYIEMtUHJvbG9nIEJlbmNobWFyayBQYWNrYWdlICAqLworLyogIENvcHlyaWdodCAxOTg1IGJ5IFRla3Ryb25peCwgSW5jLiwgYW5kIFBvcnRsYW5kIFN0YXRlIFVuaXZlcnNpdHkgICovCisKK2hhbm9pKE4pIDotIG1vdmUoTixsZWZ0LGNlbnRlcixyaWdodCkuCittb3ZlKDAsXyxfLF8pIDotICEuCittb3ZlKE4sQSxCLEMpIDotIE0gaXMgTi0xLCBtb3ZlKE0sQSxDLEIpLCBtb3ZlKE0sQyxCLEEpLgorCisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvbG9vcC5pbiBiL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvbG9vcC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2U4NmYyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9sb29wLmluCkBAIC0wLDAgKzEgQEAKKzotIFAgPSAyMDAwMCwgJyRiZW5jaG1hcmsnKGxvb3AoUCksIDEwMDAsIGxvb3AoUCksICckZHVtbXknKFApKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvbG9vcC5wbCBiL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvbG9vcC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmYxN2JmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9sb29wLnBsCkBAIC0wLDAgKzEsMTggQEAKKy8qICBWQVggQy1Qcm9sb2cgQmVuY2htYXJrIFBhY2thZ2UgICovCisvKiAgQ29weXJpZ2h0IDE5ODUgYnkgVGVrdHJvbml4LCBJbmMuLCBhbmQgUG9ydGxhbmQgU3RhdGUgVW5pdmVyc2l0eSAgKi8KKworOi0gZHluYW1pYyBuLzEuCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQcm9sb2cgZnJhZ21lbnQgdGhhdCBkZW1vbnN0cmF0ZXMgaG93IG11Y2ggdGltZSBpcyAgICAqLworLyogY29uc3VtZWQgaW4gdGhlIGxvb3AgaG91c2VrZWVwaW5nIGFsb25lIHRoYXQgaXMgICAgICAgKi8KKy8qIGJlaW5nIHVzZWQgaW4gc29tZSBvZiB0aGUgYmVuY2htYXJrcy4gICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlJMQSoqKioqLworCitsb29wKE1heCkgOi0KKwlhc3NlcnRhKG4oMCkpLAorCXJlcGVhdCwKKwlyZXRyYWN0KG4oTikpLAorCU4xIGlzIE4rMSwKKwlhc3NlcnRhKG4oTjEpKSwKKwlOMT49TWF4LCAhLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9tZW1maWxsLmluIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9tZW1maWxsLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNTE0MjQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL3BvcnRsYW5kL21lbWZpbGwuaW4KQEAgLTAsMCArMSBAQAorOi0gUCA9IDEwMDAsICckYmVuY2htYXJrJyhtZW1maWxsKFApLCAxMDAsIG1lbWZpbGwoUCksICckZHVtbXknKFApKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvbWVtZmlsbC5wbCBiL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvbWVtZmlsbC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NThkMTBjCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9tZW1maWxsLnBsCkBAIC0wLDAgKzEsMTcgQEAKKzotIGR5bmFtaWMgbi8xLgorOi0gZHluYW1pYyB0aGVfbWVtb3J5X2ZpbGxlcl9zdGF0ZW1lbnQvMS4KKworLyogIFZBWCBDLVByb2xvZyBCZW5jaG1hcmsgUGFja2FnZSAgKi8KKy8qICBDb3B5cmlnaHQgMTk4NSBieSBUZWt0cm9uaXgsIEluYy4sIGFuZCBQb3J0bGFuZCBTdGF0ZSBVbml2ZXJzaXR5ICAqLworCittZW1maWxsKExpbWl0KSA6LQorCWFib2xpc2godGhlX21lbW9yeV9maWxsZXJfc3RhdGVtZW50LzEpLAorCWFib2xpc2gobi8xKSwKKwlhc3NlcnQobigwKSksCisJcmVwZWF0LAorCXJldHJhY3QobihOKSksCisJYXNzZXJ0KHRoZV9tZW1vcnlfZmlsbGVyX3N0YXRlbWVudChOKSksCisJTjEgaXMgTisxLAorCWFzc2VydChuKE4xKSksCisJTjE9TGltaXQuCisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvbmFpcmV2LmluIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9uYWlyZXYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2MjM5YgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvbmFpcmV2LmluCkBAIC0wLDAgKzEgQEAKKzotIFAgPSAyMDAwLCBta19saXN0KFAsIEwpLCAnJGJlbmNobWFyaycobmFpcmV2KFApLCAxMCwgcmV2KEwsXyksICckZHVtbXknKEwsXykpLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9uYWlyZXYucGwgYi9leGFtcGxlcy9iZW5jaG1hcmtzL3BvcnRsYW5kL25haXJldi5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTkzZjAwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9uYWlyZXYucGwKQEAgLTAsMCArMSwxNCBAQAorLyogIFZBWCBDLVByb2xvZyBCZW5jaG1hcmsgUGFja2FnZSAgKi8KKy8qICBDb3B5cmlnaHQgMTk4NSBieSBUZWt0cm9uaXgsIEluYy4sIGFuZCBQb3J0bGFuZCBTdGF0ZSBVbml2ZXJzaXR5ICAqLworCitta19saXN0KDAsW10pLgorbWtfbGlzdChOLFtOfExdKSA6LQorCU4xIGlzIE4tMSwgbWtfbGlzdChOMSxMKS4KKworcmV2KFtdLFtdKS4KK3JldihbWHxMXSxSbHgpIDotCisJcmV2KEwsUmwpLCBhcHAoUmwsW1hdLFJseCkuCisKK2FwcChbXSxMLEwpLgorYXBwKFtYfEwxXSxMMixbWHxMM10pIDotCisJYXBwKEwxLEwyLEwzKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvcG9seWV2YWwuaW4gYi9leGFtcGxlcy9iZW5jaG1hcmtzL3BvcnRsYW5kL3BvbHlldmFsLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOTZhNzgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL3BvcnRsYW5kL3BvbHlldmFsLmluCkBAIC0wLDAgKzEgQEAKKzotIFAgPSA1MSwgJyRiZW5jaG1hcmsnKHBvbHliZW5jaChQKSwgMTAwMCwgcG9seWJlbmNoKFAsXyksICckZHVtbXknKFAsXykpLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9wb2x5ZXZhbC5wbCBiL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvcG9seWV2YWwucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1Y2QxMAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvcG9seWV2YWwucGwKQEAgLTAsMCArMSwxOSBAQAorLyogIFZBWCBDLVByb2xvZyBCZW5jaG1hcmsgUGFja2FnZSAgKi8KKy8qICBDb3B5cmlnaHQgMTk4NSBieSBUZWt0cm9uaXgsIEluYy4sIGFuZCBQb3J0bGFuZCBTdGF0ZSBVbml2ZXJzaXR5ICAqLworCitnZW5fbGlzdCgwLFtdKS4KK2dlbl9saXN0KE4sW1tOLE5dfExdKSAgIDotICBOMSBpcyBOLTEsIGdlbl9saXN0KE4xLEwpLgorZXhwYW5kX3Rlcm0oMCxYdmFsdWUsIFR2YWx1ZSkgICAgIDotICAgICBUdmFsdWUgaXMgWHZhbHVlLgorZXhwYW5kX3Rlcm0oUG93ZXIsWHZhbHVlLCBUdmFsdWUpICAgOi0gIFRlbXBWYWx1ZSAgaXMgMipYdmFsdWUsCisJUG93ZXIxIGlzIFBvd2VyIC0gMSwKKwlleHBhbmRfdGVybShQb3dlcjEgLFRlbXBWYWx1ZSwgVHZhbHVlKS4KKworZXZhbF90ZXJtKFtDb2VmLFBvd2VyXSxWYWx1ZSxYdmFsdWUpIDotICBleHBhbmRfdGVybShQb3dlcixYdmFsdWUsIFR2YWx1ZSksCisJVmFsdWUgaXMgQ29lZipUdmFsdWUgLiAgCisKK2V2YWxfcG9seShbXSxBbnN3ZXIsIFN2YWx1ZSkgICAgICAgICAgOi0gICBBbnN3ZXIgaXMgU3ZhbHVlIC4KK2V2YWxfcG9seShbVGVybXxSZXN0XSxBbnN3ZXIsIFN2YWx1ZSkgOi0gIGV2YWxfdGVybShUZXJtLFZhbHVlLDEpLAorCUFucyBpcyBTdmFsdWUgKyBWYWx1ZSwKKwlldmFsX3BvbHkoUmVzdCxBbnN3ZXIsQW5zKS4KK3BvbHliZW5jaChOLEFuc3dlcikgIDotICBnZW5fbGlzdChOLFBvbHkpLCEsCisJZXZhbF9wb2x5KFBvbHksQW5zd2VyLCAwICkuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL3BvcnRsYW5kL3ByaW1lcy5pbiBiL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvcHJpbWVzLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1M2Q4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL3BvcnRsYW5kL3ByaW1lcy5pbgpAQCAtMCwwICsxIEBACis6LSBQID0gMTAwMCwgJyRiZW5jaG1hcmsnKHByaW1lcyhQKSwgMTAwMCwgcHJpbWVzKFAsXyksICckZHVtbXknKFAsXykpLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9wcmltZXMucGwgYi9leGFtcGxlcy9iZW5jaG1hcmtzL3BvcnRsYW5kL3ByaW1lcy5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTBjY2FkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9wcmltZXMucGwKQEAgLTAsMCArMSwzOCBAQAorLyogIFZBWCBDLVByb2xvZyBCZW5jaG1hcmsgUGFja2FnZSAgKi8KKy8qICBDb3B5cmlnaHQgMTk4NSBieSBUZWt0cm9uaXgsIEluYy4sIGFuZCBQb3J0bGFuZCBTdGF0ZSBVbml2ZXJzaXR5ICAqLworCisKKy8qICAgIFRoZSBzaWV2ZSBvZiBFcmFzdG9zdGhlbmVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBCZW5jaG1hcmsgcHJvbG9nIHByb2dyYW0gd2hpY2ggcmVxdWlyZXMgdGhlIHVwcGVyIGxpbWl0IGFzIGEgICAgICAgKi8KKy8qICAgIHBhcmFtZXRlciwgYW5kIHdpbGwgZmluZCBhbGwgcHJpbWUgbnVtYmVycyBiZXR3ZWVuIDEgYW5kIHVwcGVyICAgICAqLworLyogICAgYm91bmQuIEV4ZWN1dGlvbiB0aW1lIGlzIGdpdmVuIGluIG1pbGxpc2Vjb25kcy4gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworcHJpbWVzKExpbWl0LCBQcmltZV9udW1zKSA6LQorCWludGVnZXJfbGlzdCgyLExpbWl0LEludHMpLAorCXNpZnQoSW50cyxQcmltZV9udW1zKS4KKworaW50ZWdlcl9saXN0KExvdyxIaWdoLFtMb3d8UmVzdF0pIDotCisJTG93ID08IEhpZ2gsICEsCisJTSBpcyBMb3cgKyAxLAorCWludGVnZXJfbGlzdChNLEhpZ2gsUmVzdCkuCisKK2ludGVnZXJfbGlzdChfLF8sW10pLgorCitzaWZ0KFtdLFtdKS4KKworc2lmdChbSW50fEludHNdLFtJbnR8UHJpbWVzXSkgOi0KKwlyZW1vdmUoSW50LEludHMsTmV3KSwKKwlzaWZ0KE5ldyxQcmltZXMpLgorCityZW1vdmUoUHJpbWUsW10sW10pLgorCityZW1vdmUoUHJpbWUsW0ludHxJbnRzXSxbSW50fE5ld19pbnRzXSkgOi0KKwlcKygwIGlzIEludCBtb2QgUHJpbWUpLCAhLAorCXJlbW92ZShQcmltZSxJbnRzLE5ld19pbnRzKS4KKworcmVtb3ZlKFByaW1lLFtJbnR8SW50c10sTmV3X2ludHMpIDotCisJMCBpcyBJbnQgbW9kIFByaW1lLCAhLAorCXJlbW92ZShQcmltZSxJbnRzLE5ld19pbnRzKS4KKwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9zbmFpcmV2LmluIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9zbmFpcmV2LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMGU1MTUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL3BvcnRsYW5kL3NuYWlyZXYuaW4KQEAgLTAsMCArMSBAQAorOi0gUCA9IDIwMDAsIG1rX2xpc3QoUCwgTCksICckYmVuY2htYXJrJyhzbmFpcmV2KFApLCAxMCwgcmV2KEwsXyksICckZHVtbXknKEwsXykpLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9zbmFpcmV2LnBsIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9wb3J0bGFuZC9zbmFpcmV2LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MDliN2IKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL3BvcnRsYW5kL3NuYWlyZXYucGwKQEAgLTAsMCArMSwxNCBAQAorLyogIFZBWCBDLVByb2xvZyBCZW5jaG1hcmsgUGFja2FnZSAgKi8KKy8qICBDb3B5cmlnaHQgMTk4NSBieSBUZWt0cm9uaXgsIEluYy4sIGFuZCBQb3J0bGFuZCBTdGF0ZSBVbml2ZXJzaXR5ICAqLworCitta19saXN0KDAsbmlsKS4KK21rX2xpc3QoTixjb25zKE4sTCkpIDotCisJTjEgaXMgTi0xLCBta19saXN0KE4xLEwpLgorCityZXYobmlsLG5pbCkuCityZXYoY29ucyhYLEwpLFJseCkgOi0KKwlyZXYoTCxSbCksIGFwcChSbCxjb25zKFgsbmlsKSxSbHgpLgorCithcHAobmlsLEwsTCkuCithcHAoY29ucyhYLEwxKSxMMixjb25zKFgsTDMpKSA6LQorCWFwcChMMSxMMixMMykuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL3BvcnRsYW5kL3NvcnQuaW4gYi9leGFtcGxlcy9iZW5jaG1hcmtzL3BvcnRsYW5kL3NvcnQuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThiYTM3ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvc29ydC5pbgpAQCAtMCwwICsxIEBACis6LSBQID0gMTAwMCwgJyRiZW5jaG1hcmsnKHFzb3J0KFApLCAxMDAsIHFzb3J0KFApLCAnJGR1bW15JyhQKSkuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL3BvcnRsYW5kL3NvcnQucGwgYi9leGFtcGxlcy9iZW5jaG1hcmtzL3BvcnRsYW5kL3NvcnQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgzZDFiYwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvcG9ydGxhbmQvc29ydC5wbApAQCAtMCwwICsxLDM2IEBACis6LSBkeW5hbWljIHNlZWQvMS4KKworLyogIFZBWCBDLVByb2xvZyBCZW5jaG1hcmsgUGFja2FnZSAgKi8KKy8qICBDb3B5cmlnaHQgMTk4NSBieSBUZWt0cm9uaXgsIEluYy4sIGFuZCBQb3J0bGFuZCBTdGF0ZSBVbml2ZXJzaXR5ICAqLworCitxc29ydChOKSA6LSAKKyAgICBnZW5lcmF0ZSgwLE4sTCksICEsCisgICAgcXVpY2tzb3J0KEwsUykuCisKK2dlbmVyYXRlKEksTixbXSkgOi0gSSA9IE4uCitnZW5lcmF0ZShJLE4sTCkgOi0KKwkJICBKIGlzIEkrMSwKKwkJICByYW5kb20oMTAwMSxYKSwKKwkJICBnZW5lcmF0ZShKLE4sTDEpLAorCQkgIGFwcGVuZChbWF0sTDEsTCkuCisKK2FwcGVuZChbXSxMLEwpLgorYXBwZW5kKFtYfEwxXSxMMixbWHxMM10pIDotIGFwcGVuZChMMSxMMixMMykuCisKK3NlZWQoMTMwMSkuCisKK3JhbmRvbShSLE4pIDotIHJldHJhY3Qoc2VlZChTKSksCisJICAgTiBpcyAoUyBtb2QgUikrMSwKKwkgICBOZXdTZWVkIGlzICgxMjUqUysxKSBtb2QgNDA5NiwKKwkgICBhc3NlcnRhKHNlZWQoTmV3U2VlZCkpLCAhLgorCitxdWlja3NvcnQoW10sW10pLgorcXVpY2tzb3J0KFtIfFRdLFMpIDotIHNwbGl0KEgsVCxBLEIpLAorCSAgICAgIHF1aWNrc29ydChBLEExKSwKKwkgICAgICBxdWlja3NvcnQoQixCMSksCisJICAgICAgYXBwZW5kKEExLFtIfEIxXSxTKS4KKworc3BsaXQoSCxbQXxYXSxbQXxZXSxaKSA6LSBBID4gSCwgc3BsaXQoSCxYLFksWikuCitzcGxpdChILFtBfFhdLFksW0F8Wl0pIDotIEEgPCBILCBzcGxpdChILFgsWSxaKS4KK3NwbGl0KF8sW10sW10sW10pLgorCSAgICAgCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL3F1aW50dXMvTWFrZWZpbGUgYi9leGFtcGxlcy9iZW5jaG1hcmtzL3F1aW50dXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhYTFiMgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvcXVpbnR1cy9NYWtlZmlsZQpAQCAtMCwwICsxLDk1IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICBNYWtlZmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworUExDQUZFICAgICAgID0gcGxjYWZlCitQTENBRkVPUFRTICAgPSAtSiAnLVhteDEwMG0nCitQTEpBUiAgICAgICAgPSBwbGphcgorUExKQVJPUFRTICAgID0gLXYgLUogJy1YbXgxMDBtJyAtQyAnLUotWG14MzAwbScKKworU0lDU1RVUyAgICAgID0gL3Vzci9sb2NhbC9iaW4vc2ljc3R1cworU0lDU1RVU09QVFMgID0gCisKK1NXSSAgICAgICAgICA9IC9vcHQvbG9jYWwvYmluL3N3aXBsCitTV0lPUFRTICAgICAgPSAtTDEwMG0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLnFsIC5xbGYgLmphciAucGwgLnNpY3N0dXMgLnN3aSAucGxjYWZlIC5pbiAkKFNVRkZJWEVTKQorCitwbGNhZmU6IGNvbXBfcGxjYWZlIHJ1bl9wbGNhZmUKKworc2ljc3R1czogY29tcF9zaWNzdHVzIHJ1bl9zaWNzdHVzCisKK3N3aTogY29tcF9zd2kgcnVuX3N3aQorCithbGw6IGNvbXAgcnVuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgcnVuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitwbGNhZmVfb3V0X29iamVjdHMgIDo9ICQocGF0c3Vic3QgJS5pbiwlLnBsY2FmZSwgJCh3aWxkY2FyZCAqLmluKSkKK3NpY3N0dXNfb3V0X29iamVjdHMgOj0gJChwYXRzdWJzdCAlLmluLCUuc2ljc3R1cywkKHdpbGRjYXJkICouaW4pKQorc3dpX291dF9vYmplY3RzICAgICA6PSAkKHBhdHN1YnN0ICUuaW4sJS5zd2ksICAgICQod2lsZGNhcmQgKi5pbikpCisKKy5pbi5wbGNhZmU6CisJLXJtIC1mIG91dC8kQAorCS9iaW4vZWNobyAiWyckPCddLCBoYWx0LiIgXAorCXwgJChQTENBRkUpICQoUExDQUZFT1BUUykgLWNwICQqLmphciA+IG91dC8kQAorCisuaW4uc2ljc3R1czoKKwktcm0gLWYgb3V0LyRACisJL2Jpbi9lY2hvICJlbnN1cmVfbG9hZGVkKCQqKSwgWyckPCddLCBoYWx0LiIgXAorCXwgJChTSUNTVFVTKSAkKFNJQ1NUVVNPUFRTKSA+IG91dC8kQAorCisuaW4uc3dpOgorCS1ybSAtZiBvdXQvJEAKKwkvYmluL2VjaG8gImVuc3VyZV9sb2FkZWQoJCopLCBbJyQ8J10sIGhhbHQuIiBcCisJfCAkKFNXSSkgJChTV0lPUFRTKSA+IG91dC8kQAorCitydW46IHJ1bl9wbGNhZmUgcnVuX3NpY3N0dXMgcnVuX3N3aQorCitydW5fcGxjYWZlOiAkKHBsY2FmZV9vdXRfb2JqZWN0cykKKworcnVuX3NpY3N0dXM6ICQoc2ljc3R1c19vdXRfb2JqZWN0cykKKworcnVuX3N3aTogJChzd2lfb3V0X29iamVjdHMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgY29tcGlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworamFyX29iamVjdHMgOj0gJChwYXRzdWJzdCAlLnBsLCUuamFyLCQod2lsZGNhcmQgKi5wbCkpCitxbF9vYmplY3RzICA6PSAkKHBhdHN1YnN0ICUucGwsJS5xbCwgJCh3aWxkY2FyZCAqLnBsKSkKK3FsZl9vYmplY3RzIDo9ICQocGF0c3Vic3QgJS5wbCwlLnFsZiwkKHdpbGRjYXJkICoucGwpKQorCisucGwuamFyOgorCSQoUExKQVIpICQoUExKQVJPUFRTKSAkQCAkPAorCS1ybSAtZiAtciAkKgorCisucGwucWw6CisJL2Jpbi9lY2hvICJbJCpdLCBmY29tcGlsZSgkKiksIGhhbHQuIiB8ICQoU0lDU1RVUykgJChTSUNTVFVTT1BUUykKKworLnBsLnFsZjoKKwkvYmluL2VjaG8gInFjb21waWxlKCQqKSwgaGFsdC4iIHwgJChTV0kpICQoU1dJT1BUUykKKworY29tcDogY29tcF9wbGNhZmUgY29tcF9zaWNzdHVzIGNvbXBfc3dpCisKK2NvbXBfcGxjYWZlOiAkKGphcl9vYmplY3RzKQorCitjb21wX3NpY3N0dXM6ICQocWxfb2JqZWN0cykKKworY29tcF9zd2k6ICQocWxmX29iamVjdHMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgY2xlYW4gdXAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2NsZWFuOgorCS1ybSAtZiBjb3JlICp+CisJLXJtIC1mIC9vdXQvY29yZSBvdXQvKn4KKwktcm0gLWYgKi5xbAorCS1ybSAtZiAqLnFsZgorCityZWFsY2xlYW46IGNsZWFuCisJLXJtIC1mICouamFyICouY2xhc3MKKwktcm0gLWYgb3V0LyoucGxjYWZlIG91dC8qLnNpY3N0dXMgb3V0Lyouc3dpCisKKyMgRU5ECisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MvcXVpbnR1cy9iZW5jaC5pbiBiL2V4YW1wbGVzL2JlbmNobWFya3MvcXVpbnR1cy9iZW5jaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDZhYzk3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9xdWludHVzL2JlbmNoLmluCkBAIC0wLDAgKzEgQEAKKzotIGxvdHMuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL3F1aW50dXMvYmVuY2gucGwgYi9leGFtcGxlcy9iZW5jaG1hcmtzL3F1aW50dXMvYmVuY2gucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyNWZiMgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MvcXVpbnR1cy9iZW5jaC5wbApAQCAtMCwwICsxLDE5OSBAQAorJSUlIEJFTkNILlBMIDogVGhlIGNsYXNzaWMgUHJvbG9nIGJlbmNobWFyaworJSUlCVN1cHBsaWVkIGJ5IFF1aW50dXMgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorJSUlCUFwcmlsIDMwdGggMTk4NAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBUaGlzIGJlbmNobWFyayBnaXZlcyB0aGUgcmF3IHNwZWVkIG9mIGEgUHJvbG9nIHN5c3RlbS4KKworICAgVGhlIG1lYXN1cmUgb2YgbG9naWNhbCBpbmZlcmVuY2VzIHBlciBzZWNvbmQgKExpcHMpIHVzZWQgaGVyZSBpcyB0YWtlbiB0bworICAgYmUgcHJvY2VkdXJlIGNhbGxzIHBlciBzZWNvbmQgb3ZlciBhbiBleGFtcGxlIHdpdGggbm90IHZlcnkgY29tcGxleAorICAgcHJvY2VkdXJlIGNhbGxzLiBUaGUgZXhhbXBsZSB1c2VkIGlzIHRoYXQgb2YgIm5haXZlIHJldmVyc2luZyIgYSBsaXN0LAorICAgd2hpY2ggaXMgYW4gZXhwZW5zaXZlLCBhbmQgdGhlcmVmb3JlIHN0dXBpZCwgd2F5IG9mIHJldmVyc2luZyBhIGxpc3QuICBJdAorICAgZG9lcywgaG93ZXZlciwgcHJvZHVjZSBhIGxvdCBvZiBwcm9jZWR1cmUgY2FsbHMuIChJbiB0aGVvcmV0aWNhbCB0ZXJtcywKKyAgIHRoaXMgYWxnb3JpdGhtIGlzIE8obl4yKSBvbiB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0KS4KKworICAgVGhlIHVzZSBvZiBhIHNpbmdsZSBzaW1wbGUgYmVuY2htYXJrIGxpa2UgdGhpcyBjYW5ub3QsIG9mIGNvdXJzZSwgYmUKKyAgIHRha2VuIHRvIHNpZ25pZnkgYSBncmVhdCBkZWFsLiBIb3dldmVyLCBleHBlcmllbmNlIGhhcyBzaG93biB0aGF0IHRoaXMKKyAgIGJlbmNobWFyayBkb2VzIHByb3ZpZGUgYSB2ZXJ5IGdvb2QgbWVhc3VyZSBvZiBiYXNpYyBQcm9sb2cgc3BlZWQgYW5kCisgICBwcm9kdWNlcyBmaWd1cmVzIHdoaWNoIG1hdGNoIG1vcmUgY29tcGxleCBiZW5jaG1hcmtzLiBUaGUgcmVhc29uIGZvcgorICAgdGhpcyBpcyB0aGF0IHRoZSBiYXNpYyBvcGVyYXRpb25zIHBlcmZvcm1lZCBoZXJlOiBwcm9jZWR1cmUgY2FsbHMgd2l0aCBhCisgICBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIHN0cnVjdHVyZSBhY2Nlc3MgYW5kIGNvbnN0cnVjdGlvbjsgYXJlIGFic29sdXRlbHkKKyAgIGZ1bmRhbWVudGFsIHRvIFByb2xvZyBleGVjdXRpb24uIElmIHRoZXNlIGFyZSBkb25lIHJpZ2h0LCB0aGVuIG1vcmUKKyAgIGNvbXBsZXggYmVuY2htYXJrcyB0ZW5kIHRvIHNjYWxlIGFjY29yZGluZ2x5LiBUaGlzIHBhcnRpY3VsYXIgYmVuY2htYXJrCisgICBoYXMgdGh1cyBiZWVuIHVzZWQgYXMgYSBnb29kIHJ1bGUgb2YgdGh1bWIgYnkgUHJvbG9nIGltcGxlbWVudG9ycyBmb3IKKyAgIG92ZXIgYSBkZWNhZGUgYW5kIGZvcm1zIGEgcGFydCBvZiB0aGUgdW53cml0dGVuIFByb2xvZyBmb2xrbG9yZS4gU28gLQorICAgdXNlIHRoaXMgYmVuY2htYXJrLCB3aXRoIHRoaXMgaW4gbWluZCwgYXMgYSBxdWljaywgYnV0IGV4dHJlbWVseSB1c2VmdWwsCisgICB0ZXN0IG9mIFByb2xvZyBwZXJmb3JtYW5jZS4KKworICAgSW4gYSBjb21wbGV0ZSBldmFsdWF0aW9uIG9mIGEgUHJvbG9nIHN5c3RlbSB5b3Ugc2hvdWxkIGFsc28gYmUgdGFraW5nCisgICBhY2NvdW50IHNwZWVkcyBvZiBhc3NlcnRpbmcgYW5kIGNvbXBpbGluZywgdGFpbCByZWN1cnNpb24sIG1lbW9yeQorICAgdXRpbGlzYXRpb24sIGNvbXBhY3RuZXNzIG9mIHByb2dyYW1zLCBzdG9yYWdlIG1hbmFnZW1lbnQgYW5kIGdhcmJhZ2UKKyAgIGNvbGxlY3Rpb24sIGRlYnVnZ2luZyBhbmQgZWRpdGluZyBmYWNpbGl0aWVzLCBwcm9ncmFtIGNoZWNraW5nIGFuZCBoZWxwCisgICBmYWNpbGl0aWVzLCBzeXN0ZW0gcHJvdmlkZWQgcHJlZGljYXRlcywgaW50ZXJmYWNlcyB0byBleHRlcm5hbAorICAgY2FwYWJpbGl0aWVzLCBkb2N1bWVudGF0aW9uIGFuZCBzdXBwb3J0LCBhbW9uZ3N0IG90aGVyIGZhY3RvcnMuCisKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJZ2V0X2NwdV90aW1lKFQpIC0tIFQgaXMgdGhlIGN1cnJlbnQgY3B1IHRpbWUuCisKKwkqKiBUaGlzIGJpdCB3aWxsIHByb2JhYmx5IHJlcXVpcmUgY2hhbmdlcyB0byB3b3JrIG9uIHlvdXIgUHJvbG9nCisJICAgc3lzdGVtLCBzaW5jZSBkaWZmZXJlbnQgc3lzdGVtcyBwcm92aWRlIHRoaXMgZmFjaWxpdHkgaW4KKwkgICBkaWZmZXJlbnQgd2F5cy4gU2VlIHlvdXIgUHJvbG9nIG1hbnVhbCBmb3IgZGV0YWlscy4KKwkqKiBBbHNvIGNoZWNrIHRoZSBjb2RlIGZvciBjYWxjdWxhdGVfbGlwcy80IGJlbG93LgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitnZXRfY3B1X3RpbWUoVCkgOi0gc3RhdGlzdGljcyhydW50aW1lLFtULF9dKS4JLyogUXVpbnR1cyBQcm9sb2cgdmVyc2lvbiAqLworCisvKiBnZXRfY3B1X3RpbWUoVCkgOi0gVCBpcyBjcHV0aW1lLgkJICAgQy1Qcm9sb2cgdmVyc2lvbiAgICAgICAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlucmV2KEwxLEwyKQkgLS0gTDIgaXMgdGhlIGxpc3QgTDEgcmV2ZXJzZWQuCisJYXBwZW5kKEwxLEwyLEwzKSAtLSBMMSBhcHBlbmRlZCB0byBMMiBpcyBMMy4KKwlkYXRhKEwpCQkgLS0gTCBpcyBhIHRoaXJ0eSBlbGVtZW50IGxpc3QuCisKKwlUaGlzIGlzIHRoZSBwcm9ncmFtIGV4ZWN1dGVkIGJ5IHRoZSBiZW5jaG1hcmsuCisJSXQgaXMgY2FsbGVkICJuYWl2ZSByZXZlcnNlIiBiZWNhdXNlIGl0IGlzIGEgdmVyeSBleHBlbnNpdmUgd2F5CisJb2YgcmV2ZXJzaW5nIGEgbGlzdC4gSXRzIGFkdmFudGFnZSwgZm9yIG91ciBwdXJwb3NlcywgaXMgdGhhdAorCWl0IGdlbmVyYXRlcyBhIGxvdCBvZiBwcm9jZWR1cmUgY2FsbHMuIFRvIHJldmVyc2UgYSB0aGlydHkgZWxlbWVudAorCWxpc3QgcmVxdWlyZXMgNDk2IFByb2xvZyBwcm9jZWR1cmUgY2FsbHMuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK25yZXYoW10sW10pLgorbnJldihbWHxSZXN0XSxBbnMpIDotIG5yZXYoUmVzdCxMKSwgY29uY2F0ZW5hdGUoTCxbWF0sQW5zKS4KKworY29uY2F0ZW5hdGUoW10sTCxMKS4KK2NvbmNhdGVuYXRlKFtYfEwxXSxMMixbWHxMM10pIDotIGNvbmNhdGVuYXRlKEwxLEwyLEwzKS4KKworCitkYXRhKFsxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwKKwkJCSAgIDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwXSkuCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWxvdHMgLS0gUnVuIGJlbmNobWFyayB3aXRoIGEgdmFyaWV0eSBvZiBpdGVyYXRpb24gY291bnRzLgorCisJQ2FsbCB0aGlzIHRvIHJ1biB0aGUgYmVuY2htYXJrIHdpdGggaW5jcmVhc2luZyBudW1iZXJzCisJb2YgaXRlcmF0aW9ucy4gVGhlIGZpZ3VyZXMgcHJvZHVjZWQgc2hvdWxkIGJlIGFib3V0IHRoZSBzYW1lIC0KKwlleGNlcHQgdGhhdCB0aGVyZSBtYXkgYmUgaW5hY2N1cmFjaWVzIGF0IGxvdyBpdGVyYXRpb24gbnVtYmVycworCWlmIHRoZSB0aW1lIHRoZXNlIGV4YW1wbGVzIHRha2UgdG8gZXhlY3V0ZSBvbiB5b3VyIG1hY2hpbmUgYXJlCisJdG9vIHNtYWxsIHRvIGJlIHZlcnkgcHJlY2lzZSAoYmVjYXVzZSBvZiB0aGUgYWNjdXJhY3kgdGhlCisJb3BlcmF0aW5nIHN5c3RlbSBpdHNlbGYgaXMgY2FwYWJsZSBvZiBwcm92aWRpbmcpLgorCUlmIHRoZSB0aW1lIHRha2VuIGZvciB0aGVzZSBleGFtcGxlcyBpcyB0b28gbG9uZyBvciBzaG9ydCB0aGVuCisJeW91IHNob3VsZCBhZGp1c3QgdGhlIGVnX2NvdW50KF8pIGZhY3RzLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitsb3RzIDotCisJZWdfY291bnQoQ291bnQpLAorCWJlbmNoKENvdW50KSwKKwlmYWlsLgorbG90cy4KKworZWdfY291bnQoMTApLgorZWdfY291bnQoMjApLgorZWdfY291bnQoNTApLgorZWdfY291bnQoMTAwKS4KK2VnX2NvdW50KDIwMCkuCitlZ19jb3VudCg1MDApLgorZWdfY291bnQoMTAwMCkuCitlZ19jb3VudCgyMDAwKS4KK2VnX2NvdW50KDUwMDApLgorZWdfY291bnQoMTAwMDApLgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwliZW5jaChDb3VudCkgLS0gUnVuIHRoZSBiZW5jaG1hcmsgZm9yIENvdW50IGl0ZXJhdGlvbnMuCisKKwliZW5jaCBwcm92aWRlcyBhIHRlc3QgaGFybmVzcyBmb3IgcnVubmluZyB0aGUgbmFpdmUgcmV2ZXJzZQorCWJlbmNobWFyay4gSXQgaXMgaW1wb3J0YW50IHRvIGZhY3RvciBvdXQgdGhlIG92ZXJoZWFkIG9mIHNldHRpbmcKKwl0aGUgdGVzdCB1cCBhbmQgdXNpbmcgcmVwZWF0KF8pIHRvIGl0ZXJhdGUgdGhlIHJpZ2h0IG51bWJlciBvZgorCXRpbWVzLiBUaGlzIGlzIGRvbmUgYnkgcnVubmluZyBzb21lIGR1bW15IGNvZGUgYXMgd2VsbCB0byBzZWUgaG93CisJbXVjaCB0aW1lIHRoZSBleHRyYSBvcGVyYXRpb25zIHRha2UuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2JlbmNoKENvdW50KSA6LQorCWdldF9jcHVfdGltZShUMCksCisJZG9kdW1teShDb3VudCksCisJZ2V0X2NwdV90aW1lKFQxKSwKKwlkb2JlbmNoKENvdW50KSwKKwlnZXRfY3B1X3RpbWUoVDIpLAorCXJlcG9ydChDb3VudCxUMCxUMSxUMikuCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWRvYmVuY2goQ291bnQpIC0tIG5yZXYgYSAzMCBlbGVtZW50IGxpc3QgQ291bnQgdGltZXMuCisJZG9kdW1teShDb3VudCkgLS0gUGVyZm9ybSB0aGUgb3ZlcmhlYWQgb3BlcmF0aW9ucyBDb3VudCB0aW1lcy4KKwlyZXBlYXQoQ291bnQpICAtLSBQcmVkaWNhdGUgd2hpY2ggc3VjY2VlZHMgQ291bnQgdGltZXMKKworCVRoaXMgaXMgdGhlIHN1cHBvcnRpbmcgY29kZSwgd2hpY2ggaXMgcmVhc29uYWJseSBjbGVhci4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZG9iZW5jaChDb3VudCkgOi0KKwlkYXRhKExpc3QpLAorCXJlcGVhdChDb3VudCksCisJbnJldihMaXN0LF8pLAorCWZhaWwuCitkb2JlbmNoKF8pLgorCisKK2RvZHVtbXkoQ291bnQpIDotCisJZGF0YShMaXN0KSwKKwlyZXBlYXQoQ291bnQpLAorCWR1bW15KExpc3QsXyksCisJZmFpbC4KK2RvZHVtbXkoXykuCisKK2R1bW15KF8sXykuCisKK3JlcGVhdChfTikuCityZXBlYXQoTikgOi0gTiA+IDEsIE4xIGlzIE4tMSwgcmVwZWF0KE4xKS4JCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCXJlcG9ydChDb3VudCxUMCxUMSxUMikgLS0gUmVwb3J0IHRoZSByZXN1bHRzIG9mIHRoZSBiZW5jaG1hcmsuCisJY2FsY3VsYXRlX2xpcHMoQ291bnQsVGltZSxMaXBzLFVuaXRzKSAtLQorCQlEb2luZyBDb3VudCBpbnRlcmF0aW9ucyBpbiBUaW1lIGltcGxpZXMgTGlwcyBsaXBzIGFzc3VtaW5nCisJCXRoYXQgdGltZSBpcyBnaXZlbiBpbiBVbml0cy4KKworCVRoaXMgY2FsY3VsYXRlcyB0aGUgbG9naWNhbCBpbmZlcmVuY2VzIHBlciBzZWNvbmQgKGxpcHMpIGZpZ3VyZS4KKwlSZW1lbWJlciB0aGF0IGl0IHRha2VzIDQ5NiBwcm9jZWR1cmUgY2FsbHMgdG8gbmFpdmUgcmV2ZXJzZSBhCisJdGhpcnR5IGVsZW1lbnQgbGlzdCBvbmNlLiBMaXBzLCB1bmRlciB0aGlzIGJlbmNobWFyaywgdGh1cyBtZWFucworCSJQcm9sb2cgcHJvY2VkdXJlIGNhbGxzIHBlciBzZWNvbmQsIHdoZXJlIHRoZSBwcm9jZWR1cmUgY2FsbHMKKwlhcmUgbm90IHRvbyBjb21wbGV4IChpLmUuIHRob3NlIGZvciBucmV2IGFuZCBhcHBlbmQpIi4KKworCSoqIFRoaXMgdmVyc2lvbiBvZiB0aGUgY29kZSBhc3N1bWVzIHRoYXQgdGhlIHRpbWVzIChUMC4uIGV0YykKKwkgICBhcmUgaW50ZWdlcnMgZ2l2aW5nIHRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcy4gVGhpcyBpcyB0cnVlIGZvcgorCSAgIFF1aW50dXMgUHJvbG9nLiAgWW91ciBQcm9sb2cgc3lzdGVtIG1heSB1c2Ugc29tZSBvdGhlcgorCSAgIHJlcHJlc2VudGF0aW9uLiAgSWYgc28sIHlvdSB3aWxsIG5lZWQgdG8gYWRqdXN0IHRoZSBMaXBzCisJICAgY2FsY3VsYXRpb24uICBUaGVyZSBpcyBhIEMtUHJvbG9nIHZlcnNpb24gYmVsb3cgZm9yIHRoZSBjYXNlCisJICAgd2hlcmUgdGltZXMgYXJlIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgZ2l2aW5nIHRoZSB0aW1lIGluCisJICAgc2Vjb25kcy4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworcmVwb3J0KENvdW50LFQwLFQxLFQyKSA6LQorCVRpbWUxIGlzIFQxLVQwLAorCVRpbWUyIGlzIFQyLVQxLAorCVRpbWUgIGlzIFRpbWUyLVRpbWUxLAkJLyogVGltZSBzcGVudCBvbiBucmV2aW5nIGxpc3RzICovCisJY2FsY3VsYXRlX2xpcHMoQ291bnQsVGltZSxMaXBzLFVuaXRzKSwKKwlubCwKKwl3cml0ZShMaXBzKSwgd3JpdGUoJyBsaXBzIGZvciAnKSwgd3JpdGUoQ291bnQpLAorCXdyaXRlKCcgaXRlcmF0aW9ucyB0YWtpbmcgJyksIHdyaXRlKFRpbWUpLAorCXdyaXRlKCcgJyksIHdyaXRlKFVuaXRzKSwgd3JpdGUoJyAoJyksCisJd3JpdGUoVGltZTItVGltZTEpLCB3cml0ZSgnKScpLAorCW5sLgorCisKKworY2FsY3VsYXRlX2xpcHMoX0NvdW50LFRpbWUsTGlwcywnbXNlY3MnKSA6LSAJLyogVGltZSBjYW4gYmUgMCBmb3Igc21hbGwgKi8KKwlUaW1lIGlzIDAsICEsIExpcHMgaXMgMC4JCS8qIHZhbHVlcyBvZiBDb3VudCEgICAgICAgICovCitjYWxjdWxhdGVfbGlwcyhDb3VudCxUaW1lLExpcHMsJ21zZWNzJykgOi0gCisJTGlwcyAgaXMgKDQ5NipmbG9hdChDb3VudCkqMTAwMCkvVGltZS4KKworLyogLS0tIEMtUHJvbG9nIHZlcnNpb24KKworY2FsY3VsYXRlX2xpcHMoQ291bnQsVGltZSxMaXBzLCdzZWNzJykgOi0gTGlwcyAgaXMgKDQ5NipDb3VudCkvVGltZS4KKworICAgLS0tICovCisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3Mvc3JjL2JlbmNoLnBsIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9zcmMvYmVuY2gucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJlNWFjMQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3Mvc3JjL2JlbmNoLnBsCkBAIC0wLDAgKzEsMjAxIEBACisvKiBCRU5DSC5QTCA6IFRoZSBjbGFzc2ljIFByb2xvZyBiZW5jaG1hcmsKKworCVN1cHBsaWVkIGJ5IFF1aW50dXMgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLgorCUFwcmlsIDMwdGggMTk4NAorKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgVGhpcyBiZW5jaG1hcmsgZ2l2ZXMgdGhlIHJhdyBzcGVlZCBvZiBhIFByb2xvZyBzeXN0ZW0uCisKKyAgIFRoZSBtZWFzdXJlIG9mIGxvZ2ljYWwgaW5mZXJlbmNlcyBwZXIgc2Vjb25kIChMaXBzKSB1c2VkIGhlcmUgaXMgdGFrZW4gdG8KKyAgIGJlIHByb2NlZHVyZSBjYWxscyBwZXIgc2Vjb25kIG92ZXIgYW4gZXhhbXBsZSB3aXRoIG5vdCB2ZXJ5IGNvbXBsZXgKKyAgIHByb2NlZHVyZSBjYWxscy4gVGhlIGV4YW1wbGUgdXNlZCBpcyB0aGF0IG9mICJuYWl2ZSByZXZlcnNpbmciIGEgbGlzdCwKKyAgIHdoaWNoIGlzIGFuIGV4cGVuc2l2ZSwgYW5kIHRoZXJlZm9yZSBzdHVwaWQsIHdheSBvZiByZXZlcnNpbmcgYSBsaXN0LiAgSXQKKyAgIGRvZXMsIGhvd2V2ZXIsIHByb2R1Y2UgYSBsb3Qgb2YgcHJvY2VkdXJlIGNhbGxzLiAoSW4gdGhlb3JldGljYWwgdGVybXMsCisgICB0aGlzIGFsZ29yaXRobSBpcyBPKG5eMikgb24gdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCkuCisKKyAgIFRoZSB1c2Ugb2YgYSBzaW5nbGUgc2ltcGxlIGJlbmNobWFyayBsaWtlIHRoaXMgY2Fubm90LCBvZiBjb3Vyc2UsIGJlCisgICB0YWtlbiB0byBzaWduaWZ5IGEgZ3JlYXQgZGVhbC4gSG93ZXZlciwgZXhwZXJpZW5jZSBoYXMgc2hvd24gdGhhdCB0aGlzCisgICBiZW5jaG1hcmsgZG9lcyBwcm92aWRlIGEgdmVyeSBnb29kIG1lYXN1cmUgb2YgYmFzaWMgUHJvbG9nIHNwZWVkIGFuZAorICAgcHJvZHVjZXMgZmlndXJlcyB3aGljaCBtYXRjaCBtb3JlIGNvbXBsZXggYmVuY2htYXJrcy4gVGhlIHJlYXNvbiBmb3IKKyAgIHRoaXMgaXMgdGhhdCB0aGUgYmFzaWMgb3BlcmF0aW9ucyBwZXJmb3JtZWQgaGVyZTogcHJvY2VkdXJlIGNhbGxzIHdpdGggYQorICAgY2VydGFpbiBhbW91bnQgb2YgZGF0YSBzdHJ1Y3R1cmUgYWNjZXNzIGFuZCBjb25zdHJ1Y3Rpb247IGFyZSBhYnNvbHV0ZWx5CisgICBmdW5kYW1lbnRhbCB0byBQcm9sb2cgZXhlY3V0aW9uLiBJZiB0aGVzZSBhcmUgZG9uZSByaWdodCwgdGhlbiBtb3JlCisgICBjb21wbGV4IGJlbmNobWFya3MgdGVuZCB0byBzY2FsZSBhY2NvcmRpbmdseS4gVGhpcyBwYXJ0aWN1bGFyIGJlbmNobWFyaworICAgaGFzIHRodXMgYmVlbiB1c2VkIGFzIGEgZ29vZCBydWxlIG9mIHRodW1iIGJ5IFByb2xvZyBpbXBsZW1lbnRvcnMgZm9yCisgICBvdmVyIGEgZGVjYWRlIGFuZCBmb3JtcyBhIHBhcnQgb2YgdGhlIHVud3JpdHRlbiBQcm9sb2cgZm9sa2xvcmUuIFNvIC0KKyAgIHVzZSB0aGlzIGJlbmNobWFyaywgd2l0aCB0aGlzIGluIG1pbmQsIGFzIGEgcXVpY2ssIGJ1dCBleHRyZW1lbHkgdXNlZnVsLAorICAgdGVzdCBvZiBQcm9sb2cgcGVyZm9ybWFuY2UuCisKKyAgIEluIGEgY29tcGxldGUgZXZhbHVhdGlvbiBvZiBhIFByb2xvZyBzeXN0ZW0geW91IHNob3VsZCBhbHNvIGJlIHRha2luZworICAgYWNjb3VudCBzcGVlZHMgb2YgYXNzZXJ0aW5nIGFuZCBjb21waWxpbmcsIHRhaWwgcmVjdXJzaW9uLCBtZW1vcnkKKyAgIHV0aWxpc2F0aW9uLCBjb21wYWN0bmVzcyBvZiBwcm9ncmFtcywgc3RvcmFnZSBtYW5hZ2VtZW50IGFuZCBnYXJiYWdlCisgICBjb2xsZWN0aW9uLCBkZWJ1Z2dpbmcgYW5kIGVkaXRpbmcgZmFjaWxpdGllcywgcHJvZ3JhbSBjaGVja2luZyBhbmQgaGVscAorICAgZmFjaWxpdGllcywgc3lzdGVtIHByb3ZpZGVkIHByZWRpY2F0ZXMsIGludGVyZmFjZXMgdG8gZXh0ZXJuYWwKKyAgIGNhcGFiaWxpdGllcywgZG9jdW1lbnRhdGlvbiBhbmQgc3VwcG9ydCwgYW1vbmdzdCBvdGhlciBmYWN0b3JzLgorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWdldF9jcHVfdGltZShUKSAtLSBUIGlzIHRoZSBjdXJyZW50IGNwdSB0aW1lLgorCisJKiogVGhpcyBiaXQgd2lsbCBwcm9iYWJseSByZXF1aXJlIGNoYW5nZXMgdG8gd29yayBvbiB5b3VyIFByb2xvZworCSAgIHN5c3RlbSwgc2luY2UgZGlmZmVyZW50IHN5c3RlbXMgcHJvdmlkZSB0aGlzIGZhY2lsaXR5IGluCisJICAgZGlmZmVyZW50IHdheXMuIFNlZSB5b3VyIFByb2xvZyBtYW51YWwgZm9yIGRldGFpbHMuCisJKiogQWxzbyBjaGVjayB0aGUgY29kZSBmb3IgY2FsY3VsYXRlX2xpcHMvNCBiZWxvdy4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZ2V0X2NwdV90aW1lKFQpIDotIHN0YXRpc3RpY3MocnVudGltZSxbVCxfXSkuCS8qIFF1aW50dXMgUHJvbG9nIHZlcnNpb24gKi8KKworLyogZ2V0X2NwdV90aW1lKFQpIDotIFQgaXMgY3B1dGltZS4JCSAgIEMtUHJvbG9nIHZlcnNpb24gICAgICAgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJbnJldihMMSxMMikJIC0tIEwyIGlzIHRoZSBsaXN0IEwxIHJldmVyc2VkLgorCWFwcGVuZChMMSxMMixMMykgLS0gTDEgYXBwZW5kZWQgdG8gTDIgaXMgTDMuCisJZGF0YShMKQkJIC0tIEwgaXMgYSB0aGlydHkgZWxlbWVudCBsaXN0LgorCisJVGhpcyBpcyB0aGUgcHJvZ3JhbSBleGVjdXRlZCBieSB0aGUgYmVuY2htYXJrLgorCUl0IGlzIGNhbGxlZCAibmFpdmUgcmV2ZXJzZSIgYmVjYXVzZSBpdCBpcyBhIHZlcnkgZXhwZW5zaXZlIHdheQorCW9mIHJldmVyc2luZyBhIGxpc3QuIEl0cyBhZHZhbnRhZ2UsIGZvciBvdXIgcHVycG9zZXMsIGlzIHRoYXQKKwlpdCBnZW5lcmF0ZXMgYSBsb3Qgb2YgcHJvY2VkdXJlIGNhbGxzLiBUbyByZXZlcnNlIGEgdGhpcnR5IGVsZW1lbnQKKwlsaXN0IHJlcXVpcmVzIDQ5NiBQcm9sb2cgcHJvY2VkdXJlIGNhbGxzLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitucmV2KFtdLFtdKS4KK25yZXYoW1h8UmVzdF0sQW5zKSA6LSBucmV2KFJlc3QsTCksIGNvbmNhdGVuYXRlKEwsW1hdLEFucykuCisKK2NvbmNhdGVuYXRlKFtdLEwsTCkuCitjb25jYXRlbmF0ZShbWHxMMV0sTDIsW1h8TDNdKSA6LSBjb25jYXRlbmF0ZShMMSxMMixMMykuCisKKworZGF0YShbMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsCisJCQkgICAyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMF0pLgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlsb3RzIC0tIFJ1biBiZW5jaG1hcmsgd2l0aCBhIHZhcmlldHkgb2YgaXRlcmF0aW9uIGNvdW50cy4KKworCUNhbGwgdGhpcyB0byBydW4gdGhlIGJlbmNobWFyayB3aXRoIGluY3JlYXNpbmcgbnVtYmVycworCW9mIGl0ZXJhdGlvbnMuIFRoZSBmaWd1cmVzIHByb2R1Y2VkIHNob3VsZCBiZSBhYm91dCB0aGUgc2FtZSAtCisJZXhjZXB0IHRoYXQgdGhlcmUgbWF5IGJlIGluYWNjdXJhY2llcyBhdCBsb3cgaXRlcmF0aW9uIG51bWJlcnMKKwlpZiB0aGUgdGltZSB0aGVzZSBleGFtcGxlcyB0YWtlIHRvIGV4ZWN1dGUgb24geW91ciBtYWNoaW5lIGFyZQorCXRvbyBzbWFsbCB0byBiZSB2ZXJ5IHByZWNpc2UgKGJlY2F1c2Ugb2YgdGhlIGFjY3VyYWN5IHRoZQorCW9wZXJhdGluZyBzeXN0ZW0gaXRzZWxmIGlzIGNhcGFibGUgb2YgcHJvdmlkaW5nKS4KKwlJZiB0aGUgdGltZSB0YWtlbiBmb3IgdGhlc2UgZXhhbXBsZXMgaXMgdG9vIGxvbmcgb3Igc2hvcnQgdGhlbgorCXlvdSBzaG91bGQgYWRqdXN0IHRoZSBlZ19jb3VudChfKSBmYWN0cy4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworbG90cyA6LQorCWVnX2NvdW50KENvdW50KSwKKwliZW5jaChDb3VudCksCisJZmFpbC4KK2xvdHMuCisKK2VnX2NvdW50KDEwKS4KK2VnX2NvdW50KDIwKS4KK2VnX2NvdW50KDUwKS4KK2VnX2NvdW50KDEwMCkuCitlZ19jb3VudCgyMDApLgorZWdfY291bnQoNTAwKS4KK2VnX2NvdW50KDEwMDApLgorZWdfY291bnQoMjAwMCkuCitlZ19jb3VudCg1MDAwKS4KK2VnX2NvdW50KDEwMDAwKS4KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJYmVuY2goQ291bnQpIC0tIFJ1biB0aGUgYmVuY2htYXJrIGZvciBDb3VudCBpdGVyYXRpb25zLgorCisJYmVuY2ggcHJvdmlkZXMgYSB0ZXN0IGhhcm5lc3MgZm9yIHJ1bm5pbmcgdGhlIG5haXZlIHJldmVyc2UKKwliZW5jaG1hcmsuIEl0IGlzIGltcG9ydGFudCB0byBmYWN0b3Igb3V0IHRoZSBvdmVyaGVhZCBvZiBzZXR0aW5nCisJdGhlIHRlc3QgdXAgYW5kIHVzaW5nIHJlcGVhdChfKSB0byBpdGVyYXRlIHRoZSByaWdodCBudW1iZXIgb2YKKwl0aW1lcy4gVGhpcyBpcyBkb25lIGJ5IHJ1bm5pbmcgc29tZSBkdW1teSBjb2RlIGFzIHdlbGwgdG8gc2VlIGhvdworCW11Y2ggdGltZSB0aGUgZXh0cmEgb3BlcmF0aW9ucyB0YWtlLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitiZW5jaChDb3VudCkgOi0KKwlnZXRfY3B1X3RpbWUoVDApLAorCWRvZHVtbXkoQ291bnQpLAorCWdldF9jcHVfdGltZShUMSksCisJZG9iZW5jaChDb3VudCksCisJZ2V0X2NwdV90aW1lKFQyKSwKKwlyZXBvcnQoQ291bnQsVDAsVDEsVDIpLgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlkb2JlbmNoKENvdW50KSAtLSBucmV2IGEgMzAgZWxlbWVudCBsaXN0IENvdW50IHRpbWVzLgorCWRvZHVtbXkoQ291bnQpIC0tIFBlcmZvcm0gdGhlIG92ZXJoZWFkIG9wZXJhdGlvbnMgQ291bnQgdGltZXMuCisJcmVwZWF0KENvdW50KSAgLS0gUHJlZGljYXRlIHdoaWNoIHN1Y2NlZWRzIENvdW50IHRpbWVzCisKKwlUaGlzIGlzIHRoZSBzdXBwb3J0aW5nIGNvZGUsIHdoaWNoIGlzIHJlYXNvbmFibHkgY2xlYXIuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2RvYmVuY2goQ291bnQpIDotCisJZGF0YShMaXN0KSwKKwlyZXBlYXQoQ291bnQpLAorCW5yZXYoTGlzdCxfKSwKKwlmYWlsLgorZG9iZW5jaChfKS4KKworCitkb2R1bW15KENvdW50KSA6LQorCWRhdGEoTGlzdCksCisJcmVwZWF0KENvdW50KSwKKwlkdW1teShMaXN0LF8pLAorCWZhaWwuCitkb2R1bW15KF8pLgorCitkdW1teShfLF8pLgorCityZXBlYXQoX04pLgorcmVwZWF0KE4pIDotIE4gPiAxLCBOMSBpcyBOLTEsIHJlcGVhdChOMSkuCQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlyZXBvcnQoQ291bnQsVDAsVDEsVDIpIC0tIFJlcG9ydCB0aGUgcmVzdWx0cyBvZiB0aGUgYmVuY2htYXJrLgorCWNhbGN1bGF0ZV9saXBzKENvdW50LFRpbWUsTGlwcyxVbml0cykgLS0KKwkJRG9pbmcgQ291bnQgaW50ZXJhdGlvbnMgaW4gVGltZSBpbXBsaWVzIExpcHMgbGlwcyBhc3N1bWluZworCQl0aGF0IHRpbWUgaXMgZ2l2ZW4gaW4gVW5pdHMuCisKKwlUaGlzIGNhbGN1bGF0ZXMgdGhlIGxvZ2ljYWwgaW5mZXJlbmNlcyBwZXIgc2Vjb25kIChsaXBzKSBmaWd1cmUuCisJUmVtZW1iZXIgdGhhdCBpdCB0YWtlcyA0OTYgcHJvY2VkdXJlIGNhbGxzIHRvIG5haXZlIHJldmVyc2UgYQorCXRoaXJ0eSBlbGVtZW50IGxpc3Qgb25jZS4gTGlwcywgdW5kZXIgdGhpcyBiZW5jaG1hcmssIHRodXMgbWVhbnMKKwkiUHJvbG9nIHByb2NlZHVyZSBjYWxscyBwZXIgc2Vjb25kLCB3aGVyZSB0aGUgcHJvY2VkdXJlIGNhbGxzCisJYXJlIG5vdCB0b28gY29tcGxleCAoaS5lLiB0aG9zZSBmb3IgbnJldiBhbmQgYXBwZW5kKSIuCisKKwkqKiBUaGlzIHZlcnNpb24gb2YgdGhlIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSB0aW1lcyAoVDAuLiBldGMpCisJICAgYXJlIGludGVnZXJzIGdpdmluZyB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMuIFRoaXMgaXMgdHJ1ZSBmb3IKKwkgICBRdWludHVzIFByb2xvZy4gIFlvdXIgUHJvbG9nIHN5c3RlbSBtYXkgdXNlIHNvbWUgb3RoZXIKKwkgICByZXByZXNlbnRhdGlvbi4gIElmIHNvLCB5b3Ugd2lsbCBuZWVkIHRvIGFkanVzdCB0aGUgTGlwcworCSAgIGNhbGN1bGF0aW9uLiAgVGhlcmUgaXMgYSBDLVByb2xvZyB2ZXJzaW9uIGJlbG93IGZvciB0aGUgY2FzZQorCSAgIHdoZXJlIHRpbWVzIGFyZSBmbG9hdGluZyBwb2ludCBudW1iZXJzIGdpdmluZyB0aGUgdGltZSBpbgorCSAgIHNlY29uZHMuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3JlcG9ydChDb3VudCxUMCxUMSxUMikgOi0KKwlUaW1lMSBpcyBUMS1UMCwKKwlUaW1lMiBpcyBUMi1UMSwKKwlUaW1lICBpcyBUaW1lMi1UaW1lMSwJCS8qIFRpbWUgc3BlbnQgb24gbnJldmluZyBsaXN0cyAqLworCWNhbGN1bGF0ZV9saXBzKENvdW50LFRpbWUsTGlwcyxVbml0cyksCisJbmwsCisJd3JpdGUoTGlwcyksIHdyaXRlKCcgbGlwcyBmb3IgJyksIHdyaXRlKENvdW50KSwKKwl3cml0ZSgnIGl0ZXJhdGlvbnMgdGFraW5nICcpLCB3cml0ZShUaW1lKSwKKwl3cml0ZSgnICcpLCB3cml0ZShVbml0cyksIHdyaXRlKCcgKCcpLAorCXdyaXRlKFRpbWUyLVRpbWUxKSwgd3JpdGUoJyknKSwKKwlubC4KKworCisKK2NhbGN1bGF0ZV9saXBzKF9Db3VudCxUaW1lLExpcHMsJ21zZWNzJykgOi0gCS8qIFRpbWUgY2FuIGJlIDAgZm9yIHNtYWxsICovCisJVGltZSBpcyAwLCAhLCBMaXBzIGlzIDAuCQkvKiB2YWx1ZXMgb2YgQ291bnQhICAgICAgICAqLworY2FsY3VsYXRlX2xpcHMoQ291bnQsVGltZSxMaXBzLCdtc2VjcycpIDotIAorCUxpcHMgIGlzICg0OTYqZmxvYXQoQ291bnQpKjEwMDApL1RpbWUuCisKKy8qIC0tLSBDLVByb2xvZyB2ZXJzaW9uCisKK2NhbGN1bGF0ZV9saXBzKENvdW50LFRpbWUsTGlwcywnc2VjcycpIDotIExpcHMgIGlzICg0OTYqQ291bnQpL1RpbWUuCisKKyAgIC0tLSAqLworCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL3NyYy9kb2JyeS50eHQgYi9leGFtcGxlcy9iZW5jaG1hcmtzL3NyYy9kb2JyeS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY3YTM3ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3Mvc3JjL2RvYnJ5LnR4dApAQCAtMCwwICsxLDQ3OCBAQAorCitSZWNlaXZlZDogZnJvbSBhc2hlLmNzLnRjZC5pZSBieSBjcy50Y2QuaWUgKFBNREYgIzEyMDUwKSBpZAorIDwwMUdMMzlIS1lORU85QlZSNVJAY3MudGNkLmllPjsgVGh1LCAxMSBKdW4gMTk5MiAxMzo0OCBHTVQKK1JlY2VpdmVkOiBieSBhc2hlLmNzLnRjZC5pZSAoNS41Ny9VbHRyaXgzLjAtQykgaWQgQUExNDY4MDsgVGh1LAorIDExIEp1biA5MiAxMzo1MDowNSArMDEwMAorUmVjZWl2ZWQ6IGZyb20gc2NvcnBpby5lY3JjLmRlIGJ5IGVjcmMuZGUgd2l0aCBTTVRQIGlkIEFBMTc3MjUgKDUuNjVjL0lEQS0xLjQuNAorIGZvciA8YnJhZHlAY3MudGNkLmllPik7IFRodSwgMTEgSnVuIDE5OTIgMTQ6NDk6NTEgKzAyMDAKK1JlY2VpdmVkOiBmcm9tIGphbnVzNi5lY3JjIGJ5IHNjb3JwaW8uZWNyYy5kZSAoNC4xL1NNSS0zLjIpIGlkIEFBMTU3NDA7IFRodSwKKyAxMSBKdW4gOTIgMTQ6NDk6NDkgKzAyMDAKK1JlY2VpdmVkOiBieSBqYW51czYuZWNyYyAoNC4xL1NNSS00LjEpIGlkIEFBMDM4ODY7IFRodSwgMTEgSnVuIDkyIDE0OjQ5OjQ3ICswMjAwCitEYXRlOiBUaHUsIDExIEp1biA5MiAxNDo0OTo0OSArMDIwMAorRnJvbTogSmFjcXVlcyBOb3llIDxKYWNxdWVzLk5veWVAZWNyYy5kZT4KK1N1YmplY3Q6IFJlOiBNYWNoaW5lIHJlYWRhYmxlIHN0YW5kYXJkIGJlbmNobWFya3M/CitUbzogYnJhZHlAY3MudGNkLmllIChCcmFkeSBNaWNoYWVsKQorTWVzc2FnZS1JZDogPDkyMDYxMTEyNDkuQUExNTc0MEBzY29ycGlvLmVjcmMuZGU+CitYLUVudmVsb3BlLVRvOiBicmFkeUBhc2hlLmNzLnRjZC5pZQorCitIZXJlIGl0IGlzLCBJIGhvcGUgKEkgdGhpbmsgSSBoYXZlIGxlZnQgdGhlIGNvZGUgdW50b3VjaGVkLCBidXQgSSBhbSBub3QgMTAwJQorc3VyZSkuIEl0IGNvbWVzIGZyb20gVGVwIERvYnJ5IHdoZW4gaGUgd2FzIGF0IFVDQi4KKworQnkgdGhlIHdheSwgdGhlc2UgYmVuY2htYXJrcyBhcmUgc29tZWhvdyBvdXRkYXRlZC4gRG8geW91IGtub3cgYWJvdXQgdGhlCitiZW5jaG1hcmsKK3N1aXRlIHVzZWQgZm9yIGFzc2Vzc2luZyB0aGUgQkFNIGFuZCB0aGUgQXF1YXJpdXMgUHJvbG9nIENvbXBpbGVyPyBJdCBpcworYXZhaWxhYmxlIGJ5IGFub255bW91cyBGVFAgZnJvbSBVQ0IuIFRoZSBzdWl0ZSBvZiBGLiBQZXJlaXJhIChwdWJsaXNoZWQKK29uIHRoZSBuZXQgaW4gODYgb3IgODcpIGlzIGFsc28gcXVpdGUgaW50ZXJlc3RpbmcgKGl0IHRyaWVzIHRvIHRlc3QKK3NwZWNpZmljIG9wZXJhdGlvbnMsCit1bmlmaWNhdGlvbiwgaW5kZXhpbmcsIGJhY2t0cmFja2luZy4uLikuCisKKy0tIEphY3F1ZXMgTk9ZRQorCisKKworRnJvbTogKFRlcCBEb2JyeSkgVGVwJXVjYmRhbGlAQmVya2VsZXkgCitTdWJqZWN0OiBUaGUgQmVya2VsZXkgUExNIEJlbmNobWFya3MKK0RhdGU6ICAgIFdlZG5lc2RheSwgTWF5IDIyIDE5ODUKKworICAgICBBdCB0aGUgV2FycmVuIEFic3RyYWN0IE1hY2hpbmUgV29ya3Nob3AgYSBmZXcgd2Vla3MgYWdvCitJICB3YXMgIGFza2VkIHRvIHB1Ymxpc2ggdGhlIHNldCBvZiBiZW5jaG1hcmtzIHByb2dyYW1zIEkndmUKK2JlZW4gIHVzaW5nICBvbiAgbXkgIHNpbXVsYXRvciAgZm9yICB0aGUgICBCZXJrZWxleSAgIFByb2xvZworTWFjaGluZShQTE0pLiAgSSd2ZSAgZmluYWxseSBnb3QgdGhlbSBhbGwgY29sbGVjdGVkIHRvZ2V0aGVyCitpbiBQcm9sb2cgZm9ybSAoQ1Byb2xvZykgYW5kIGhhdmUgc2VudCB0aGVtIHRvICB0aGUgIERpZ2VzdC4KK1RoZXkncmUgIHJlYWxseSAgdG9vICBiaWcgIHRvIGp1c3QgcHVibGlzaCBpbiB0aGUgRGlnZXN0LCBzbwordGhleSBhcmUgYmVpbmcgc2V0IHVwIGluIGEgZGlyZWN0b3J5IGluIHRoZSBQUk9MT0cgZGlyZWN0b3J5CithdCAgU1UtU0NPUkUuICBUaGVyZSBhcmUgMTEgZmlsZXMgd2l0aCBhIHRvdGFsIG9mIDQwMCBsaW5lcy4KK1NpbmNlIG91ciBtYWNoaW5lIGlzIGJhc2VkIG9uIGNvbXBpbGVkIFByb2xvZywgdGhlIHRvcCBsZXZlbAorcXVlcmllcyAgYXJlICBhbHNvICBjb21waWxlZCAgaW4sIGdlbmVyYWxseSBhcyB0aGUgcHJlZGljYXRlCittYWluLzAuCisKKyAgICAgVGhlIGJlbmNobWFya3Mgd2VyZSBwcmltYXJpbHkgY2hvc2VuIHRvIGV4ZXJjaXNlIGFsbCBvZgordGhlICBmZWF0dXJlcyBvZiB0aGUgUExNLCBub3QgZm9yIGFueSBjb21wbGV4aXR5IG9mIHByb2dyYW0tCittaW5nLiBBYm91dCBoYWxmIG9mIHRoZW0gY29tZSBmcm9tIFdhcnJlbidzIHRoZXNpcywgYW5kICB0aGUKK290aGVycyAgd2UndmUgIGFkZGVkIGhlcmUuICBPdXIgb3JpZ2luYWwgcGVyZm9ybWFuY2UgZmlndXJlcword2VyZSBiYXNlZCBvbiBzaW11bGF0aW9ucyBvZiBoYW5kIGNvbXBpbGVkIHZlcnNpb25zIG9mIHRoZXNlCitiZW5jaG1hcmtzLiAgIFdlIGFyZSBjdXJyZW50bHkgbG9va2luZyBmb3IgbGFyZ2VyLCBtb3JlIGNvbS0KK3BsZXggYmVuY2htYXJrcyB0byBydW4gb24gdGhlIGhhcmR3YXJlIHdoZW4gaXQgaXMgYXZhaWxhYmxlLgorU28gIEknZCAgYmUgIGludGVyZXN0ZWQgIHNlZWluZyBsYXJnZSBiZW5jaG1hcmtzIHNlbnQgdG8gdGhlCitEaWdlc3QuCisKKy0tIFRlcCBEb2JyeSAoVEVQQEJlcmtlbGV5KQorCisKKyUJY29uY2F0IChjb24xLCBjb242KQorJQlUaGVzZSB0d28gdGVzdHMgYXJlIHNpbXBsZSBleGFtcGxlcyBvZiB0aGUgY29uY2F0IHByZWRpY2F0ZQorJQljb24xIGlzIGRldGVybWluYXRlLCBjb242IGlzIG5vbi1kZXRlcm1pbmF0ZSBnZXR0aW5nIGFsbCA2IGFuc3dlcnMKKworY29uMSA6LSBjb25jYXQoW2EsYixjXSxbZCxlXSxYKSwgICUgY29uMQorCXdyaXRlKFgpLG5sLgorY29uNiA6LSBjb25jYXQoWCxZLFthLGIsYyxkLGVdKSwgICUgY29uNgorCXdyaXRlKFgpLG5sLAorCXdyaXRlKFkpLG5sLG5sLAorCWZhaWwuCisKK2NvbmNhdChbXSxMLEwpLgorY29uY2F0KFtYfEwxXSxMMixbWHxMM10pIDotIGNvbmNhdChMMSxMMixMMykuCisKKworJQlkaWZmZXJlbiAodGltZXMxMCxkaXZpZGUxMCxsb2cxMCxvcHM4KQorJQlUaGVzZSA0IGV4YW1wbGVzIGFyZSBmcm9tIFdhcnJlbidzIHRoZXNpcworCitkaWZmIDotCisJdGltZXMxMChJMSksCisJZChJMSx4LEQxKSwKKwl3cml0ZShEMSksIG5sLAorCWRpdmlkZTEwKEkyKSwKKwlkKEkyLHgsRDIpLAorCXdyaXRlKEQyKSwgbmwsCisJbG9nMTAoSTMpLAorCWQoSTMseCxEMyksCisJd3JpdGUoRDMpLCBubCwKKwlvcHM4KEk0KSwKKwlkKEk0LHgsRDQpLAorCXdyaXRlKEQ0KSwgbmwuCisKK2QoVStWLFgsRFUrRFYpIDotICEsIGQoVSxYLERVKSwgZChWLFgsRFYpLgorZChVLVYsWCxEVS1EVikgOi0gISwgZChVLFgsRFUpLCBkKFYsWCxEVikuCitkKFUqVixYLERVKlYrVSpEVikgOi0gISwgZChVLFgsRFUpLCBkKFYsWCxEVikuCitkKFUvVixYLChEVSpWLVUqRFYpLyheKFYsMikpKSA6LSAhLCBkKFUsWCxEVSksIGQoVixYLERWKS4KK2QoXihVLE4pLFgsRFUqTiooXihVLE4xKSkpIDotICEsIGludGVnZXIoTiksIE4xIGlzIE4gLSAxLCBkKFUsWCxEVSkuCitkKC1VLFgsLURVKSA6LSAhLCBkKFUsWCxEVSkuCitkKGV4cChVKSxYLGV4cChVKSpEVSkgOi0gISwgZChVLFgsRFUpLgorZChsb2coVSksWCxEVS9VKSA6LSAhLCBkKFUsWCxEVSkuCitkKFgsWCwxKS4JJSBUaGVyZSBpcyBhIGN1dCBpbiBXYXJyZW4ncyBwcm9ncmFtISAtLSBKYWNxdWVzCitkKEMsWCwwKS4KKwordGltZXMxMCggKCgoKCgoKCh4KngpKngpKngpKngpKngpKngpKngpKngpKnggKS4KK2RpdmlkZTEwKCAoKCgoKCgoKHgveCkveCkveCkveCkveCkveCkveCkveCkveCApLgorbG9nMTAoIGxvZyhsb2cobG9nKGxvZyhsb2cobG9nKGxvZyhsb2cobG9nKGxvZyh4KSkpKSkpKSkpKSApLgorb3BzOCggKHgrMSkqKCheKHgsMikrMikqKF4oeCwzKSszKSkgKS4KKworCisKKyUJdG93ZXJzIG9mIGhhbm9pICggaGFub2kgKSBmb3IgOCBkaXNrcworCitoYW5vaSA6LSBoYW5vaSg4KS4KKworaGFub2koTikgOi0gbW92ZShOLGxlZnQsY2VudGVyLHJpZ2h0KS4KKworbW92ZSgwLF8sXyxfKSA6LSAhLgorbW92ZShOLEEsQixDKSA6LSBNIGlzIE4tMSwgbW92ZShNLEEsQyxCKSwgaW5mb3JtKEEsQiksIG1vdmUoTSxDLEIsQSkuCisKK2luZm9ybShBLEIpIDotIHdyaXRlKFttb3ZlLGRpc2ssZnJvbSxBLHRvLEJdKSwgbmwsIGZhaWwuCitpbmZvcm0oXyxfKS4KKworCislIE1haW4gcHJvZ3JhbSB0byBkbyBicmFuY2ggYW5kIGJvdW5kIE5BTkQgZ2F0ZSBkZXNpZ25zLgorJSBPcHRpbWl6ZWQgZm9yIDItaW5wdXQgTkFORCBnYXRlcyBhbmQgMyBpbnB1dCB2YXJpYWJsZXMuCislIEEuIERlc3BhaW4sIEZlYiA4NC4KKyUgSW4gdGhpcyBjYXNlLCBkZXNpZ24gYSAyLTEgTVVYIChja3QyKQorCittYWluIDotIHNldF9ib3VuZCgzMjAwMCksIHVwZGF0ZV9jaXJjdWl0KFtdLDApLCByKDAsIFswLDAsMSwxLDAsMSwwLDFdKS4KKworcnVuKERlcHRoLCBUYWJsZSwgQ2lyY3VpdCwgQ29zdCwgRGVwdGgpIDotIHNlYXJjaChEZXB0aCwgVGFibGUpLAorCQkJCQkgICBjaXJjdWl0KENpcmN1aXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcmN1aXRcPT1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0X2JvdW5kKENvc3QpLCEuCitydW4oRGVwdGgsIFRhYmxlLCBDaXJjdWl0LCBDb3N0LCBEZWxheSkgOi0gRCBpcyBEZXB0aCArIDEsCisgICAgcnVuKEQsIFRhYmxlLCBDaXJjdWl0LCBDb3N0LCBEZWxheSksIS4KKworc2VhcmNoKERlcHRoLCBUYWJsZSkgOi0gdChEZXB0aCwgQ2lyY3VpdCwgVGFibGUsIDAsIENvc3Rfb3V0KSwKKwkJCXVwZGF0ZV9jaXJjdWl0KENpcmN1aXQsQ29zdF9vdXQpLAorCQkJdXBkYXRlX2JvdW5kKENvc3Rfb3V0KS4KKworJSBJbnB1dCBzaWduYWxzIGFyZSBmcmVlIGFuZCB0ZXJtaW5hdGUgdGhlIHNlYXJjaC4KK3QoXywgMCAsIFswLDEsMCwxLDAsMSwwLDFdLEMsQykuCit0KF8sIDEgLCBbMCwwLDEsMSwwLDAsMSwxXSxDLEMpLgordChfLCAyICwgWzAsMCwwLDAsMSwxLDEsMV0sQyxDKS4KK3QoXyxpMCAsIFsxLDAsMSwwLDEsMCwxLDBdLEMsQykuCit0KF8saTEgLCBbMSwxLDAsMCwxLDEsMCwwXSxDLEMpLgordChfLGkyICwgWzEsMSwxLDEsMCwwLDAsMF0sQyxDKS4KKworJSBJbnZlcnRlcnMgYXJlIGZyZWUgaW4gdGhpcyBtb2RlbC4KK3QoRGVwdGgsIFtpLFpdLCBUYWJsZSwgQ2luLCBDb3V0KSA6LSBEZXB0aCA+IDAsCisJCQkJIEQgaXMgRGVwdGggLTEsCisJCQkJIHNpbnQoVGFibGUsIEl0YWJsZSksCisJCQkJIHQoRCwgWiwgSXRhYmxlLCBDaW4sIENvdXQpLgorCislIE1haW4gTkFORCBnYXRlIGNsYXVzZS4KK3QoRGVwdGgsIFtuLFksWl0sIFRhYmxlLCBDaW4sIENvdXQpIDotIERlcHRoID4gMCwKKwkJCQkgRCBpcyBEZXB0aCAtMSwKKwkJCQkgdXBkYXRlX2Nvc3QoQ2luLDEsQzIpLAorCQkJCSBuZ2F0ZShUYWJsZSwgQSwgQiksCisJCQkJIHQoRCxZLEEsQzIsQzMpLAorCQkJCSB0KEQsWixCLEMzLENvdXQpLgorCislIEludmVydGVyIHNpZ25hbCB0cmFuc2Zvcm1hdGlvbi4KKyVzaW50KFtIMSwuLlQxXSxbSDIsLi5UMl0pIDotIGludihIMSwgSDIpLCBzaW50KFQxLCBUMikuCitzaW50KFtdLFtdKS4KK3NpbnQoW1gsLi5UMV0sW18sLi5UMl0pIDotIHZhcihYKSwgc2ludChUMSwgVDIpLCEuCitzaW50KFswLC4uVDFdLFsxLC4uVDJdKSA6LSBzaW50KFQxLCBUMikuCitzaW50KFsxLC4uVDFdLFswLC4uVDJdKSA6LSBzaW50KFQxLCBUMikuCisKKyUgT3B0aW1pemVkIGdhdGUgc2lnbmFsIHRyYW5zZm9ybWF0aW9uLgorbmdhdGUoW10sIFtdLCBbXSkuCit0Z2F0ZShbXSwgW10sIFtdKS4KK25nYXRlKFtYLC4uVDBdLCBbXywuLlQxXSwgW18sLi5UMl0pIDotIHZhcihYKSwgISwgbmdhdGUoVDAsIFQxLCBUMikuCituZ2F0ZShbWCwuLlQwXSwgWzEsLi5UMV0sIFsxLC4uVDJdKSA6LSBYPT0wLCBuZ2F0ZShUMCwgVDEsIFQyKS4KK25nYXRlKFtYLC4uVDBdLCBbXywuLlQxXSwgWzAsLi5UMl0pIDotIFg9PTEsIHRnYXRlKFQwLCBUMSwgVDIpLgordGdhdGUoW1gsLi5UMF0sIFtfLC4uVDFdLCBbXywuLlQyXSkgOi0gdmFyKFgpLCAhLCB0Z2F0ZShUMCwgVDEsIFQyKS4KK3RnYXRlKFtYLC4uVDBdLCBbMSwuLlQxXSwgWzEsLi5UMl0pIDotIFg9PTAsIHRnYXRlKFQwLCBUMSwgVDIpLgordGdhdGUoW1gsLi5UMF0sIFtfLC4uVDFdLCBbMCwuLlQyXSkgOi0gWD09MSwgdGdhdGUoVDAsIFQxLCBUMikuCit0Z2F0ZShbWCwuLlQwXSwgWzAsLi5UMV0sIFtfLC4uVDJdKSA6LSBYPT0xLCB0Z2F0ZShUMCwgVDEsIFQyKS4KKworCityKERlcHRoLFRhYmxlKSA6LSBydW4oMCwgVGFibGUsIEwsIEMsIEQpLAorICAgICAgICAgICAgICAgICAgRGVwdGggPTwgRCwKKwkgICAgICAgICAgbmwsIHdyaXRlKFttaW5pbXVtLGNvc3QsY2lyY3VpdCxvZix0aGUsc2hvcnRlc3QsZGVsYXldKSwKKwkgICAgICAgICAgbmwsIHdyaXRlKFsgIGNpcmN1aXQsPSxMXSksCisJICAgICAgICAgIG5sLCB3cml0ZShbICBjb3N0LGlzLEMsZ2F0ZXNdKSwKKwkgICAgICAgICAgbmwsIHdyaXRlKFsgIGRlbGF5LGlzLEQsZ2F0ZSx0aW1lc10pLG5sLCEuCityKERlcHRoLFRhYmxlKSA6LSBydW4oRGVwdGgsIFRhYmxlLCBMLCBDLCBEKSwKKwkgICAgICAgICAgbmwsIHdyaXRlKFtsb3dlc3QsY29zdCxjaXJjdWl0LGZvcixhLGdpdmVuLGRlbGF5XSksCisJICAgICAgICAgIG5sLCB3cml0ZShbICBjaXJjdWl0LD0sTF0pLAorCSAgICAgICAgICBubCwgd3JpdGUoWyAgY29zdCxpcyxDLGdhdGVzXSksCisJICAgICAgICAgIG5sLCB3cml0ZShbICBkZWxheSxpcyxELGdhdGUsdGltZXNdKSxubC4KKworJVV0aWxpdHkgcHJvY2VkdXJlcworCittaW4oWCxZLFgpIDotIFggPCBZICwgISAuCittaW4oWCxZLFkpLgorCit1cGRhdGVfY29zdChDb3N0X2luLCBDb3N0LCBDb3N0X291dCkgOi0gQ29zdF9vdXQgaXMgQ29zdF9pbiArIENvc3QsCisJCQkJCWNvc3RfYm91bmQoQiksCisJCQkJCUNvc3Rfb3V0IDwgQiwgISAuCisKK2Nvc3RfYm91bmQoMzIwMDApLgorCitzZXRfYm91bmQoWCkgOi0gcmV0cmFjdCgoY29zdF9ib3VuZChfKSkpLAorCQlhc3NlcnQoKGNvc3RfYm91bmQoWCkpKSwgISAuCisKK3VwZGF0ZV9ib3VuZChYKSA6LSByZXRyYWN0KChjb3N0X2JvdW5kKFkpKSksCisJCSAgIG1pbihYLFksWiksCisJCSAgIGFzc2VydCgoY29zdF9ib3VuZChaKSkpLCAhIC4KKwordXBkYXRlX2NpcmN1aXQoQ2lyY3VpdCxDb3N0KSA6LSBjb3N0X2JvdW5kKFgpLAorCQkJCUNvc3QgPCBYICwKKwkJCQlyZXRyYWN0KChjaXJjdWl0KF8pKSksCisJCQkJYXNzZXJ0KChjaXJjdWl0KENpcmN1aXQpKSksIS4KK3VwZGF0ZV9jaXJjdWl0KENpcmN1aXQsQ29zdCkuCisKK2NpcmN1aXQoW10pLgorCisKKyUgIEhvZnN0YWRlcidzIG11IG1hdGggKG11dGVzdCkgcHJvdmluZyBtdWlpdQorJQlmcm9tIEdvZGVsIEVzY2hlciBCYWNoCisKK211IDotIHRoZW9yZW0oNSxbbSx1LGksaSx1XSkuCisKK3J1bGVzKFMsIFIpIDotIHJ1bGUzKFMsUikuCitydWxlcyhTLCBSKSA6LSBydWxlNChTLFIpLgorcnVsZXMoUywgUikgOi0gcnVsZTEoUyxSKS4KK3J1bGVzKFMsIFIpIDotIHJ1bGUyKFMsUikuCisKK3J1bGUxKFMsUikgOi0KKwlhcHBlbmQoWCwgW2ldLCBTKSwKKwlhcHBlbmQoWCwgW2ksdV0sIFIpLgorCitydWxlMihbbSB8IFRdLCBbbSB8IFJdKSA6LSBhcHBlbmQoVCwgVCwgUikuCisKK3J1bGUzKFtdLCAtKSA6LSBmYWlsLgorcnVsZTMoUiwgVCkgOi0KKwlhcHBlbmQoW2ksaSxpXSwgUywgUiksCisJYXBwZW5kKFt1XSwgUywgVCkuCitydWxlMyhbSCB8IFRdLCBbSCB8IFJdKSA6LSBydWxlMyhULCBSKS4KKworcnVsZTQoW10sIC0pIDotIGZhaWwuCitydWxlNChSLCBUKSA6LSBhcHBlbmQoW3UsIHVdLCBULCBSKS4KK3J1bGU0KFtIIHwgVF0sIFtIIHwgUl0pIDotIHJ1bGU0KFQsIFIpLgorCit0aGVvcmVtKERlcHRoLCBbbSwgaV0pLgordGhlb3JlbShEZXB0aCwgW10pIDotIGZhaWwuCisKK3RoZW9yZW0oRGVwdGgsIFIpIDotCisJRGVwdGggPiAwLAorCUQgaXMgRGVwdGggLSAxLAorCXRoZW9yZW0oRCwgUyksCisJcnVsZXMoUywgUikuCisKK2FwcGVuZChbXSwgWCwgWCkuCithcHBlbmQoW0EgfCBCXSwgWCwgW0EgfCBCMV0pIDotCisJISwKKwlhcHBlbmQoQiwgWCwgQjEpLgorCisKKyUJbmFpdmUgcmV2ZXJzZSAobnJldjEpCislCWZyb20gV2FycmVuJ3MgdGhlc2lzCisKK25yZXYxIDotCisJbGlzdDMwKEwpLAorCW5yZXZlcnNlKEwsWCksCisJd3JpdGUoWCksIG5sLgorCitucmV2ZXJzZShbWHxMMF0sTCkgOi0gbnJldmVyc2UoTDAsTDEpLCBjb25jYXRlbmF0ZShMMSxbWF0sTCkuCitucmV2ZXJzZShbXSxbXSkuCisKK2NvbmNhdGVuYXRlKFtYfEwxXSxMMixbWHxMM10pIDotIGNvbmNhdGVuYXRlKEwxLEwyLEwzKS4KK2NvbmNhdGVuYXRlKFtdLEwsTCkuCisKK2xpc3QzMChbMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsCisJMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsCisJMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzBdKS4KKworCislCXRoZSBxdWVlbnMgb24gYSBjaGVzc2JvYXJkIHByb2JsZW0gKHF1ZWVucykgZm9yIDR4NCBib2FyZAorCitxdWVlbnMgOi0gIHJ1big0LFgpLCBmYWlsLgorCitzaXplKDQpLgoraW50KDEpLgoraW50KDIpLgoraW50KDMpLgoraW50KDQpLgorCitydW4oU2l6ZSwgU29sbikgOi0gZ2V0X3NvbHV0aW9ucyhTaXplLCBTb2xuKSwgaW5mb3JtKFNvbG4pLgorCitnZXRfc29sdXRpb25zKEJvYXJkX3NpemUsIFNvbG4pIDotIHNvbHZlKEJvYXJkX3NpemUsIFtdLCBTb2xuKS4KKworJQluZXdzcXVhcmUgZ2VuZXJhdGVzIGxlZ2FsIHBvc2l0aW9ucyBmb3IgbmV4dCBxdWVlbgorCituZXdzcXVhcmUoW10sIHNxdWFyZSgxLCBYKSkgOi0gaW50KFgpLgorbmV3c3F1YXJlKFtzcXVhcmUoSSwgSikgfCBSZXN0XSwgc3F1YXJlKFgsIFkpKSA6LQorCVggaXMgSSArIDEsCisJaW50KFkpLAorCW5vdCh0aHJlYXRlbmVkKEksIEosIFgsIFkpKSwKKwlzYWZlKFgsIFksIFJlc3QpLgorCisKKyUJc2FmZSBjaGVja3Mgd2hldGhlciBzcXVhcmUoWCwgWSkgaXMgdGhyZWF0ZW5lZCBieSBhbnkKKyUJZXhpc3RpbmcgcXVlZW5zCisKK3NhZmUoWCwgWSwgW10pLgorc2FmZShYLCBZLCBbc3F1YXJlKEksIEopIHwgTF0pIDotCisJbm90KHRocmVhdGVuZWQoSSwgSiwgWCwgWSkpLAorCXNhZmUoWCwgWSwgTCkuCisKKworJQl0aHJlYXRlbmVkIGNoZWNrcyB3aGV0aGVyIHNxdWFyZXMgKEksIEopIGFuZCAoWCwgWSkKKyUJdGhyZWF0ZW4gZWFjaCBvdGhlcgorCit0aHJlYXRlbmVkKEksIEosIFgsIFkpIDotCisJKEkgPSBYKSwKKwkhLgordGhyZWF0ZW5lZChJLCBKLCBYLCBZKSA6LQorCShKID0gWSksCisJIS4KK3RocmVhdGVuZWQoSSwgSiwgWCwgWSkgOi0KKwkoVSBpcyBJIC0gSiksCisJKFYgaXMgWCAtIFkpLAorCShVID0gViksCisJIS4KK3RocmVhdGVuZWQoSSwgSiwgWCwgWSkgOi0KKwkoVSBpcyBJICsgSiksCisJKFYgaXMgWCArIFkpLAorCShVID0gViksCisJIS4KKworCislCXNvbHZlIGFjY3VtdWxhdGVzIHRoZSBwb3NpdGlvbnMgb2Ygb2NjdXBpZWQgc3F1YXJlcworCitzb2x2ZShCcywgW3NxdWFyZShCcywgWSkgfCBMXSwgW3NxdWFyZShCcywgWSkgfCBMXSkgOi0gc2l6ZShCcykuCitzb2x2ZShCb2FyZF9zaXplLCBJbml0aWFsLCBGaW5hbCkgOi0KKwluZXdzcXVhcmUoSW5pdGlhbCwgTmV4dCksCisJc29sdmUoQm9hcmRfc2l6ZSwgW05leHQgfCBJbml0aWFsXSwgRmluYWwpLgorCitpbmZvcm0oW10pIDotIG5sLG5sLgoraW5mb3JtKFtNIHwgTF0pIDotIHdyaXRlKE0pLCBubCwgaW5mb3JtKEwpLgorCislCXF1ZXJ5CislCWZyb20gV2FycmVuJ3MgdGhlc2lzCisKK3F1ZXJ5IDotCisJcXVlcnkoWCksCisJd3JpdGUoWCksIG5sLAorCWZhaWwuCisKK3F1ZXJ5KFtDMSxEMSxDMixEMl0pIDotIAorCWRlbnNpdHkoQzEsRDEpLCAKKwlkZW5zaXR5KEMyLEQyKSwKKwlEMSA+IEQyLAorCVQxIGlzIDIwKkQxLAorCVQyIGlzIDIxKkQyLAorCVQxIDwgVDIuCisKK2RlbnNpdHkoQyxEKSA6LSBwb3AoQyxQKSwgYXJlYShDLEEpLCBEIGlzIChQKjEwMCkvL0EuCisKK3BvcChjaGluYSwJODI1MCkuCWFyZWEoY2hpbmEsCTMzODApLgorcG9wKGluZGlhLAk1ODYzKS4JYXJlYShpbmRpYSwJMTEzOSkuCitwb3AodXNzciwJMjUyMSkuCWFyZWEodXNzciwJODcwOCkuCitwb3AodXNhLAkyMTE5KS4JYXJlYSh1c2EsCTM2MDkpLgorcG9wKGluZG9uZXNpYSwJMTI3NikuCWFyZWEoaW5kb25lc2lhLAk1NzApLgorcG9wKGphcGFuLAkxMDk3KS4JYXJlYShqYXBhbiwJMTQ4KS4KK3BvcChicmF6aWwsCTEwNDIpLglhcmVhKGJyYXppbCwJMzI4OCkuCitwb3AoYmFuZ2xhZGVzaCwJNzUwKS4JYXJlYShiYW5nbGFkZXNoLDU1KS4KK3BvcChwYWtpc3RhbiwJNjgyKS4JYXJlYShwYWtpc3RhbiwJMzExKS4KK3BvcCh3X2dlcm1hbnksCTYyMCkuCWFyZWEod19nZXJtYW55LAk5NikuCitwb3AobmlnZXJpYSwJNjEzKS4JYXJlYShuaWdlcmlhLAkzNzMpLgorcG9wKG1leGljbywJNTgxKS4JYXJlYShtZXhpY28sCTc2NCkuCitwb3AodWssCQk1NTkpLglhcmVhKHVrLAk4NikuCitwb3AoaXRhbHksCTU1NCkuCWFyZWEoaXRhbHksCTExNikuCitwb3AoZnJhbmNlLAk1MjUpLglhcmVhKGZyYW5jZSwJMjEzKS4KK3BvcChwaGlsbGlwaW5lcyw0MTUpLglhcmVhKHBoaWxsaXBpbmVzLDkwKS4KK3BvcCh0aGFpbGFuZCwJNDEwKS4JYXJlYSh0aGFpbGFuZCwJMjAwKS4KK3BvcCh0dXJrZXksCTM4MykuCWFyZWEodHVya2V5LAkyOTYpLgorcG9wKGVneXB0LAkzNjQpLglhcmVhKGVneXB0LAkzODYpLgorcG9wKHNwYWluLAkzNTIpLglhcmVhKHNwYWluLAkxOTApLgorcG9wKHBvbGFuZCwJMzM3KS4JYXJlYShwb2xhbmQsCTEyMSkuCitwb3Aoc19rb3JlYSwJMzM1KS4JYXJlYShzX2tvcmVhLAkzNykuCitwb3AoaXJhbiwJMzIwKS4JYXJlYShpcmFuLAk2MjgpLgorcG9wKGV0aGlvcGlhLAkyNzIpLglhcmVhKGV0aGlvcGlhLAkzNTApLgorcG9wKGFyZ2VudGluYSwJMjUxKS4JYXJlYShhcmdlbnRpbmEsCTEwODApLgorCisKKyUJcXVpY2tzb3J0IChxczQpIG9uIDUwIGl0ZW1zCislCWZyb20gV2FycmVuJ3MgdGhlc2lzCisKK3FzNCA6LQorCWxpc3Q1MChMKSwKKwlxc29ydChMLFgsW10pLAorCXdyaXRlKFgpLCBubC4KKworcXNvcnQoW1h8TF0sUixSMCkgOi0KKwlwYXJ0aXRpb24oTCxYLEwxLEwyKSwKKwlxc29ydChMMixSMSxSMCksCisJcXNvcnQoTDEsUixbWHxSMV0pLgorcXNvcnQoW10sUixSKS4KKworcGFydGl0aW9uKFtYfExdLFksW1h8TDFdLEwyKSA6LQorCVg8WSwgISwKKwlwYXJ0aXRpb24oTCxZLEwxLEwyKS4KK3BhcnRpdGlvbihbWHxMXSxZLEwxLFtYfEwyXSkgOi0KKwlwYXJ0aXRpb24oTCxZLEwxLEwyKS4KK3BhcnRpdGlvbihbXSxfLFtdLFtdKS4KKworbGlzdDUwKFsyNyw3NCwxNywzMyw5NCwxOCw0Niw4Myw2NSwyLAorCTMyLDUzLDI4LDg1LDk5LDQ3LDI4LDgyLDYsMTEsCisJNTUsMjksMzksODEsOTAsMzcsMTAsMCw2Niw1MSwKKwk3LDIxLDg1LDI3LDMxLDYzLDc1LDQsOTUsOTksCisJMTEsMjgsNjEsNzQsMTgsOTIsNDAsNTMsNTksOF0pLgorCisKKworJQlzZXJpYWxpemUgKHBhbGluMjUpCislCWZyb20gV2FycmVuJ3MgdGhlc2lzCisKK3BhbGluMjUgOi0KKwlwYWxpbjI1KFApLAorCXNlcmlhbGl6ZShQLFgpLAorCXdyaXRlKFgpLG5sLgorCitzZXJpYWxpemUoTCxSKSA6LQorCXBhaXJsaXN0cyhMLFIsQSksCisJYXJyYW5nZShBLFQpLAorCW51bWJlcmVkKFQsMSxOKS4KKworcGFpcmxpc3RzKFtYfExdLCBbWXxSXSwgW3BhaXIoWCxZKXxBXSkgOi0gcGFpcmxpc3RzKEwsUixBKS4KK3BhaXJsaXN0cyhbXSwgW10sIFtdKS4KKworYXJyYW5nZShbWHxMXSwgdHJlZShUMSwgWCwgVDIpKSA6LQorCXNwbGl0KEwsIFgsIEwxLCBMMiksCisJYXJyYW5nZShMMSwgVDEpLAorCWFycmFuZ2UoTDIsIFQyKS4KK2FycmFuZ2UoW10sIHZvaWQpLgorCitzcGxpdChbWHxMXSwgWCwgTDEsIEwyKSA6LSAhLCBzcGxpdChMLCBYLCBMMSwgTDIpLgorc3BsaXQoW1h8TF0sIFksIFtYfEwxXSwgTDIpIDotIGJlZm9yZShYLFkpLCAhLCBzcGxpdChMLFksTDEsTDIpLgorc3BsaXQoW1h8TF0sIFksIEwxLCBbWHxMMl0pIDotIGJlZm9yZShZLFgpLCAhLCBzcGxpdChMLFksTDEsTDIpLgorc3BsaXQoW10sIF8sIFtdLCBbXSkuCisKK2JlZm9yZShwYWlyKFgxLFkxKSwgcGFpcihYMixZMikpIDotIFgxIDwgWDIuCisKK251bWJlcmVkKHRyZWUoVDEsIHBhaXIoWCxOMSksIFQyKSwgTjAsIE4pIDotCisJbnVtYmVyZWQoVDEsIE4wLCBOMSksCisJaXMoTjIsTjEsKywxKSwKKwludW1iZXJlZChUMixOMixOKS4KK251bWJlcmVkKF8sTixOKS4KKworcGFsaW4yNSgiQUJMRSBXQVMgSSBFUkUgSSBTQVcgRUxCQSIpLgorCisKKyUgVGhlIHNpZXZlIG9mIEVyYXRvc3RoZW5lcywgZnJvbSBDbG9ja3NpbiAmIE1lbGxpc2ggKHByaTIpCislCWZpbmRpbmcgdGhlIHByaW1lIG51bWJlcnMgdXAgdG8gOTguCQorCitzaWV2ZSA6LSBwcmltZXMoOTgsIFgpLCB3cml0ZShYKSwgbmwuCisKK3ByaW1lcyhMaW1pdCwgUHMpIDotIGludGVnZXJzKDIsIExpbWl0LCBJcyksIHNpZnQoSXMsIFBzKS4KKworaW50ZWdlcnMoTG93LCBIaWdoLCBbTG93IHwgUmVzdF0pIDotIAorCUxvdyA9PCBIaWdoLCAhLAorCU0gaXMgTG93KzEsCisJaW50ZWdlcnMoTSwgSGlnaCwgUmVzdCkuCitpbnRlZ2VycyhfLF8sW10pLgorCitzaWZ0KFtdLFtdKS4KK3NpZnQoW0kgfCBJc10sIFtJIHwgUHNdKSA6LSByZW1vdmUoSSxJcyxOZXcpLCBzaWZ0KE5ldywgUHMpLgorCityZW1vdmUoUCxbXSxbXSkuCityZW1vdmUoUCxbSSB8IElzXSwgW0kgfCBOaXNdKSA6LSBub3QoMCBpcyBJIG1vZCBQKSwgISwgcmVtb3ZlKFAsSXMsTmlzKS4KK3JlbW92ZShQLFtJIHwgSXNdLCBOaXMpIDotIDAgaXMgSSBtb2QgUCwgISwgcmVtb3ZlKFAsSXMsTmlzKS4KKwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYmVuY2htYXJrcy9zcmMvcGF0aC5wcm8gYi9leGFtcGxlcy9iZW5jaG1hcmtzL3NyYy9wYXRoLnBybwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTg1ZTFlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy9zcmMvcGF0aC5wcm8KQEAgLTAsMCArMSw3MSBAQAorJSAgWFByb2xvZyAoaHR0cDovL3d3dy5pcm8udW1vbnRyZWFsLmNhL352YXVjaGVyL1hQcm9sb2cvKQorJQorJSAgcGF0aC5wcm86ICBCZW5jaG1hcmsgcHJvZ3JhbSB0byBldmFsdWF0ZSBsaWdodC13ZWlnaHQgCislICAgICAgICAgICAgIFByb2xvZyBpbnRlcnByZXRlcnMgZm9yIHVzZSB3aXRoIEphdmEgYWdlbnRzLi4uLiAKKworJSBEZXB0aC1maXJzdCBzZWFyY2ggdG8gZmluZCBhIHBhdGggYmV0d2VlbiBQb2ludDEgYW5kIFBvaW50MiBvbiAKKyUgYW4gOHg4IGdyaWQgd2l0aCB3YWxscy4gVGhlIHRvcC1sZXZlbCBwcmVkaWNhdGUgdG8gY2FsbCBpczoKKworJSAgICAgc29sdmUoIFBvaW50MSwgUG9pbnQyLCBQYXRoKS4KKyUgb3IgIHNvbHZlKCAgICAgICAgIFBvaW50MiwgUGF0aCkuICAgICAgICAgIC4uLmltcGxpZXMgUDEgPSAoMSwxKQorCislICBUcnkgaW4gb3JkZXI6CislICAgICAgc29sdmUoIERlc3QsIEwpLgorJSAgICAgIHNvbHZlKCBwKDgsOCksIEwpLgorJSAgICAgIHNvbHZlKCBwKDIsMiksIEwpLiAgIDw8IHRoaXMgbWF5IHRha2Ugc2V2ZXJhbCBtaW51dGVzCisKKyUgVGhlIHByb2dyYW0gaGFzIGJlZW4gYWRhcHRlZCB0byBXUHJvbG9nIHdoaWNoIGhhcyBubyBhcml0aG1ldGljIGFuZAorJSAgIHNpbXBsaWZpZWQgbWVjaGFuaXNtczogIG5vdCggWCApIGFuZCBvbmNlKCBQcmVkICkgaW5zdGVhZCBvZiBDVVQKKyUgICBidXQgaXMgZWFzeSB0byBjaGFuZ2UuICBOb3RlLCB0aGUgbGFzdCB0ZXN0IGludm9sdmVzIDg0IG1pbGxpb24gCislICAgY2FsbHMgb2YgdGhlIHJlY3Vyc2l2ZSAidW5pZnkiIG1ldGhvZCBpbiBXUHJvbG9nLgorJSBTb21lIHJlc3VsdHMgb2YgbGFzdCB0ZXN0OgorCislICAgbXkgUEM6ICBXUHJvbG9nICAgMTU3IHNlYy4KKyUgICBteSBQQzogIFhQcm9sb2cgICAgNjcgc2VjICAgIChzbGlnaHRseSBtb2RpZmllZCBXUHJvbG9nKQorJSAgIG15IFBDICAgSklQcm9sb2cgIDE2OCBzZWMKKyUgICA1MSBzZWMgIFhQcm9sb2cgb24gMS4xIEdIeiBQMyBOb3RlYm9vaywgMzY4IE1CIFJhbSwgSkRLIDEuMy4xIChGLktyYXR6ZXIpCisKKyUgVW5pdiBzZXJ2ZXI6ICAgICAgVG8gY29tcGFyZSB0byBTaWNzdHVzLCBpbmR1c3RyaWFsIFByb2xvZyAoaW50ZXJwcmV0ZWQpCislICAgV1Byb2xvZyAgIDIxNSBzZWMKKyUgICBYUHJvbG9nICAgMTQwIHNlYworJSAgIFNpY3N0dXMgICAgMTQgc2VjCisKKworc29sdmUoRGVzdCxMKSA6LSAKKyAgIHNvbHZlKHAoMSwxKSwgRGVzdCwgTCkuCitzb2x2ZShTLCBEZXN0LCBTb2wpIDotCisgICAgcGF0aChTLCBEZXN0LCBbU10sIFBhdGgpLAorICAgIGludmVydChQYXRoLCBTb2wpLgorCitwYXRoKCBQLCAgUCwgIEwsICBMKS4KK3BhdGgoIE5vZGUsIEdvYWwsIFBhdGgsIFNvbCkgOi0gCisgICAgYXJjKCBOb2RlLCBOb2RlMiksICBub3QoIHdhbGwoTm9kZTIpICksCisgICAgbm90KCBtZW1iZXIoIE5vZGUyLCBQYXRoKSksCisgICAgcGF0aCggTm9kZTIsIEdvYWwsIFtOb2RlMiB8IFBhdGhdLCBTb2wpLgorCithcmMoIHAoWCxZKSwgcChYMSxZKSApIDotIHN1YyhYLFgxKS4KK2FyYyggcChYLFkpLCBwKFgxLFkpICkgOi0gc3VjKFgxLFgpLgorYXJjKCBwKFgsWSksIHAoWCxZMSkgKSA6LSBzdWMoWSxZMSkuCithcmMoIHAoWCxZKSwgcChYLFkxKSApIDotIHN1YyhZMSxZKS4KKword2FsbCggcCgzLDIpICkuCit3YWxsKCBwKDMsMykgKS4KK3dhbGwoIHAoMyw0KSApLgord2FsbCggcCg1LDMpICkuCisgICAgCitzdWMoMSwyKS4KK3N1YygyLDMpLgorc3VjKDMsNCkuCitzdWMoNCw1KS4KK3N1Yyg1LDYpLgorc3VjKDYsNykuCitzdWMoNyw4KS4KKyAgICAKK2ludmVydChJTiwgT1VUKSA6LSBpbnZlcnQxKElOLFtdLE9VVCkuCisKK2ludmVydDEoW10sIEwsTCkuCitpbnZlcnQxKCBbQSB8IFRhaWxdLCBMLFJlcykgOi0KKyAgICBpbnZlcnQxKCBUYWlsLCBbQSB8IExdLCBSZXMpLgorCittZW1iZXIoWCwgW1h8WV0pLgorbWVtYmVyKFgsIFtBfEJdKSA6LSBtZW1iZXIoWCxCKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3Mvc3JjL3BsYmVuY2gudHh0IGIvZXhhbXBsZXMvYmVuY2htYXJrcy9zcmMvcGxiZW5jaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmMjc5OQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3Mvc3JjL3BsYmVuY2gudHh0CkBAIC0wLDAgKzEsNDYgQEAKK0Zyb20gaG9uZXlkZXcuc3J2LmNzLmNtdS5lZHUhZGFzLW5ld3MuaGFydmFyZC5lZHUhbm9jLm5lYXIubmV0IWhvd2xhbmQucmVzdG9uLmFucy5uZXQhdml4ZW4uY3NvLnVpdWMuZWR1IXNkZC5ocC5jb20hZGVjd3JsIWRlY3dybCFuZXRjb21zdiFuZXRjb20uY29tIWJyYWhtZSBXZWQgU2VwIDE1IDE3OjI1OjI4IEVEVCAxOTkzCitBcnRpY2xlOiA4NTQ0IG9mIGNvbXAubGFuZy5wcm9sb2cKK1hyZWY6IGhvbmV5ZGV3LnNydi5jcy5jbXUuZWR1IGNvbXAubGFuZy5wcm9sb2c6ODU0NAorTmV3c2dyb3VwczogY29tcC5sYW5nLnByb2xvZworUGF0aDogaG9uZXlkZXcuc3J2LmNzLmNtdS5lZHUhZGFzLW5ld3MuaGFydmFyZC5lZHUhbm9jLm5lYXIubmV0IWhvd2xhbmQucmVzdG9uLmFucy5uZXQhdml4ZW4uY3NvLnVpdWMuZWR1IXNkZC5ocC5jb20hZGVjd3JsIWRlY3dybCFuZXRjb21zdiFuZXRjb20uY29tIWJyYWhtZQorRnJvbTogYnJhaG1lQG5ldGNvbS5jb20gKGJyYWhtZSkKK1N1YmplY3Q6IGJlbmNobWFya2luZyBwcm9sb2cgc3lzdGVtczogSGVyZSBpcyBvbmUgc21hbGwgcHJvZ3JhbQorTWVzc2FnZS1JRDogPGJyYWhtZUNERDlJNC42NDVAbmV0Y29tLmNvbT4KK09yZ2FuaXphdGlvbjogTkVUQ09NIE9uLWxpbmUgQ29tbXVuaWNhdGlvbiBTZXJ2aWNlcyAoNDA4IDI0MS05NzYwIGd1ZXN0KQorRGF0ZTogVHVlLCAxNCBTZXAgMTk5MyAyMzowNjowMyBHTVQKK0xpbmVzOiAzMQorCislJSBIZXJlIGFyZSBhIGZldyBwcmVkaWNhdGVzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGJlbmNobWFyaworJSUgdmFyaW91cyBwcm9sb2cgc3lzdGVtcy4gVGhpcyB3b3VsZCB0ZXN0IHRoZSBwcm9sb2cgc3lzdGVtcyBtYW5hZ2VtZW50IG9mCislJSBwcm9ncmFtIHNwYWNlLiBUaGlzIGlzIHRoZSBzcGFjZSB0eXBpY2FsbHkgdXNlZCBieSBhc3NlcnRzIGFuZCByZXRyYWN0cworJSUgYXMgd2VsbCBhcyBidWlsdF9pbnMgbGlrZSBmaW5kYWxsLiBBbHNvIGNvbXBhcmluZyB0aGUgdGltZXMgd2l0aCBnMSB3b3VsZCAKKyUlIGluZGljYXRlICB0aGUgb3ZlcmhlYWQgb2YgZmluZGFsbCBhbmQgYXNzZXJ0L3JldHJhY3RzCisKKyUlIEl0IHdvdWxkIG5pY2UgaWYgcGVvcGxlIGNvdWxkIGRldmVsb3Agc3VjaCBzbWFsbCBiZW5jaG1hcmtzIHdoaWNoIAorJSUgdGVzdCBwYXJ0cyBvZiB2YXJpb3VzIHByb2xvZyBzeXN0ZW1zIHRoYXQgYXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSAKKyUlIGV4aXN0aW5nIGJlbmNobWFya3MuCisKKworZzEoTiwgTCkgOi0gbGVuZ3RoKEwsIE4pLCBzYW1lX3ZhbHVlKEwsIGUpLgorCitnMigwKSA6LSAhLgorZzIoTiwgQSkgOi0gTiA+IDAsIEEgPSBlLgorZzIoTiwgQSkgOi0gTiA+IDAsIE4xIGlzIE4gLSAxLCBnMihOMSwgQSkuCisKK2cxZihOLCBFcykgOi0gCisJZzEoTiwgTCksIAorCWZpbmRhbGwoRSwgbWVtYmVyKEUsIEwpLCBFcykuCisKK2cyZihOLCBFcykgOi0gCisJZzIoTiwgQSksIGZpbmRhbGwoQSwgZzIoTiwgQSksIEVzKS4KKworZzJhKE4pIDotCisJYXNzZXJ0YShnMl9hbnMoW10pKSwKKwlnMihOLCBBKSwgcmV0cmFjdChnMl9hbnMoTGlzdCkpLCBhc3NlcnRhKGcyX2FucyhbQXxMaXN0XSkpLCBmYWlsLgorZzJhKE4pIDotIHJldHJhY3QoZzJfYW5zKExpc3QpKS4KKworc2FtZV92YWx1ZShbXSwgX0UpLgorc2FtZV92YWx1ZShbRXxSXSwgRSkgOi0gc2FtZV92YWx1ZShSLCBFKS4KKworCisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MveHByb2xvZy9NYWtlZmlsZSBiL2V4YW1wbGVzL2JlbmNobWFya3MveHByb2xvZy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODEzMjcyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYmVuY2htYXJrcy94cHJvbG9nL01ha2VmaWxlCkBAIC0wLDAgKzEsOTcgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIE1ha2VmaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitQTENBRkUgICAgICAgPSBwbGNhZmUKK1BMQ0FGRU9QVFMgICA9CitQTEpBUiAgICAgICAgPSBwbGphcgorUExKQVJPUFRTICAgID0gLXYKKworU0lDU1RVUyAgICAgID0gL3Vzci9sb2NhbC9iaW4vc2ljc3R1cworU0lDU1RVU09QVFMgID0gCisKK1NXSSAgICAgICAgICA9IC9vcHQvbG9jYWwvYmluL3N3aXBsCitTV0lPUFRTICAgICAgPSAtTDEwMG0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAucWwgLnFsZiAuamFyIC5wbCAuc2ljc3R1cyAuc3dpIC5wbGNhZmUgLmluICQoU1VGRklYRVMpCisKK3BsY2FmZTogY29tcF9wbGNhZmUgcnVuX3BsY2FmZQorCitzaWNzdHVzOiBjb21wX3NpY3N0dXMgcnVuX3NpY3N0dXMKKworc3dpOiBjb21wX3N3aSBydW5fc3dpCisKK2FsbDogY29tcCBydW4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBydW4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3BsY2FmZV9vdXRfb2JqZWN0cyAgOj0gJChwYXRzdWJzdCAlLmluLCUucGxjYWZlLCAkKHdpbGRjYXJkICouaW4pKQorc2ljc3R1c19vdXRfb2JqZWN0cyA6PSAkKHBhdHN1YnN0ICUuaW4sJS5zaWNzdHVzLCQod2lsZGNhcmQgKi5pbikpCitzd2lfb3V0X29iamVjdHMgICAgIDo9ICQocGF0c3Vic3QgJS5pbiwlLnN3aSwgICAgJCh3aWxkY2FyZCAqLmluKSkKKworLmluLnBsY2FmZToKKwktcm0gLWYgb3V0LyRACisJL2Jpbi9lY2hvICJbJyQ8J10sIGhhbHQuIiBcCisJfCAkKFBMQ0FGRSkgJChQTENBRkVPUFRTKSAtY3AgJCouamFyOmJlbmNoX3V0aWwuamFyID4gb3V0LyRACisKKy5pbi5zaWNzdHVzOgorCS1ybSAtZiBvdXQvJEAKKwkvYmluL2VjaG8gImVuc3VyZV9sb2FkZWQoJCopLCBlbnN1cmVfbG9hZGVkKGJlbmNoX3V0aWwpLCBbJyQ8J10sIGhhbHQuIiBcCisJfCAkKFNJQ1NUVVMpICQoU0lDU1RVU09QVFMpID4gb3V0LyRACisKKy5pbi5zd2k6CisJLXJtIC1mIG91dC8kQAorCS9iaW4vZWNobyAiZW5zdXJlX2xvYWRlZCgkKiksIGVuc3VyZV9sb2FkZWQoYmVuY2hfdXRpbCksIFsnJDwnXSwgaGFsdC4iIFwKKwl8ICQoU1dJKSAkKFNXSU9QVFMpID4gb3V0LyRACisKK3J1bjogcnVuX3BsY2FmZSBydW5fc2ljc3R1cyBydW5fc3dpCisKK3J1bl9wbGNhZmU6ICQocGxjYWZlX291dF9vYmplY3RzKQorCitydW5fc2ljc3R1czogJChzaWNzdHVzX291dF9vYmplY3RzKQorCitydW5fc3dpOiAkKHN3aV9vdXRfb2JqZWN0cykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBjb21waWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitqYXJfb2JqZWN0cyA6PSAkKHBhdHN1YnN0ICUucGwsJS5qYXIsJCh3aWxkY2FyZCAqLnBsKSkKK3FsX29iamVjdHMgIDo9ICQocGF0c3Vic3QgJS5wbCwlLnFsLCAkKHdpbGRjYXJkICoucGwpKQorcWxmX29iamVjdHMgOj0gJChwYXRzdWJzdCAlLnBsLCUucWxmLCQod2lsZGNhcmQgKi5wbCkpCisKKy5wbC5qYXI6CisJJChQTEpBUikgJChQTEpBUk9QVFMpICRAICQ8CisJLXJtIC1mIC1yICQqCisKKy5wbC5xbDoKKwkvYmluL2VjaG8gIlskKl0sIGZjb21waWxlKCQqKSwgaGFsdC4iIHwgJChTSUNTVFVTKSAkKFNJQ1NUVVNPUFRTKQorCisucGwucWxmOgorCS9iaW4vZWNobyAicWNvbXBpbGUoJCopLCBoYWx0LiIgfCAkKFNXSSkgJChTV0lPUFRTKQorIwkvYmluL2VjaG8gIlskKl0sIHFjb21waWxlKCQqKSwgaGFsdC4iIHwgJChTV0kpICQoU1dJT1BUUykKKworY29tcDogY29tcF9wbGNhZmUgY29tcF9zaWNzdHVzIGNvbXBfc3dpCisKK2NvbXBfcGxjYWZlOiAkKGphcl9vYmplY3RzKQorCitjb21wX3NpY3N0dXM6ICQocWxfb2JqZWN0cykKKworY29tcF9zd2k6ICQocWxmX29iamVjdHMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgY2xlYW4gdXAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2NsZWFuOgorCS1ybSAtZiBjb3JlICp+CisJLXJtIC1mIC9vdXQvY29yZSBvdXQvKn4KKwktcm0gLWYgKi5xbAorCS1ybSAtZiAqLnFsZgorCityZWFsY2xlYW46IGNsZWFuCisJLXJtIC1mICouamFyICouY2xhc3MKKwktcm0gLWYgb3V0LyoucGxjYWZlIG91dC8qLnNpY3N0dXMgb3V0Lyouc3dpCisKKyMgRU5ECisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2JlbmNobWFya3MveHByb2xvZy9iZW5jaF91dGlsLnBsIGIvZXhhbXBsZXMvYmVuY2htYXJrcy94cHJvbG9nL2JlbmNoX3V0aWwucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5MDk2MgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2JlbmNobWFya3MveHByb2xvZy9iZW5jaF91dGlsLnBsCkBAIC0wLDAgKzEsNDcgQEAKKyUgICBGaWxlICAgOiBiZW5jaF91dGlsLnBsCislICAgQXV0aG9yczogTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorJSAgIFVwZGF0ZWQ6IDI0IEZlYnJ1YXJ5IDIwMDgKKyUgICBQdXJwb3NlOiBCZW5jaG1hcmsgdXRpbGl0aWVzCislICAgTm90ZSAgIDogYmFzZWQgb24gZHJpdmVyLnBsIGluIFBlcmVpcmEncyBiZW5jaG1hcmsKKworJyRnZXRfY3B1X3RpbWUnKFQpIDotIHN0YXRpc3RpY3MocnVudGltZSwgW1QsX10pLgorCisnJHJlcG9ydCcoTmFtZSwgTiwgVDAsIFQxLCBUMikgOi0KKyAgICAgICAgVGVzdFRpbWUgaXMgVDEtVDAsCisgICAgICAgIE92ZXJIZWFkIGlzIFQyLVQxLAorCVRpbWUgaXMgVGVzdFRpbWUtT3ZlckhlYWQsCisgICAgICAgIEF2ZXJhZ2UgaXMgVGltZS9OLAorCW5sLAorCXdyaXRlKCcjIE5hbWU6ICcpLCB3cml0ZShOYW1lKSwgbmwsCisgICAgICAgIHdyaXRlKCcjIEl0ZXJhdGlvbnM6ICcpLCB3cml0ZShOKSwgbmwsCisJd3JpdGUoJyMgVGVzdFRpbWU6ICcpLCB3cml0ZShUZXN0VGltZSksIHdyaXRlKCcgbXNlYy5cbicpLAorCXdyaXRlKCcjIE92ZXJIZWFkOiAnKSwgd3JpdGUoT3ZlckhlYWQpLCB3cml0ZSgnIG1zZWMuXG4nKSwKKwl3cml0ZSgnIyBUZXN0VGltZS1PdmVySGVhZDogJyksIHdyaXRlKFRpbWUpLCB3cml0ZSgnIG1zZWMuXG4nKSwKKwl3cml0ZSgnIyAoVGVzdFRpbWUtT3ZlckhlYWQpL0l0ZXJhdGlvbnM6ICcpLCB3cml0ZShBdmVyYWdlKSwgd3JpdGUoJyBtc2VjLlxuJyksCisJJyRyZXBvcnRfY3N2JyhbJyMjI0NTViMjIycsTmFtZSxOLFRlc3RUaW1lLE92ZXJIZWFkLFRpbWUsQXZlcmFnZV0sICcsJyksCisJbmwuCisKKyckcmVwb3J0X2NzdicoW10sIF8pIDotICEuCisnJHJlcG9ydF9jc3YnKFtYXSwgXykgOi0gISwgd3JpdGUoWCksIG5sLgorJyRyZXBvcnRfY3N2JyhbWHxYc10sIERlbGltKSA6LSB3cml0ZShYKSwgd3JpdGUoRGVsaW0pLCAnJHJlcG9ydF9jc3YnKFhzLCBEZWxpbSkuCisKKyckYmVuY2htYXJrJyhOYW1lLCBJdGVyYXRpb25zLCBBY3Rpb24sIENvbnRyb2wpIDotIAorICAgICAgICAnJGdldF9jcHVfdGltZScoVDApLAorICAgICAgICAoICAgJyRyZXBlYXQnKEl0ZXJhdGlvbnMpLCBvbmNlKEFjdGlvbiksIGZhaWwKKyAgICAgICAgOyAgICckZ2V0X2NwdV90aW1lJyhUMSkKKyAgICAgICAgKSwKKyAgICAgICAgKCAgICckcmVwZWF0JyhJdGVyYXRpb25zKSwgb25jZShDb250cm9sKSwgZmFpbAorICAgICAgICA7ICAgJyRnZXRfY3B1X3RpbWUnKFQyKQorICAgICAgICApLAorICAgICAgICAnJHJlcG9ydCcoTmFtZSwgSXRlcmF0aW9ucywgVDAsIFQxLCBUMikuCisKKyckcmVwZWF0JyhOKSA6LSBOID4gMCwgJyRmcm9tJygxLCBOKS4KKworJyRmcm9tJyhJLCBJKSA6LSAhLgorJyRmcm9tJyhMLCBVKSA6LSBNIGlzIChMK1UpPj4xLCAgICckZnJvbScoTCwgTSkuCisnJGZyb20nKEwsIFUpIDotIE0gaXMgKEwrVSk+PjErMSwgJyRmcm9tJyhNLCBVKS4KKworJyRkdW1teScuCisnJGR1bW15JyhfKS4KKyckZHVtbXknKF8sIF8pLgorJyRkdW1teScoXywgXywgXykuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL3hwcm9sb2cvcGF0aC5pbiBiL2V4YW1wbGVzL2JlbmNobWFya3MveHByb2xvZy9wYXRoLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNGYzMTcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL3hwcm9sb2cvcGF0aC5pbgpAQCAtMCwwICsxLDIgQEAKKzotICckYmVuY2htYXJrJyhwYXRoLCAxMCwgbWFpbiwgJyRkdW1teScpLgorCmRpZmYgLS1naXQgYS9leGFtcGxlcy9iZW5jaG1hcmtzL3hwcm9sb2cvcGF0aC5wbCBiL2V4YW1wbGVzL2JlbmNobWFya3MveHByb2xvZy9wYXRoLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYjY2M2YKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9iZW5jaG1hcmtzL3hwcm9sb2cvcGF0aC5wbApAQCAtMCwwICsxLDgyIEBACislJSUgIEplYW4gVmF1Y2hlcidzIGJlbmNobWFyaworCisvKiAKKyBDSEFOR0VMT0cgYnkgTS5CYW5iYXJhIAorICAgLSBtYWluLzAgaXMgYWRkZWQuCisgICAtIG5vdC8xICAtLT4gKFwrKS8xCisqLworCittYWluIDotIHNvbHZlKHAoMiwyKSwgXykuCisKKyUgIEF1dGhvcjogSmVhbiBWYXVjaGVyCislICBwYXRoLnBybzogIEJlbmNobWFyayBwcm9ncmFtIHRvIGV2YWx1YXRlIGxpZ2h0LXdlaWdodCAKKyUgICAgICAgICAgICAgUHJvbG9nIGludGVycHJldGVycyBmb3IgdXNlIHdpdGggSmF2YSBhZ2VudHMuLi4uIAorCislICBYUHJvbG9nIChodHRwOi8vd3d3Lmlyby51bW9udHJlYWwuY2EvfnZhdWNoZXIvWFByb2xvZy8pCisKKyUgRGVwdGgtZmlyc3Qgc2VhcmNoIHRvIGZpbmQgYSBwYXRoIGJldHdlZW4gUG9pbnQxIGFuZCBQb2ludDIgb24gCislIGFuIDh4OCBncmlkIHdpdGggd2FsbHMuIFRoZSB0b3AtbGV2ZWwgcHJlZGljYXRlIHRvIGNhbGwgaXM6CisKKyUgICAgIHNvbHZlKCBQb2ludDEsIFBvaW50MiwgUGF0aCkuCislIG9yICBzb2x2ZSggICAgICAgICBQb2ludDIsIFBhdGgpLiAgICAgICAgICAuLi5pbXBsaWVzIFAxID0gKDEsMSkKKworJSAgVHJ5IGluIG9yZGVyOgorJSAgICAgIHNvbHZlKCBEZXN0LCBMKS4KKyUgICAgICBzb2x2ZSggcCg4LDgpLCBMKS4KKyUgICAgICBzb2x2ZSggcCgyLDIpLCBMKS4gICA8PCB0aGlzIG1heSB0YWtlIHNldmVyYWwgbWludXRlcworCislIFRoZSBwcm9ncmFtIGhhcyBiZWVuIGFkYXB0ZWQgdG8gV1Byb2xvZyB3aGljaCBoYXMgbm8gYXJpdGhtZXRpYyBhbmQKKyUgICBzaW1wbGlmaWVkIG1lY2hhbmlzbXM6ICBub3QoIFggKSBhbmQgb25jZSggUHJlZCApIGluc3RlYWQgb2YgQ1VUCislICAgYnV0IGlzIGVhc3kgdG8gY2hhbmdlLiAgTm90ZSwgdGhlIGxhc3QgdGVzdCBpbnZvbHZlcyA4NCBtaWxsaW9uIAorJSAgIGNhbGxzIG9mIHRoZSByZWN1cnNpdmUgInVuaWZ5IiBtZXRob2QgaW4gV1Byb2xvZy4KKyUgU29tZSByZXN1bHRzIG9mIGxhc3QgdGVzdDoKKworJSAgIG15IFBDOiAgV1Byb2xvZyAgIDE1NyBzZWMuCislICAgbXkgUEM6ICBYUHJvbG9nICAgIDY3IHNlYyAgICAoc2xpZ2h0bHkgbW9kaWZpZWQgV1Byb2xvZykKKyUgICBteSBQQyAgIEpJUHJvbG9nICAxNjggc2VjCislICAgNTEgc2VjICBYUHJvbG9nIG9uIDEuMSBHSHogUDMgTm90ZWJvb2ssIDM2OCBNQiBSYW0sIEpESyAxLjMuMSAoRi5LcmF0emVyKQorCislIFVuaXYgc2VydmVyOiAgICAgIFRvIGNvbXBhcmUgdG8gU2ljc3R1cywgaW5kdXN0cmlhbCBQcm9sb2cgKGludGVycHJldGVkKQorJSAgIFdQcm9sb2cgICAyMTUgc2VjCislICAgWFByb2xvZyAgIDE0MCBzZWMKKyUgICBTaWNzdHVzICAgIDE0IHNlYworCisKK3NvbHZlKERlc3QsTCkgOi0gCisgICBzb2x2ZShwKDEsMSksIERlc3QsIEwpLgorc29sdmUoUywgRGVzdCwgU29sKSA6LQorICAgIHBhdGgoUywgRGVzdCwgW1NdLCBQYXRoKSwKKyAgICBpbnZlcnQoUGF0aCwgU29sKS4KKworcGF0aCggUCwgIFAsICBMLCAgTCkuCitwYXRoKCBOb2RlLCBHb2FsLCBQYXRoLCBTb2wpIDotIAorICAgIGFyYyggTm9kZSwgTm9kZTIpLCAgXCsoIHdhbGwoTm9kZTIpICksCisgICAgXCsoIG1lbWJlciggTm9kZTIsIFBhdGgpKSwKKyAgICBwYXRoKCBOb2RlMiwgR29hbCwgW05vZGUyIHwgUGF0aF0sIFNvbCkuCisKK2FyYyggcChYLFkpLCBwKFgxLFkpICkgOi0gc3VjKFgsWDEpLgorYXJjKCBwKFgsWSksIHAoWDEsWSkgKSA6LSBzdWMoWDEsWCkuCithcmMoIHAoWCxZKSwgcChYLFkxKSApIDotIHN1YyhZLFkxKS4KK2FyYyggcChYLFkpLCBwKFgsWTEpICkgOi0gc3VjKFkxLFkpLgorCit3YWxsKCBwKDMsMikgKS4KK3dhbGwoIHAoMywzKSApLgord2FsbCggcCgzLDQpICkuCit3YWxsKCBwKDUsMykgKS4KKyAgICAKK3N1YygxLDIpLgorc3VjKDIsMykuCitzdWMoMyw0KS4KK3N1Yyg0LDUpLgorc3VjKDUsNikuCitzdWMoNiw3KS4KK3N1Yyg3LDgpLgorICAgIAoraW52ZXJ0KElOLCBPVVQpIDotIGludmVydDEoSU4sW10sT1VUKS4KKworaW52ZXJ0MShbXSwgTCxMKS4KK2ludmVydDEoIFtBIHwgVGFpbF0sIEwsUmVzKSA6LQorICAgIGludmVydDEoIFRhaWwsIFtBIHwgTF0sIFJlcykuCisKK21lbWJlcihYLCBbWHxZXSkuCittZW1iZXIoWCwgW0F8Ql0pIDotIG1lbWJlcihYLEIpLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvamF2YS9LbmlnaHQuamF2YSBiL2V4YW1wbGVzL2phdmEvS25pZ2h0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkZGFhZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2phdmEvS25pZ2h0LmphdmEKQEAgLTAsMCArMSwxNDUgQEAKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisvKioKKyAqIEtuaWdodCBUb3VyLjxicj4KKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKi8KK3B1YmxpYyBjbGFzcyBLbmlnaHQgZXh0ZW5kcyBQcm9sb2dGcmFtZSB7CisgICAgcHJpdmF0ZSBLbmlnaHRQYW5lbCBrbmlnaHRQYW5lbDsKKyAgICBwcml2YXRlIFRleHRGaWVsZCBOX0ZpZWxkOworICAgIHByaXZhdGUgaW50IE4gPSA1OworCisgICAgcHVibGljIEtuaWdodCgpIHsKKwlzZXRTaXplKDUwMCwgNDAwKTsKKwlzZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKwlhZGQoIk5vcnRoIiwgbmV3IExhYmVsKCJLbmlnaHQgVG91ciIsIExhYmVsLkNFTlRFUikpOworCWtuaWdodFBhbmVsID0gbmV3IEtuaWdodFBhbmVsKCk7CisJYWRkKCJDZW50ZXIiLCBrbmlnaHRQYW5lbCk7CisJUGFuZWwgcCA9IG5ldyBQYW5lbCgpOworCWFkZCgiU291dGgiLCBwKTsKKwlwLmFkZChuZXcgTGFiZWwoIk49IikpOworCU5fRmllbGQgPSBuZXcgVGV4dEZpZWxkKEludGVnZXIudG9TdHJpbmcoTiksIDIpOworCXAuYWRkKE5fRmllbGQpOworCWNvbnRyb2wgPSBuZXcgUHJvbG9nQ29udHJvbFBhbmVsKHRoaXMpOworCXAuYWRkKGNvbnRyb2wpOworCXZhbGlkYXRlKCk7CisgICAgfQorCisgICAgVGVybSBhcmcxID0gbnVsbDsKKyAgICBUZXJtIGFyZzIgPSBudWxsOworICAgIFByZWRpY2F0ZSBrbmlnaHQgPSBudWxsOworCisgICAgcHVibGljIHZvaWQgc2VuZEFyZ3VtZW50KCkgeworCXRyeSB7CisJICAgIE4gPSBJbnRlZ2VyLnBhcnNlSW50KE5fRmllbGQuZ2V0VGV4dCgpKTsKKwl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCSAgICBOID0gMTsKKwkgICAgTl9GaWVsZC5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcoTikpOworCX0KKwl0aGlzLnByb2xvZyA9IG5ldyBQcm9sb2dDb250cm9sKCk7CisJYXJnMSA9IG5ldyBJbnRlZ2VyVGVybShOKTsKKwlhcmcyID0gbmV3IFZhcmlhYmxlVGVybSgpOworCVRlcm1bXSBhcmdzID0ge2FyZzEsYXJnMn07CisJa25pZ2h0ID0gbmV3IFBSRURfa25pZ2h0X3RvdXJfYXBwbGV0XzIoKTsKKwlwcm9sb2cuc2V0UHJlZGljYXRlKGtuaWdodCwgYXJncyk7CisJa25pZ2h0UGFuZWwuc2V0S25pZ2h0KE4sIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlY2VpdmVSZXN1bHQoKXsKKwlWZWN0b3IgdiA9IChWZWN0b3IpKGFyZzIudG9KYXZhKCkpOworCWlmKHYgPT0gbnVsbCkgcmV0dXJuOworCWlmKHYuc2l6ZSgpICE9IE4qTikgcmV0dXJuOworCWludCBrbmlnaHRbXVtdID0gbmV3IGludFtOXVtOXTsKKwl0cnkgeworCSAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworCQlmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykgeworCQkgICAga25pZ2h0W2ldW2pdPSAoKEludGVnZXIpKHYuZWxlbWVudEF0KGkqTitqKSkpLmludFZhbHVlKCk7CisJCX0KKwkgICAgfQorCSAgICBrbmlnaHRQYW5lbC5zZXRLbmlnaHQoTiwga25pZ2h0KTsKKwl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkge30KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisJbmV3IEtuaWdodCgpOworICAgIH0KK30KKworY2xhc3MgS25pZ2h0UGFuZWwgZXh0ZW5kcyBQYW5lbCB7CisgICAgcHJpdmF0ZSBpbnQgTiA9IDA7CisgICAgcHJpdmF0ZSBpbnQga25pZ2h0SVtdID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBrbmlnaHRKW10gPSBudWxsOworICAgIHByaXZhdGUgaW50IHc7CisgICAgcHJpdmF0ZSBpbnQgaDsKKyAgICBwcml2YXRlIGludCBjZWxsU2l6ZTsKKyAgICBwcml2YXRlIGludCB4MDsKKyAgICBwcml2YXRlIGludCB5MDsKKworICAgIHB1YmxpYyB2b2lkIHNldEtuaWdodChpbnQgbiwgaW50IGtbXVtdKSB7CisJaWYgKG4gPCAxKSB7CisJICAgIE4gPSAwOworCSAgICByZXR1cm47CisJfQorCU4gPSBuOworCWlmIChrID09IG51bGwpIHsKKwkgICAga25pZ2h0SSA9IG51bGw7CisJICAgIGtuaWdodEogPSBudWxsOworCSAgICByZXBhaW50KCk7CisJICAgIHJldHVybjsKKwl9CisJa25pZ2h0SSA9IG5ldyBpbnRbTipOXTsKKwlrbmlnaHRKID0gbmV3IGludFtOKk5dOworCWZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisJICAgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgaisrKSB7CisJCWludCBzID0ga1tpXVtqXSAtIDE7CisJCWtuaWdodElbc10gPSBpOworCQlrbmlnaHRKW3NdID0gajsKKwkgICAgfQorCX0KKwlyZXBhaW50KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgeHBvcyhpbnQgaikgeworCXJldHVybiB4MCtqKmNlbGxTaXplOworICAgIH0KKworICAgIHByaXZhdGUgaW50IHlwb3MoaW50IGkpIHsKKwlyZXR1cm4geTAraSpjZWxsU2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBnKSB7CisJaWYgKE4gPCAxKQorCSAgICByZXR1cm47CisJdyA9IGdldFNpemUoKS53aWR0aDsKKwloID0gZ2V0U2l6ZSgpLmhlaWdodDsKKwljZWxsU2l6ZSA9IE1hdGgubWluKHcsIGgpIC8gTjsKKwl4MCA9ICh3IC0gTiAqIGNlbGxTaXplKSAvIDI7CisJeTAgPSAoaCAtIE4gKiBjZWxsU2l6ZSkgLyAyOworCWcuc2V0Q29sb3IoQ29sb3Iud2hpdGUpOworCWcuZmlsbFJlY3QoeDAsIHkwLCBOKmNlbGxTaXplLCBOKmNlbGxTaXplKTsKKwlnLnNldENvbG9yKENvbG9yLmJsYWNrKTsKKwlmb3IgKGludCBpID0gMDsgaSA8PSBOOyBpKyspCisJICAgIGcuZHJhd0xpbmUoeHBvcygwKSwgeXBvcyhpKSwgeHBvcyhOKSwgeXBvcyhpKSk7CisJZm9yIChpbnQgaiA9IDA7IGogPD0gTjsgaisrKQorCSAgICBnLmRyYXdMaW5lKHhwb3MoaiksIHlwb3MoMCksIHhwb3MoaiksIHlwb3MoTikpOworCWlmIChrbmlnaHRJID09IG51bGwgfHwga25pZ2h0SiA9PSBudWxsKQorCSAgICByZXR1cm47CisJaW50IGhzID0gY2VsbFNpemUgLyAyOworCUZvbnQgZm9udCA9IGcuZ2V0Rm9udCgpOworCUZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzID0gZy5nZXRGb250TWV0cmljcygpOworCWcuc2V0Q29sb3IoQ29sb3IuZ3JheSk7CisJZm9yIChpbnQgcyA9IDA7IHMgPCBOKk47IHMrKykgeworCSAgICBTdHJpbmcgc3RyID0gSW50ZWdlci50b1N0cmluZyhzICsgMSk7CisJICAgIGludCB4ID0geHBvcyhrbmlnaHRKW3NdKStoczsKKwkgICAgaW50IHkgPSB5cG9zKGtuaWdodElbc10pK2hzOworCSAgICB4ID0geCAtIGZvbnRNZXRyaWNzLnN0cmluZ1dpZHRoKHN0cikgLyAyOworCSAgICB5ID0geSArIGZvbnRNZXRyaWNzLmdldEFzY2VudCgpIC8gMjsKKwkgICAgZy5kcmF3U3RyaW5nKHN0ciwgeCwgeSk7CisJfQorCWcuc2V0Q29sb3IoQ29sb3IuYmx1ZSk7CisJZm9yIChpbnQgcyA9IDA7IHMgPCBOKk4gLSAxOyBzKyspCisJICAgIGcuZHJhd0xpbmUoeHBvcyhrbmlnaHRKW3MgIF0pK2hzLCB5cG9zKGtuaWdodElbcyAgXSkraHMsCisJCSAgICAgICB4cG9zKGtuaWdodEpbcysxXSkraHMsIHlwb3Moa25pZ2h0SVtzKzFdKStocyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvamF2YS9NYWtlZmlsZSBiL2V4YW1wbGVzL2phdmEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM5ZDYzMgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2phdmEvTWFrZWZpbGUKQEAgLTAsMCArMSwzNSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIwlNYWtlZmlsZSBmb3IgUHJvbG9nIENhZmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworUExKQVZBQyAgICAgPSBwbGphdmFjCitQTEpBVkFDT1BUUyA9IC12CisKK1BMSkFSICAgICA9IHBsamFyCitQTEpBUk9QVFMgPSAtdgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworYWxsOiAKKwktcm0gLWYgKi5wbAorCWxuIC1zIC4uL3Byb2xvZy9wZWcucGwgLgorCWxuIC1zIC4uL3Byb2xvZy9wZW50b21pbm8ucGwgLgorCWxuIC1zIC4uL3Byb2xvZy9xdWVlbnMucGwgLgorCWxuIC1zIC4uL3Byb2xvZy9rbmlnaHQucGwgLgorCSQoUExKQVIpICQoUExKQVJPUFRTKSBwZWcuamFyIHBlZy5wbAorCSQoUExKQVIpICQoUExKQVJPUFRTKSBwZW50b21pbm8uamFyIHBlbnRvbWluby5wbAorCSQoUExKQVIpICQoUExKQVJPUFRTKSBxdWVlbnMuamFyIHF1ZWVucy5wbAorCSQoUExKQVIpICQoUExKQVJPUFRTKSBrbmlnaHQuamFyIGtuaWdodC5wbAorCS1ybSAtZiAtciBwZWcKKwktcm0gLWYgLXIgcGVudG9taW5vCisJLXJtIC1mIC1yIHF1ZWVucworCS1ybSAtZiAtciBrbmlnaHQKKwkkKFBMSkFWQUMpICQoUExKQVZBQ09QVFMpIC1jcCBwZWcuamFyIFBlZy5qYXZhCisJJChQTEpBVkFDKSAkKFBMSkFWQUNPUFRTKSAtY3AgcGVudG9taW5vLmphciBQZW50b21pbm8uamF2YQorCSQoUExKQVZBQykgJChQTEpBVkFDT1BUUykgLWNwIHF1ZWVucy5qYXIgUXVlZW5zLmphdmEKKwkkKFBMSkFWQUMpICQoUExKQVZBQ09QVFMpIC1jcCBrbmlnaHQuamFyIEtuaWdodC5qYXZhCisKK2NsZWFuOgorCS1ybSAtZiBjb3JlICp+CisKK3JlYWxjbGVhbjogY2xlYW4KKwktcm0gLWYgKi5qYXIgKi5jbGFzcyAqLnBsCmRpZmYgLS1naXQgYS9leGFtcGxlcy9qYXZhL1BlZy5qYXZhIGIvZXhhbXBsZXMvamF2YS9QZWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDM4YzNiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvamF2YS9QZWcuamF2YQpAQCAtMCwwICsxLDE4NCBAQAoraW1wb3J0IGphdmEuYXd0Lio7CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisvKioKKyAqIDxjb2RlPlBlZzwvY29kZT48YnI+CisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICovCitwdWJsaWMgY2xhc3MgUGVnIGV4dGVuZHMgUHJvbG9nRnJhbWUgeworICAgIHByaXZhdGUgUGVnUGFuZWwgcGVnUGFuZWw7CisgICAgcHJpdmF0ZSBUZXh0RmllbGQgTl9GaWVsZDsKKyAgICBwcml2YXRlIFRleHRGaWVsZCBJX0ZpZWxkOworICAgIHByaXZhdGUgVGV4dEZpZWxkIEpfRmllbGQ7CisgICAgcHJpdmF0ZSBpbnQgTiAgPSA1OworICAgIHByaXZhdGUgaW50IEkwID0gNTsKKyAgICBwcml2YXRlIGludCBKMCA9IDM7CisKKyAgICBwdWJsaWMgUGVnKCkgeworCXNldFNpemUoNTAwLCA0MDApOworCXNldEJhY2tncm91bmQoQ29sb3IubGlnaHRHcmF5KTsKKwlzZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKwlhZGQoIk5vcnRoIiwgbmV3IExhYmVsKCJQZWciLCBMYWJlbC5DRU5URVIpKTsKKwlwZWdQYW5lbCA9IG5ldyBQZWdQYW5lbCgpOworCWFkZCgiQ2VudGVyIiwgcGVnUGFuZWwpOworCVBhbmVsIHAgPSBuZXcgUGFuZWwoKTsKKwlhZGQoIlNvdXRoIiwgcCk7CisJcC5hZGQobmV3IExhYmVsKCJOPSIpKTsKKwlOX0ZpZWxkID0gbmV3IFRleHRGaWVsZChJbnRlZ2VyLnRvU3RyaW5nKE4pLCAyKTsKKwlwLmFkZChOX0ZpZWxkKTsKKwlwLmFkZChuZXcgTGFiZWwoIihJLCBKKT0oIikpOworCUlfRmllbGQgPSBuZXcgVGV4dEZpZWxkKEludGVnZXIudG9TdHJpbmcoSTApLCAxKTsKKwlwLmFkZChJX0ZpZWxkKTsKKwlwLmFkZChuZXcgTGFiZWwoIiwiKSk7CisJSl9GaWVsZCA9IG5ldyBUZXh0RmllbGQoSW50ZWdlci50b1N0cmluZyhKMCksIDEpOworCXAuYWRkKEpfRmllbGQpOworCXAuYWRkKG5ldyBMYWJlbCgiKSIpKTsKKwljb250cm9sID0gbmV3IFByb2xvZ0NvbnRyb2xQYW5lbCh0aGlzKTsKKwlwLmFkZChjb250cm9sKTsKKwl2YWxpZGF0ZSgpOyAKKyAgICB9CisKKyAgICBUZXJtIGExID0gbnVsbDsKKyAgICBUZXJtIGEyID0gbnVsbDsKKyAgICBUZXJtIGEzID0gbnVsbDsKKyAgICBUZXJtIGE0ID0gbnVsbDsKKyAgICBQcmVkaWNhdGUgcGVnID0gbnVsbDsKKworICAgIHZvaWQgc2VuZEFyZ3VtZW50KCkgeworCXRyeSB7CisJICAgIE4gPSAgSW50ZWdlci5wYXJzZUludChOX0ZpZWxkLmdldFRleHQoKSk7CisJICAgIEkwID0gSW50ZWdlci5wYXJzZUludChJX0ZpZWxkLmdldFRleHQoKSk7CisJICAgIEowID0gSW50ZWdlci5wYXJzZUludChKX0ZpZWxkLmdldFRleHQoKSk7CisJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkgICAgTiA9IDE7CisJICAgIE5fRmllbGQuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKE4pKTsKKwkgICAgSTAgPSAxOworCSAgICBJX0ZpZWxkLnNldFRleHQoSW50ZWdlci50b1N0cmluZyhJMCkpOworCSAgICBKMCA9IDE7CisJICAgIEpfRmllbGQuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKEowKSk7CisJfQorCXRoaXMucHJvbG9nID0gbmV3IFByb2xvZ0NvbnRyb2woKTsKKwlhMSA9IG5ldyBJbnRlZ2VyVGVybShOKTsKKwlhMiA9IG5ldyBJbnRlZ2VyVGVybShJMCk7CisJYTMgPSBuZXcgSW50ZWdlclRlcm0oSjApOworCWE0ID0gbmV3IFZhcmlhYmxlVGVybSgpOworCVRlcm1bXSBhcmdzID0ge2ExLGEyLGEzLGE0fTsKKwlwZWcgPSBuZXcgUFJFRF9wZWdfZ2FtZV80KCk7CisJcHJvbG9nLnNldFByZWRpY2F0ZShwZWcsIGFyZ3MpOworICAgIH0KKworICAgIHZvaWQgcmVjZWl2ZVJlc3VsdCgpIHsKKwlUZXJtIHJlc3VsdCA9IGE0LmRlcmVmZXJlbmNlKCk7CisJaWYgKCEgcmVzdWx0LmlzTGlzdCgpKSB7CisJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZCByZXN1bHQhIik7CisJICAgIHJldHVybjsKKwl9CisJaW50IGxlbiA9ICgoTGlzdFRlcm0pcmVzdWx0KS5sZW5ndGgoKTsKKwlpbnQgbW92ZXNbXVtdID0gbmV3IGludFtsZW5dWzRdOwkKKwlUZXJtIGVsbTsKKwlUZXJtW10gYXJnczsKKwl0cnkgeworCSAgICBmb3IgKGludCBpPTA7IGk8bGVuOyBpKyspIHsKKwkJZWxtID0gKChMaXN0VGVybSlyZXN1bHQpLmNhcigpLmRlcmVmZXJlbmNlKCk7CisJCWFyZ3MgPSAoKFN0cnVjdHVyZVRlcm0pZWxtKS5hcmdzKCk7CisJCW1vdmVzW2ldWzBdID0gKChJbnRlZ2VyVGVybSkoYXJnc1swXS5kZXJlZmVyZW5jZSgpKSkuaW50VmFsdWUoKTsKKwkJbW92ZXNbaV1bMV0gPSAoKEludGVnZXJUZXJtKShhcmdzWzFdLmRlcmVmZXJlbmNlKCkpKS5pbnRWYWx1ZSgpOworCQltb3Zlc1tpXVsyXSA9ICgoSW50ZWdlclRlcm0pKGFyZ3NbMl0uZGVyZWZlcmVuY2UoKSkpLmludFZhbHVlKCk7CisJCW1vdmVzW2ldWzNdID0gKChJbnRlZ2VyVGVybSkoYXJnc1szXS5kZXJlZmVyZW5jZSgpKSkuaW50VmFsdWUoKTsKKwkJcmVzdWx0ID0gKChMaXN0VGVybSlyZXN1bHQpLmNkcigpLmRlcmVmZXJlbmNlKCk7CisJICAgIH0KKwkgICAgcGVnUGFuZWwuc2V0U29sKE4sIEkwLCBKMCwgbW92ZXMpOworCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYXJlPyIpOworCX0KKwlwZWdQYW5lbC5zdGFydCgpOwkvLyBzdGFydCBhbmltYXRpb24KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisJbmV3IFBlZygpOworICAgIH0KK30KKworY2xhc3MgUGVnUGFuZWwgZXh0ZW5kcyBQYW5lbCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICBwcml2YXRlIFRocmVhZCBwZWdBbmltYXRvciA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgTjsKKyAgICBwcml2YXRlIGludCBJMDsKKyAgICBwcml2YXRlIGludCBKMDsKKyAgICBwcml2YXRlIENvbG9yIHBlZ1tdW10gPSBudWxsOworICAgIHByaXZhdGUgaW50IG1vdmVzW11bXSA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgY2VsbFNpemU7CisgICAgcHJpdmF0ZSBpbnQgeDA7CisgICAgcHJpdmF0ZSBpbnQgeTA7CisgICAgcHJpdmF0ZSBpbnQgd2FpdCA9IDMwMDsKKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKKwlzdG9wKCk7CisJcGVnQW5pbWF0b3IgPSBuZXcgVGhyZWFkKHRoaXMpOworCXBlZ0FuaW1hdG9yLnN0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB7CisJcGVnQW5pbWF0b3IgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTb2woaW50IG4sIGludCBpMCwgaW50IGowLCBpbnQgbVtdW10pIHsKKwlOID0gbjsKKwlJMCA9IGkwOworCUowID0gajA7CisJbW92ZXMgPSBtOworCXBlZyA9IG51bGw7CisJcmVwYWludCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGcpIHsKKwlpbnQgbSwgbjsKKwlpZiAocGVnID09IG51bGwpCisJICAgIHJldHVybjsKKwkvKiB0aGlzLmcgPSBnOyAqLworCWludCB3ID0gZ2V0U2l6ZSgpLndpZHRoOworCWludCBoID0gZ2V0U2l6ZSgpLmhlaWdodDsKKwljZWxsU2l6ZSA9IE1hdGgubWluKHcsIGgpIC8gTjsKKwl4MCA9ICh3IC0gTiAqIGNlbGxTaXplKSAvIDI7CisJeTAgPSAoaCAtIE4gKiBjZWxsU2l6ZSkgLyAyOworCWZvciAoaW50IGkgPSAxOyBpIDw9IE47ICsraSkKKwkgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gaTsgKytqKSB7CisJCWcuc2V0Q29sb3IocGVnW2ldW2pdKTsKKwkJbSA9IGktMTsKKwkJbiA9IGotMTsKKwkJaW50IHggPSB4MCArIChOLTEtbSkqY2VsbFNpemUvMiArIG4qY2VsbFNpemU7CisJCWludCB5ID0geTAgKyBtKmNlbGxTaXplOworCQlnLmZpbGxPdmFsKHgrY2VsbFNpemUvNCwgeStjZWxsU2l6ZS80LCBjZWxsU2l6ZS8yLCBjZWxsU2l6ZS8yKTsKKwkgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzbGVlcChpbnQgdCkgeworCXRyeSB7CisJICAgIFRocmVhZC5zbGVlcCh0KTsKKwl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwlpZiAobW92ZXMgPT0gbnVsbCkKKwkgICAgcmV0dXJuOworCXBlZyA9IG5ldyBDb2xvcltOKzFdW04rMV07CisJZm9yIChpbnQgaSA9IDE7IGkgPD0gTjsgKytpKQorCSAgICBmb3IgKGludCBqID0gMTsgaiA8PSBpOyArK2opCisJCXBlZ1tpXVtqXSA9IENvbG9yLmJsdWU7CisJcGVnW0kwXVtKMF0gPSBDb2xvci53aGl0ZTsKKwlyZXBhaW50KCk7CisJZm9yIChpbnQgayA9IDA7IGsgPCBtb3Zlcy5sZW5ndGg7ICsraykgeworCSAgICBzbGVlcCh3YWl0KTsKKwkgICAgaW50IGkwID0gbW92ZXNba11bMF07CisJICAgIGludCBqMCA9IG1vdmVzW2tdWzFdOworCSAgICBpbnQgZGkgPSBtb3Zlc1trXVsyXTsKKwkgICAgaW50IGRqID0gbW92ZXNba11bM107CisJICAgIHBlZ1tpMF1bajBdID0gQ29sb3IucmVkOworCSAgICByZXBhaW50KCk7CisJICAgIHNsZWVwKHdhaXQpOworCSAgICBwZWdbaTBdW2owXSA9IENvbG9yLndoaXRlOworCSAgICBwZWdbaTArZGldW2owK2RqXSA9IENvbG9yLndoaXRlOworCSAgICBwZWdbaTArMipkaV1bajArMipkal0gPSBDb2xvci5ibHVlOworCSAgICByZXBhaW50KCk7CisJICAgIHNsZWVwKHdhaXQpOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qYXZhL1BlbnRvbWluby5qYXZhIGIvZXhhbXBsZXMvamF2YS9QZW50b21pbm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjc0MzFmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvamF2YS9QZW50b21pbm8uamF2YQpAQCAtMCwwICsxLDEzNSBAQAoraW1wb3J0IGphdmEuYXd0Lio7CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisvKioKKyAqIDxjb2RlPlBlbnRvbWlubzwvY29kZT48YnI+CisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICovCitwdWJsaWMgY2xhc3MgUGVudG9taW5vIGV4dGVuZHMgUHJvbG9nRnJhbWUgeworICAgIHByaXZhdGUgUGVudG9taW5vUGFuZWwgcGVudG9taW5vUGFuZWw7CisgICAgcHJpdmF0ZSBUZXh0RmllbGQgTV9GaWVsZDsKKyAgICBwcml2YXRlIGludCBNID0gNDsKKworICAgIHB1YmxpYyBQZW50b21pbm8oKSB7CisJc2V0U2l6ZSg1MDAsIDQwMCk7CisgICAgICAgIHNldEJhY2tncm91bmQoQ29sb3IubGlnaHRHcmF5KTsKKwlzZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKwlhZGQoIk5vcnRoIiwgbmV3IExhYmVsKCJQZW50b21pbm9zIFNvbHZlciIsIExhYmVsLkNFTlRFUikpOworCXBlbnRvbWlub1BhbmVsID0gbmV3IFBlbnRvbWlub1BhbmVsKCk7CisJYWRkKCJDZW50ZXIiLCBwZW50b21pbm9QYW5lbCk7CisJUGFuZWwgcCA9IG5ldyBQYW5lbCgpOworCWFkZCgiU291dGgiLCBwKTsKKwlwLmFkZChuZXcgTGFiZWwoIlJvd3M9IikpOworCU1fRmllbGQgPSBuZXcgVGV4dEZpZWxkKCI0IiwgMik7CisJcC5hZGQoTV9GaWVsZCk7CisJY29udHJvbCA9IG5ldyBQcm9sb2dDb250cm9sUGFuZWwodGhpcyk7CisJcC5hZGQoY29udHJvbCk7CisJdmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICBUZXJtIGExID0gbnVsbDsKKyAgICBUZXJtIGEyID0gbnVsbDsKKyAgICBQcmVkaWNhdGUgcGVudG9taW5vID0gbnVsbDsKKworICAgIHZvaWQgc2VuZEFyZ3VtZW50KCkgeworCXRyeSB7CisJICAgIE0gPSBJbnRlZ2VyLnBhcnNlSW50KE1fRmllbGQuZ2V0VGV4dCgpKTsKKwl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCSAgICBNID0gNDsKKwkgICAgTV9GaWVsZC5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcoTSkpOworCX0KKwl0aGlzLnByb2xvZyA9IG5ldyBQcm9sb2dDb250cm9sKCk7CisJYTEgPSBuZXcgSW50ZWdlclRlcm0oTSk7CisJYTIgPSBuZXcgVmFyaWFibGVUZXJtKCk7CisJVGVybVtdIGFyZ3MgPSB7YTEsYTJ9OworCXBlbnRvbWlubyA9IG5ldyBQUkVEX3BlbnRvbWlub19hcHBsZXRfMigpOworCXByb2xvZy5zZXRQcmVkaWNhdGUocGVudG9taW5vLCBhcmdzKTsKKyAgICB9CisKKyAgICB2b2lkIHJlY2VpdmVSZXN1bHQoKSB7CisJVGVybSByZXN1bHQgPSBhMi5kZXJlZmVyZW5jZSgpOworCWlmICggIXJlc3VsdC5pc0xpc3QoKSApIHsKKwkgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnZhbGlkIHJlc3VsdCEiKTsKKwkgICAgcmV0dXJuOworCX0KKwlpbnQgUm93LCBDb2w7CisJaWYgKE0gPT0gOCkgeworCSAgICBSb3cgPSBDb2wgPSA4OworCX0gCisJZWxzZSBpZiAoMyA8PSBNICYmIE0gPD0gNikgeworCSAgICBSb3cgPSBNOworCSAgICBDb2wgPSAoaW50KSg2MC9NKTsKKwl9IGVsc2UgeworCSAgICBSb3cgPSA0OworCSAgICBDb2wgPSAxNTsKKwl9CisJY2hhciBwZW50b21pbm9bXVtdID0gbmV3IGNoYXJbUm93XVtDb2xdOworCVRlcm0gZWxtOworCXRyeSB7CisJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUm93OyBpKyspIHsKKwkJZm9yIChpbnQgaiA9IDA7IGogPCBDb2w7IGorKykgeworCQkgICAgZWxtID0gKChMaXN0VGVybSlyZXN1bHQpLmNhcigpLmRlcmVmZXJlbmNlKCk7CisJCSAgICBwZW50b21pbm9baV1bal0gPSBlbG0udG9TdHJpbmcoKS50b0NoYXJBcnJheSgpWzBdOworCQkgICAgcmVzdWx0ID0gKChMaXN0VGVybSlyZXN1bHQpLmNkcigpLmRlcmVmZXJlbmNlKCk7CisJCX0KKwkgICAgfQorCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYXJlPyIpOworCX0KKwlwZW50b21pbm9QYW5lbC5zZXRQZW50b21pbm8oUm93LCBDb2wsIHBlbnRvbWlubyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgeworCW5ldyBQZW50b21pbm8oKTsKKyAgICB9Cit9CisKKworY2xhc3MgUGVudG9taW5vUGFuZWwgZXh0ZW5kcyBQYW5lbCB7CisgICAgcHJpdmF0ZSBpbnQgTTsKKyAgICBwcml2YXRlIGludCBOOworICAgIHByaXZhdGUgQ29sb3IgcGVudG9taW5vW11bXSA9IG51bGw7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQZW50b21pbm8oaW50IG0sIGludCBuLCBjaGFyIHBbXVtdKSB7CisJTSA9IG07CisJTiA9IG47CisJcGVudG9taW5vID0gbmV3IENvbG9yW01dW05dOworCWZvciAoaW50IGkgPSAwOyBpIDwgTTsgaSsrKSB7CisJICAgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgaisrKSB7CisJCUNvbG9yIGMgPSBDb2xvci53aGl0ZTsKKwkJc3dpdGNoIChwW2ldW2pdKSB7CisJCSAgY2FzZSAnRic6IGMgPSBDb2xvci5ibHVlOyBicmVhazsKKwkJICBjYXNlICdJJzogYyA9IENvbG9yLmdyZWVuOyBicmVhazsKKwkJICBjYXNlICdMJzogYyA9IENvbG9yLnJlZDsgYnJlYWs7CisJCSAgY2FzZSAnTic6IGMgPSBDb2xvci5jeWFuOyBicmVhazsKKwkJICBjYXNlICdQJzogYyA9IENvbG9yLm1hZ2VudGE7IGJyZWFrOworCQkgIGNhc2UgJ1QnOiBjID0gQ29sb3IueWVsbG93OyBicmVhazsKKwkJICBjYXNlICdVJzogYyA9IENvbG9yLm9yYW5nZTsgYnJlYWs7CisJCSAgY2FzZSAnVic6IGMgPSBDb2xvci5waW5rOyBicmVhazsKKwkJICBjYXNlICdXJzogYyA9IENvbG9yLmJsYWNrOyBicmVhazsKKwkJICBjYXNlICdYJzogYyA9IENvbG9yLmdyYXk7IGJyZWFrOworCQkgIGNhc2UgJ1knOiBjID0gbmV3IENvbG9yKDY0LDEyOCwxMjgpOyBicmVhazsKKwkJICBjYXNlICdaJzogYyA9IG5ldyBDb2xvcigxMjgsNjQsMTI4KTsgYnJlYWs7CisJCX0KKwkJcGVudG9taW5vW2ldW2pdID0gYzsKKwkgICAgfQorCX0KKwlyZXBhaW50KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZykgeworCWlmIChwZW50b21pbm8gPT0gbnVsbCkKKwkgIHJldHVybjsKKwlpbnQgdyA9IGdldFNpemUoKS53aWR0aDsKKwlpbnQgaCA9IGdldFNpemUoKS5oZWlnaHQ7CisJdyA9IHcgLSAxMDsKKwloID0gaCAtIDEwOworCWludCBjZWxsU2l6ZSA9IE1hdGgubWluKHcvTiwgaC9NKTsKKwlpbnQgeDAgPSAodyAtIE4gKiBjZWxsU2l6ZSkgLyAyICsgNTsKKwlpbnQgeTAgPSAoaCAtIE0gKiBjZWxsU2l6ZSkgLyAyICsgNTsKKwlmb3IgKGludCBpID0gMDsgaSA8IE07IGkrKykKKwkgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgaisrKSB7CisJICAgICAgZy5zZXRDb2xvcihwZW50b21pbm9baV1bal0pOworCSAgICAgIGcuZmlsbFJlY3QoeDAraipjZWxsU2l6ZSwgeTAraSpjZWxsU2l6ZSwgY2VsbFNpemUsIGNlbGxTaXplKTsKKwkgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qYXZhL1Byb2xvZ0NvbnRyb2xQYW5lbC5qYXZhIGIvZXhhbXBsZXMvamF2YS9Qcm9sb2dDb250cm9sUGFuZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGE0ZmVlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvamF2YS9Qcm9sb2dDb250cm9sUGFuZWwuamF2YQpAQCAtMCwwICsxLDE3MiBAQAoraW1wb3J0IGphdmEuYXd0Lio7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKKy8qKgorICogPGNvZGU+UHJvbG9nQ29udHJvbFBhbmVsPC9jb2RlPjxicj4KKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9sb2dDb250cm9sUGFuZWwgZXh0ZW5kcyBQYW5lbCBpbXBsZW1lbnRzIEFjdGlvbkxpc3RlbmVyIHsKKyAgICBwcml2YXRlIFByb2xvZ0ZyYW1lIHByb2xvZ0ZyYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIEJ1dHRvbiBzdGFydEJ1dHRvbjsKKyAgICBwcml2YXRlIEJ1dHRvbiBuZXh0QnV0dG9uOworICAgIHByaXZhdGUgQnV0dG9uIGFib3J0QnV0dG9uOworICAgIHByaXZhdGUgQnV0dG9uIHF1aXRCdXR0b247CisgICAgcHJpdmF0ZSBUZXh0RmllbGQgbWVzc2FnZTsKKyAgICBwcml2YXRlIGludCBjb3VudCA9IDA7CisgICAgcHJpdmF0ZSBpbnQgc3RhdGU7CisgICAgcHVibGljIGZpbmFsIGludCBTVEFSVCAgPSAxOworICAgIHB1YmxpYyBmaW5hbCBpbnQgV0FJVCAgID0gMjsKKyAgICBwdWJsaWMgZmluYWwgaW50IE5FWFQgICA9IDM7CisgICAgcHVibGljIGZpbmFsIGludCBET05FICAgPSA0OworICAgIHB1YmxpYyBmaW5hbCBpbnQgRVJST1IgID0gNTsKKyAgICBwdWJsaWMgZmluYWwgaW50IFFVSVQgICA9IDY7CisKKyAgICBwdWJsaWMgUHJvbG9nQ29udHJvbFBhbmVsKFByb2xvZ0ZyYW1lIF9wcm9sb2dGcmFtZSkgeworCXByb2xvZ0ZyYW1lID0gX3Byb2xvZ0ZyYW1lOworCXN0YXJ0QnV0dG9uID0gbmV3IEJ1dHRvbigiU3RhcnQiKTsKKwlzdGFydEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwluZXh0QnV0dG9uID0gbmV3IEJ1dHRvbigiTmV4dCIpOworCW5leHRCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJYWJvcnRCdXR0b24gPSBuZXcgQnV0dG9uKCJBYm9ydCIpOworCWFib3J0QnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOworCXF1aXRCdXR0b24gPSBuZXcgQnV0dG9uKCJRdWl0Iik7CisJcXVpdEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwltZXNzYWdlID0gbmV3IFRleHRGaWVsZCgyMCk7CisJbWVzc2FnZS5zZXRFZGl0YWJsZShmYWxzZSk7CisJUGFuZWwgcCA9IG5ldyBQYW5lbCgpOworCXAuYWRkKHN0YXJ0QnV0dG9uKTsKKwlwLmFkZChuZXh0QnV0dG9uKTsKKwlwLmFkZChhYm9ydEJ1dHRvbik7CisJcC5hZGQocXVpdEJ1dHRvbik7CisJc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisJYWRkKCJDZW50ZXIiLCBwKTsKKwlhZGQoIlNvdXRoIiwgbWVzc2FnZSk7CisJdmFsaWRhdGUoKTsKKwlzZXRTdGF0ZShTVEFSVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisJaWYgKHByb2xvZ0ZyYW1lLnByb2xvZyA9PSBudWxsKSAKKwkgICAgcmV0dXJuOworCXByb2xvZ0ZyYW1lLnByb2xvZy5zdG9wKCk7CisJcHJvbG9nRnJhbWUucHJvbG9nID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRTdGF0ZSgpIHsKKwlyZXR1cm4gc3RhdGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTdGF0ZShpbnQgcykgeworCXN3aXRjaCAocykgeworCWNhc2UgU1RBUlQ6CisJICAgIHN0YXJ0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisJICAgIHN0YXJ0QnV0dG9uLnJlcXVlc3RGb2N1cygpOworCSAgICBuZXh0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworCSAgICBhYm9ydEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkgICAgcXVpdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworCSAgICBtZXNzYWdlLnNldFRleHQoIiIpOworCSAgICBicmVhazsKKwljYXNlIFdBSVQ6CisJICAgIHN0YXJ0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworCSAgICBuZXh0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworCSAgICBhYm9ydEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworCSAgICBhYm9ydEJ1dHRvbi5yZXF1ZXN0Rm9jdXMoKTsKKwkgICAgcXVpdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworCSAgICBtZXNzYWdlLnNldFRleHQoIldhaXQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSBORVhUOgorCSAgICBzdGFydEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworCSAgICBuZXh0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisJICAgIG5leHRCdXR0b24ucmVxdWVzdEZvY3VzKCk7CisJICAgIGFib3J0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisJICAgIHF1aXRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKwkgICAgbWVzc2FnZS5zZXRUZXh0KCJDb3VudCA9ICIgKyBjb3VudCk7CisJICAgIGJyZWFrOworCWNhc2UgRE9ORToKKwkgICAgc3RhcnRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKwkgICAgc3RhcnRCdXR0b24ucmVxdWVzdEZvY3VzKCk7CisJICAgIG5leHRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisJICAgIGFib3J0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworCSAgICBxdWl0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisJICAgIG1lc3NhZ2Uuc2V0VGV4dCgiQ291bnQgPSAiICsgY291bnQgKyAiIChubyBtb3JlKSIpOworCSAgICBicmVhazsKKwljYXNlIEVSUk9SOgorCSAgICBzdGFydEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworCSAgICBuZXh0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworCSAgICBhYm9ydEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkgICAgcXVpdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworCSAgICBxdWl0QnV0dG9uLnJlcXVlc3RGb2N1cygpOworCSAgICBtZXNzYWdlLnNldFRleHQoIkVycm9yIik7CisJICAgIGJyZWFrOworCWNhc2UgUVVJVDoKKwkgICAgc3RhcnRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisJICAgIG5leHRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisJICAgIGFib3J0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworCSAgICBxdWl0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworCSAgICBtZXNzYWdlLnNldFRleHQoIkJ5ZSIpOworCSAgICBicmVhazsKKwl9CisJc3RhdGUgPSBzOworCXJlcGFpbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWN0aW9uU3RhcnQoKSB7CisJcHJvbG9nRnJhbWUuc2VuZEFyZ3VtZW50KCk7CisJaWYgKHByb2xvZ0ZyYW1lLnByb2xvZyA9PSBudWxsKSAKKwkgICAgc2V0U3RhdGUoRVJST1IpOworCXNldFN0YXRlKFdBSVQpOworCWlmICggcHJvbG9nRnJhbWUucHJvbG9nLmNhbGwoKSApIHsKKwkgICAgcHJvbG9nRnJhbWUucmVjZWl2ZVJlc3VsdCgpOworCSAgICBjb3VudCA9IDE7CisJICAgIHNldFN0YXRlKE5FWFQpOworCX0gZWxzZSB7CisJICAgIGNsb3NlKCk7CisJICAgIHNldFN0YXRlKERPTkUpOworCSAgICBjb3VudCA9IDA7CisJfQorICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhY3Rpb25OZXh0KCkgeworCWlmIChwcm9sb2dGcmFtZS5wcm9sb2cgPT0gbnVsbCkgCisJICAgIHNldFN0YXRlKEVSUk9SKTsKKwlzZXRTdGF0ZShXQUlUKTsKKwlpZiAoIHByb2xvZ0ZyYW1lLnByb2xvZy5yZWRvKCkgKSB7CisJICAgIHByb2xvZ0ZyYW1lLnJlY2VpdmVSZXN1bHQoKTsKKwkgICAgY291bnQrKzsKKwkgICAgc2V0U3RhdGUoTkVYVCk7CisJfSBlbHNlIHsKKwkgICAgY2xvc2UoKTsKKwkgICAgc2V0U3RhdGUoRE9ORSk7CisJICAgIGNvdW50ID0gMDsKKwl9CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFjdGlvbkFib3J0KCkgeworCWNsb3NlKCk7CisJc2V0U3RhdGUoU1RBUlQpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhY3Rpb25RdWl0KCkgeworCWNsb3NlKCk7CisJc2V0U3RhdGUoUVVJVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpeworCVN0cmluZyBhY3Rpb24gPSBlLmdldEFjdGlvbkNvbW1hbmQoKTsKKwlpZiAoYWN0aW9uLmVxdWFscygiU3RhcnQiKSkKKwkgICAgYWN0aW9uU3RhcnQoKTsKKwllbHNlIGlmIChhY3Rpb24uZXF1YWxzKCJOZXh0IikpCisJICAgIGFjdGlvbk5leHQoKTsKKwllbHNlIGlmIChhY3Rpb24uZXF1YWxzKCJBYm9ydCIpKQorCSAgICBhY3Rpb25BYm9ydCgpOworCWVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoIlF1aXQiKSkKKwkgICAgYWN0aW9uUXVpdCgpOworCWVsc2UKKwkgICAgc3VwZXIucHJvY2Vzc0V2ZW50KGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGcpIHsKKwlwYWludENvbXBvbmVudHMoZyk7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2phdmEvUHJvbG9nRnJhbWUuamF2YSBiL2V4YW1wbGVzL2phdmEvUHJvbG9nRnJhbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjkxZTA4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvamF2YS9Qcm9sb2dGcmFtZS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworLyoqCisgKiA8Y29kZT5Qcm9sb2dGcmFtZTwvY29kZT48YnI+CisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvbG9nRnJhbWUgZXh0ZW5kcyBGcmFtZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICBQcm9sb2dDb250cm9sUGFuZWwgY29udHJvbCA9IG51bGw7IAorICAgIFRocmVhZCBmcmFtZVRocmVhZCA9IG51bGw7CisgICAgUHJvbG9nQ29udHJvbCBwcm9sb2cgPSBudWxsOworCisgICAgcHVibGljIFByb2xvZ0ZyYW1lKCkgeworCWZyYW1lVGhyZWFkID0gbmV3IFRocmVhZCh0aGlzKTsKKwlmcmFtZVRocmVhZC5zdGFydCgpOworICAgIH0KKworICAgIHZvaWQgc2VuZEFyZ3VtZW50KCkge30KKworICAgIHZvaWQgcmVjZWl2ZVJlc3VsdCgpIHt9CisKKyAgICB2b2lkIGFib3J0ZWQoKSB7fQorCisgICAgdm9pZCBxdWl0KCkgeworCVN5c3RlbS5leGl0KDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKwl0cnkgeworCSAgICBUaHJlYWQuc2xlZXAoNTAwKTsKKwl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQorCXNldFZpc2libGUodHJ1ZSk7CisJd2hpbGUgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgPT0gZnJhbWVUaHJlYWQpIHsKKwkgICAgLy8JICAgIHJlcGFpbnQoKTsKKwkgICAgdHJ5IHsKKwkJVGhyZWFkLnNsZWVwKDUwMCk7CisJICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9CisJICAgIGludCBzdGF0ZSA9IGNvbnRyb2wuZ2V0U3RhdGUoKTsKKwkgICAgaWYgKHN0YXRlID09IGNvbnRyb2wuQUJPUlQpIHsKKwkJYWJvcnRlZCgpOworCSAgICB9IGVsc2UgaWYgKHN0YXRlID09IGNvbnRyb2wuUVVJVCkgeworCQlicmVhazsKKwkgICAgfQorCX0KKwljb250cm9sLmNsb3NlKCk7CisJcXVpdCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2phdmEvUXVlZW5zLmphdmEgYi9leGFtcGxlcy9qYXZhL1F1ZWVucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYmViOWQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qYXZhL1F1ZWVucy5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACitpbXBvcnQgamF2YS5hd3QuKjsKK2ltcG9ydCBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKKy8qKgorICogPGNvZGU+UXVlZW5zPC9jb2RlPjxicj4KKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKi8KK3B1YmxpYyBjbGFzcyBRdWVlbnMgZXh0ZW5kcyBQcm9sb2dGcmFtZSB7CisgICAgcHJpdmF0ZSBRdWVlbnNQYW5lbCBxdWVlbnNQYW5lbDsKKyAgICBwcml2YXRlIFRleHRGaWVsZCBOX0ZpZWxkOworICAgIHByaXZhdGUgaW50IE4gPSA4OworICAKKyAgICBwdWJsaWMgUXVlZW5zKCkgeworCXNldFNpemUoNTAwLDQwMCk7CisgICAgICAgIHNldEJhY2tncm91bmQoQ29sb3IubGlnaHRHcmF5KTsKKwlzZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKwlhZGQoIk5vcnRoIiwgbmV3IExhYmVsKCJOLVF1ZWVucyBTb2x2ZXIiLCBMYWJlbC5DRU5URVIpKTsKKwlxdWVlbnNQYW5lbCA9IG5ldyBRdWVlbnNQYW5lbChOKTsKKwlhZGQoIkNlbnRlciIsIHF1ZWVuc1BhbmVsKTsKKwlQYW5lbCBwID0gbmV3IFBhbmVsKCk7CisJYWRkKCJTb3V0aCIsIHApOworCXAuYWRkKG5ldyBMYWJlbCgiTj0iKSk7CisJTl9GaWVsZCA9IG5ldyBUZXh0RmllbGQoSW50ZWdlci50b1N0cmluZyhOKSwgMik7CisJcC5hZGQoTl9GaWVsZCk7CisJY29udHJvbCA9IG5ldyBQcm9sb2dDb250cm9sUGFuZWwodGhpcyk7CisJcC5hZGQoY29udHJvbCk7CisJdmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICBUZXJtIGExID0gbnVsbDsKKyAgICBUZXJtIGEyID0gbnVsbDsKKyAgICBQcmVkaWNhdGUgbnF1ZWVucyA9IG51bGw7CisgICAgCisgICAgdm9pZCBzZW5kQXJndW1lbnQoKSB7CisJdHJ5IHsKKwkgICAgTiA9IEludGVnZXIucGFyc2VJbnQoTl9GaWVsZC5nZXRUZXh0KCkpOworCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJICAgIE4gPSAxOworCSAgICBOX0ZpZWxkLnNldFRleHQoSW50ZWdlci50b1N0cmluZyhOKSk7CisJfQorCXF1ZWVuc1BhbmVsLnNldE4oTik7CisJdGhpcy5wcm9sb2cgPSBuZXcgUHJvbG9nQ29udHJvbCgpOworCWExID0gbmV3IEludGVnZXJUZXJtKE4pOworCWEyID0gbmV3IFZhcmlhYmxlVGVybSgpOworCVRlcm1bXSBhcmdzID0ge2ExLGEyfTsKKwlucXVlZW5zID0gbmV3IFBSRURfcXVlZW5zXzIoKTsKKwlwcm9sb2cuc2V0UHJlZGljYXRlKG5xdWVlbnMsIGFyZ3MpOworICAgIH0KKworICAgIHZvaWQgcmVjZWl2ZVJlc3VsdCgpIHsKKwlUZXJtIHJlc3VsdCA9IGEyLmRlcmVmZXJlbmNlKCk7CisJaWYgKCAhcmVzdWx0LmlzTGlzdCgpIHx8ICgoTGlzdFRlcm0pcmVzdWx0KS5sZW5ndGgoKSAhPSBOICl7CisJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZCByZXN1bHQhIik7CisJICAgIHJldHVybjsKKwl9CisJaW50IHF1ZWVuc1tdID0gbmV3IGludFtOXTsKKwlUZXJtIGVsbTsKKwl0cnkgeworCSAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworCQllbG0gPSAoKExpc3RUZXJtKXJlc3VsdCkuY2FyKCkuZGVyZWZlcmVuY2UoKTsKKwkJcXVlZW5zW2ldID0gKChJbnRlZ2VyVGVybSllbG0pLmludFZhbHVlKCkgLSAxOworCQlyZXN1bHQgPSAoKExpc3RUZXJtKXJlc3VsdCkuY2RyKCk7CisJCS8qIFN5c3RlbS5vdXQucHJpbnRsbihxdWVlbnNbaV0pOyAqLworCSAgICB9CisJfSBjYXRjaCAoRXhjZXB0aW9uIGUpe30KKwlxdWVlbnNQYW5lbC5zZXRRdWVlbnMocXVlZW5zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisJbmV3IFF1ZWVucygpOworICAgIH0KK30KKworY2xhc3MgUXVlZW5zUGFuZWwgZXh0ZW5kcyBQYW5lbCB7CisgICAgcHJpdmF0ZSBpbnQgTiA9IDA7CisgICAgcHJpdmF0ZSBpbnQgcXVlZW5zW10gPSBudWxsOworICAgIHByaXZhdGUgaW50IGNlbGxTaXplID0gMDsKKyAgICBwcml2YXRlIEltYWdlIGJvYXJkSW1hZ2UgPSBudWxsOworICAgIHByaXZhdGUgaW50IGJvYXJkTiA9IDA7CisKKyAgICBwdWJsaWMgUXVlZW5zUGFuZWwoaW50IG4pIHsKKwlzZXROKG4pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE4oaW50IG4pIHsKKwlpZiAobiA+IDApIHsKKwkgICAgTiA9IG47CisJICAgIHNldFF1ZWVucyhudWxsKTsKKwkgICAgcmVwYWludCgpOworCX0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRRdWVlbnMoaW50IHFbXSkgeworCXF1ZWVucyA9IHE7CisJcmVwYWludCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkcmF3Qm9hcmQoR3JhcGhpY3MgZywgaW50IHgwLCBpbnQgeTApIHsKKwlpbnQgc2l6ZSA9IE4gKiBjZWxsU2l6ZTsKKwlpZiAoYm9hcmRJbWFnZSA9PSBudWxsIHx8IE4gIT0gYm9hcmROCisJICAgIHx8IGJvYXJkSW1hZ2UuZ2V0V2lkdGgobnVsbCkgIT0gc2l6ZQorCSAgICB8fCBib2FyZEltYWdlLmdldEhlaWdodChudWxsKSAhPSBzaXplKSB7CisJICAgIGJvYXJkSW1hZ2UgPSBjcmVhdGVJbWFnZShzaXplLCBzaXplKTsKKwkgICAgR3JhcGhpY3MgYiA9IGJvYXJkSW1hZ2UuZ2V0R3JhcGhpY3MoKTsKKwkgICAgYi5zZXRDb2xvcihDb2xvci53aGl0ZSk7CisJICAgIGIuZmlsbFJlY3QoMCwgMCwgc2l6ZSwgc2l6ZSk7CisJICAgIGIuc2V0Q29sb3IoQ29sb3IuZ3JheSk7CisJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKQorCQlmb3IgKGludCBqID0gMDsgaiA8IE47IGorKykKKwkJICAgIGlmICgoaSArIGopICUgMiA9PSAxKSB7CisJCQliLmZpbGxSZWN0KGkqY2VsbFNpemUsIGoqY2VsbFNpemUsIGNlbGxTaXplLCBjZWxsU2l6ZSk7CisJCSAgICB9CisJICAgIGJvYXJkTiA9IE47CisJfQorCWcuZHJhd0ltYWdlKGJvYXJkSW1hZ2UsIHgwLCB5MCwgbnVsbCk7CisgICAgfQorCSAgICAKKyAgICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBnKSB7CisJaWYgKE4gPCAxKQorCSAgICByZXR1cm47CisJaW50IHcgPSBnZXRTaXplKCkud2lkdGg7CisJaW50IGggPSBnZXRTaXplKCkuaGVpZ2h0OworCWNlbGxTaXplID0gTWF0aC5taW4odywgaCkgLyBOOworCWludCB4MCA9ICh3IC0gTiAqIGNlbGxTaXplKSAvIDI7CisJaW50IHkwID0gKGggLSBOICogY2VsbFNpemUpIC8gMjsKKwlkcmF3Qm9hcmQoZywgeDAsIHkwKTsKKwlpZiAocXVlZW5zID09IG51bGwgfHwgTiAhPSBxdWVlbnMubGVuZ3RoKQorCSAgICByZXR1cm47CisJaW50IGQgPSAoOCpjZWxsU2l6ZSkvMTA7CisJZy5zZXRDb2xvcihDb2xvci5vcmFuZ2UpOworCWZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisJICAgIGludCBqID0gcXVlZW5zW2ldOworCSAgICBpbnQgeCA9IHgwICsgaSAqIGNlbGxTaXplICsgKGNlbGxTaXplIC0gZCkgLyAyOworCSAgICBpbnQgeSA9IHkwICsgaiAqIGNlbGxTaXplICsgKGNlbGxTaXplIC0gZCkgLyAyOworCSAgICBnLmZpbGxBcmMoeCwgeSwgZCwgZCwgMCwgMzYwKTsKKwl9CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2phdmEvUkVBRE1FIGIvZXhhbXBsZXMvamF2YS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmNTc2YQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2phdmEvUkVBRE1FCkBAIC0wLDAgKzEsMjUgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyBSRUFETUUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgc29tZSBkZW1vbnN0cmF0aW9ucyBvZiBjYWxsaW5nIFByb2xvZyBmcm9tCitKYXZhLgorCisqIEtuaWdodCB0b3VyCisKKyAgJSBqYXZhIC1jcCAuOmtuaWdodC5qYXI6JFBMQ0FGRURJUi9wbGNhZmUuamFyIEtuaWdodAorCisqIFBlZyBzb2xpdGFpcmUKKworICAlIGphdmEgLWNwIC46cGVnLmphcjokUExDQUZFRElSL3BsY2FmZS5qYXIgUGVnCisKKyogUGVudG9taW5vIHB1enpsZQorCisgICUgamF2YSAtY3AgLjpwZW50b21pbm8uamFyOiRQTENBRkVESVIvcGxjYWZlLmphciBQZW50b21pbm8KKworKiBOLVF1ZWVucyBwdXp6bGUKKworICAlIGphdmEgLWNwIC46cXVlZW5zLmphcjokUExDQUZFRElSL3BsY2FmZS5qYXIgUXVlZW5zCisKKy0tCitNdXRzdW5vcmkgQkFOQkFSQQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvamF2YS9rbmlnaHQucGwgYi9leGFtcGxlcy9qYXZhL2tuaWdodC5wbApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zZDRmMDdhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvamF2YS9rbmlnaHQucGwKQEAgLTAsMCArMSBAQAorLi4vcHJvbG9nL2tuaWdodC5wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2phdmEvcGVnLnBsIGIvZXhhbXBsZXMvamF2YS9wZWcucGwKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMjBlNjkzNwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2phdmEvcGVnLnBsCkBAIC0wLDAgKzEgQEAKKy4uL3Byb2xvZy9wZWcucGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9qYXZhL3BlbnRvbWluby5wbCBiL2V4YW1wbGVzL2phdmEvcGVudG9taW5vLnBsCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmU4NDcxODQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qYXZhL3BlbnRvbWluby5wbApAQCAtMCwwICsxIEBACisuLi9wcm9sb2cvcGVudG9taW5vLnBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvamF2YS9xdWVlbnMucGwgYi9leGFtcGxlcy9qYXZhL3F1ZWVucy5wbApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi44ZTdlNmRmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvamF2YS9xdWVlbnMucGwKQEAgLTAsMCArMSBAQAorLi4vcHJvbG9nL3F1ZWVucy5wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3BsY2FmZS9NYWtlZmlsZSBiL2V4YW1wbGVzL3BsY2FmZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGQwMzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcGxjYWZlL01ha2VmaWxlCkBAIC0wLDAgKzEsMjkgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMJTWFrZWZpbGUgZm9yIFByb2xvZyBDYWZlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK1BMSkFWQUMgICAgID0gcGxqYXZhYworUExKQVZBQ09QVFMgPSAtdgorCitQTEpBUiAgICAgPSBwbGphcgorUExKQVJPUFRTID0gLXYKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLmphciAucGwgJChTVUZGSVhFUykKKworamFyX29iamVjdHMgOj0gJChwYXRzdWJzdCAlLnBsLCUuamFyLCQod2lsZGNhcmQgKi5wbCkpCisKKy5wbC5qYXI6CisJJChQTEpBUikgJChQTEpBUk9QVFMpICRAICQ8CisJLXJtIC1mIC1yICQqCisKK2FsbDogJChqYXJfb2JqZWN0cykKKwkkKFBMSkFWQUMpICQoUExKQVZBQ09QVFMpIC1jcCBxdWVlbnMuamFyIFQuamF2YQorCitjbGVhbjoKKwktcm0gLWYgY29yZSAqfgorCityZWFsY2xlYW46IGNsZWFuCisJLXJtIC1mICouamFyICouY2xhc3MKKwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvcGxjYWZlL1QuamF2YSBiL2V4YW1wbGVzL3BsY2FmZS9ULmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmYTI4NwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3BsY2FmZS9ULmphdmEKQEAgLTAsMCArMSw2MiBAQAoraW1wb3J0IGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworLyoqCisgKiBBIHNhbXBsZSBwcm9ncmFtIGZvciBtdWx0aS10aHJlYWQgZXhlY3V0aW9uLjxicj4KKyAqIFVzYWdlOiA8YnI+CisgKiA8cHJlPgorICogICAgICAgJSBwbGNhZmUgLWNwIHF1ZWVucy5qYXIgVAorICogPC9wcmU+CisgKgorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICovCitwdWJsaWMgY2xhc3MgVCB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgeworCWxvbmcgdCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCWJvb2xlYW4gcjEgPSB0cnVlOworCWJvb2xlYW4gcjIgPSB0cnVlOworCVRlcm0gYTFbXSA9IHtuZXcgSW50ZWdlclRlcm0oMTApLCBuZXcgVmFyaWFibGVUZXJtKCl9OworCVRlcm0gYTJbXSA9IHtuZXcgSW50ZWdlclRlcm0oOCksIG5ldyBWYXJpYWJsZVRlcm0oKX07CisKKwlQcm9sb2dDb250cm9sIGUxID0gbmV3IFByb2xvZ0NvbnRyb2woKTsKKwlQcm9sb2dDb250cm9sIGUyID0gbmV3IFByb2xvZ0NvbnRyb2woKTsKKwlUZXJtIHYxID0gbmV3IFZhcmlhYmxlVGVybSgpOworCVRlcm0gdjIgPSBuZXcgVmFyaWFibGVUZXJtKCk7CisJZTEuc2V0UHJlZGljYXRlKG5ldyBQUkVEX3F1ZWVuc18yKCksIGExKTsKKwllMi5zZXRQcmVkaWNhdGUobmV3IFBSRURfcXVlZW5zXzIoKSwgYTIpOworCVN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnQiKTsKKwllMS5zdGFydCgpOworCWUyLnN0YXJ0KCk7CisJd2hpbGUgKHIxIHx8IHIyKSB7CisJICAgIHRyeSB7CisJCVRocmVhZC5zbGVlcCgxMCk7CisJICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9CisJICAgIGlmIChyMSAmJiBlMS5yZWFkeSgpKSB7CisJCXIxID0gZTEubmV4dCgpOworCQlpZiAocjEpIHsKKwkJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3VjY2VzczEgPSAiICsgYTFbMV0pOworCQkgICAgZTEuY29udCgpOworCQl9IGVsc2UgeworCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsMSIpOworCQl9CisJICAgIH0gZWxzZSBpZiAocjIgJiYgZTIucmVhZHkoKSkgeworCQlyMiA9IGUyLm5leHQoKTsKKwkJaWYgKHIyKSB7CisJCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN1Y2Nlc3MyID0gIiArIGEyWzFdKTsKKwkJICAgIGUyLmNvbnQoKTsKKwkJfSBlbHNlIHsKKwkJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbDIiKTsKKwkJfQorCSAgICB9IGVsc2UgeworCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhaXRpbmciKTsKKwkJdHJ5IHsKKwkJICAgIFRocmVhZC5zbGVlcCgxMDApOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQorCSAgICB9CisJfQorCVN5c3RlbS5vdXQucHJpbnRsbigiRW5kIik7CisJbG9uZyB0MSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCWxvbmcgdDIgPSB0MSAtIHQ7CisJU3lzdGVtLm91dC5wcmludGxuKCJ0aW1lID0gIiArIHQyICsgIm1zZWMuIik7CisJCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvcGxjYWZlL2JvcmRlcl9sYXlvdXQucGwgYi9leGFtcGxlcy9wbGNhZmUvYm9yZGVyX2xheW91dC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGE3ZGMxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcGxjYWZlL2JvcmRlcl9sYXlvdXQucGwKQEAgLTAsMCArMSwzNiBAQAorJSAgIEZpbGUgICA6IGJvcmRlcl9sYXlvdXQucGwKKyUgICBBdXRob3JzOiBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCislICAgVXBkYXRlZDogMTUgTWF5IDIwMDgKKyUgICBQdXJwb3NlOiBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQKKyUgICBVc2FnZSAgOgorJQkgICAgICUgcGxjYWZlIC1jcCBib3JkZXJfbGF5b3V0LmphcgorJQkgICAgID8tIG1haW4uCisKK21haW4gOi0KKwlqYXZhX2NvbnN0cnVjdG9yKCdqYXZhLmF3dC5GcmFtZScsIFgpLAorCWphdmFfZ2V0X2ZpZWxkKCdqYXZhLmF3dC5Db2xvcicsIGJsdWUsIEJsdWUpLAorCWphdmFfZ2V0X2ZpZWxkKCdqYXZhLmF3dC5Db2xvcicsIHdoaXRlLCBXaGl0ZSksCisJamF2YV9tZXRob2QoWCwgc2V0U2l6ZSgzMDAsMjAwKSwgXyksCisJamF2YV9tZXRob2QoWCwgc2V0QmFja2dyb3VuZChCbHVlKSwgXyksCisJamF2YV9tZXRob2QoWCwgc2V0Rm9yZWdyb3VuZChXaGl0ZSksIF8pLAorCWphdmFfbWV0aG9kKFgsIHNldFRpdGxlKCdQcm9sb2cgQ2FmZScpLCBfKSwKKwlqYXZhX2NvbnN0cnVjdG9yKCdqYXZhLmF3dC5Cb3JkZXJMYXlvdXQnLCBCb3JkZXIpLAorCWphdmFfbWV0aG9kKFgsIHNldExheW91dChCb3JkZXIpLCBfKSwKKwlqYXZhX2dldF9maWVsZCgnamF2YS5hd3QuRm9udCcsICdCT0xEJywgQm9sZCksCisJamF2YV9jb25zdHJ1Y3RvcignamF2YS5hd3QuRm9udCcoJ0hlbHZldGljYScsIEJvbGQsIDEyKSwgRjEpLAorCWphdmFfbWV0aG9kKFgsIHNldEZvbnQoRjEpLCBfKSwKKwlqYXZhX2NvbnN0cnVjdG9yKCdqYXZhLmF3dC5CdXR0b24nKCdBIFByb2xvZyB0byBKYXZhIFRyYW5zbGF0b3InKSwgQjEpLAorCWphdmFfY29uc3RydWN0b3IoJ2phdmEuYXd0LkJ1dHRvbicoJ1Byb2xvZyBDYWZlJyksIEIyKSwKKwlqYXZhX2NvbnN0cnVjdG9yKCdqYXZhLmF3dC5CdXR0b24nKCdQcm9sb2cnKSwgQjMpLAorCWphdmFfY29uc3RydWN0b3IoJ2phdmEuYXd0LkJ1dHRvbicoJ0phdmEnKSwgQjQpLAorCWphdmFfY29uc3RydWN0b3IoJ2phdmEuYXd0LkJ1dHRvbicoJ3Byb2R1Y2VkIGJ5IE0uQmFuYmFyYSBhbmQgTi5UYW11cmEnKSwgQjUpLAorCWphdmFfbWV0aG9kKFgsIGFkZCgnTm9ydGgnLCAgQjEpLF8pLAorCWphdmFfbWV0aG9kKFgsIGFkZCgnQ2VudGVyJywgQjIpLF8pLAorCWphdmFfbWV0aG9kKFgsIGFkZCgnV2VzdCcsICAgQjMpLF8pLAorCWphdmFfbWV0aG9kKFgsIGFkZCgnRWFzdCcsICAgQjQpLF8pLAorCWphdmFfbWV0aG9kKFgsIGFkZCgnU291dGgnLCAgQjUpLF8pLAorCWphdmFfZ2V0X2ZpZWxkKCdqYXZhLmxhbmcuQm9vbGVhbicsICdUUlVFJywgVHJ1ZSksCisJamF2YV9tZXRob2QoWCwgc2V0VmlzaWJsZShUcnVlKSwgXykuCisKKworCmRpZmYgLS1naXQgYS9leGFtcGxlcy9wbGNhZmUvZnJhbWUucGwgYi9leGFtcGxlcy9wbGNhZmUvZnJhbWUucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc3ZTg3YQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3BsY2FmZS9mcmFtZS5wbApAQCAtMCwwICsxLDE2IEBACislICAgRmlsZSAgIDogZnJhbWUucGwKKyUgICBBdXRob3JzOiBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCislICAgVXBkYXRlZDogMTQgRmVicnVhcnkgMjAwOAorJSAgIFB1cnBvc2U6IGphdmEuYXd0LkZyYW1lCislICAgVXNhZ2UgIDoKKyUJICAgICAlIHBsY2FmZSAtY3AgZnJhbWUuamFyCislCSAgICAgPy0gbWFpbi4KKworbWFpbiA6LQorCWphdmFfY29uc3RydWN0b3IoJ2phdmEuYXd0LkZyYW1lJywgWCksCisJamF2YV9tZXRob2QoWCwgc2V0U2l6ZSgyMDAsMjAwKSwgXyksCisJamF2YV9nZXRfZmllbGQoJ2phdmEubGFuZy5Cb29sZWFuJywgJ1RSVUUnLCBUcnVlKSwKKwlqYXZhX21ldGhvZChYLCBzZXRWaXNpYmxlKFRydWUpLCBfKS4KKworCisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3BsY2FmZS9wYWludC5wbCBiL2V4YW1wbGVzL3BsY2FmZS9wYWludC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWU4OGVjCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcGxjYWZlL3BhaW50LnBsCkBAIC0wLDAgKzEsMzI1IEBACislICAgRmlsZSAgIDogcGFpbnQucGwKKyUgICBBdXRob3JzOiBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCislICAgVXBkYXRlZDogMTUgTWF5IDIwMDgKKyUgICBQdXJwb3NlOiBHcmFwaGljcworJSAgIFVzYWdlICA6CislCSAgICAgJSBwbGNhZmUgLWNwIHBhaW50LmphcgorJQkgICAgID8tIG1haW4uCislICAgICAgICAgb3IKKyUJICAgICAlIHBsY2FmZSAtY3AgcGFpbnQuamFyIC10IG1haW4KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCislIE1haW4KKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorbWFpbiA6LQorCXN0YXJ0LCAKKwlyZXBlYXQsCisJICB3cml0ZSgnU2ltcGxlIEdyYXBoaWNhbCBFeGFtcGxlcyAoYnllLiB0byBxdWl0KScpLCBubCwKKwkgIHRhYig0KSwgd3JpdGUoJ0V4YW1wbGU6IGV4MS4nKSwgbmwsCisJICB0YWIoNCksIHdyaXRlKCdFeGFtcGxlOiBleDIuJyksIG5sLAorCSAgdGFiKDQpLCB3cml0ZSgnRXhhbXBsZTogZXgzLicpLCBubCwgbmwsCisJICB3cml0ZSgnfDogJyksIGZsdXNoX291dHB1dCwKKwkgIHJlYWQoQ21kKSwKKwlkbyhDbWQpLAorCSEuCisKK2RvKFgpIDotIHZhcihYKSwgISwgZmFpbC4KK2RvKGJ5ZSkgIDotICEsIHN0b3AuCitkbyhxdWl0KSA6LSAhLCBzdG9wLgorZG8oZW5kX29mX2ZpbGUpIDotICEsIHN0b3AuCitkbyhDbWQpIDotCisJc3RhdGlzdGljcyhydW50aW1lLCBfKSwKKwljYWxsKENtZCksCisJc3RhdGlzdGljcyhydW50aW1lLCBbXyxUXSksCisJdGFiKDMpLCB3cml0ZSgnVGltZSA9ICcpLCB3cml0ZShUKSwgd3JpdGUoJyBtc2VjJyksIG5sLCBubCwKKwlmYWlsLgorCislJSUgRXhhbXBsZSAxCitleDEgOi0gaW5pdCwgZXgxKDMwKS4KKworZXgxKE4pIDotCisJaW50ZWdlcihOKSwKKwlSIGlzIHJhbmRvbSoyNTUsIAorCUcgaXMgcmFuZG9tKjI1NSwgCisJQiBpcyByYW5kb20qMjU1LCAKKwlzZXRDb2xvcihyZ2IoUixHLEIpKSwKKwlnZXRDZW50ZXIoQ3gsIEN5KSwKKwlmb3IoSSwgLU4sIE4pLAorCSAgICBYMSBpcyBDeCtJKjUsCisJICAgIFkxIGlzIEN5K04qNSwKKwkgICAgWDIgaXMgQ3grTio1LAorCSAgICBZMiBpcyBDeS1JKjUsCisJICAgIGRyYXdMaW5lKFgxLCBZMSwgWDIsIFkyKSwKKwkgICAgQTEgaXMgQ3gtSSo1LAorCSAgICBCMSBpcyBDeS1OKjUsCisJICAgIEEyIGlzIEN4LU4qNSwKKwkgICAgQjIgaXMgQ3krSSo1LAorCSAgICBkcmF3TGluZShBMSwgQjEsIEEyLCBCMiksCisgICAgICAgIGZhaWwuCitleDEoXykuCisKKyUlJSBFeGFtcGxlIDIKK2V4MiA6LSBpbml0LCBleDIoNikuCisKK2V4MihOKSA6LQorCWludGVnZXIoTiksCisJZm9yKEksIDEsIE4pLAorCSAgTSBpcyBJKjUsIAorCSAgZXgxKE0pLAorICAgICAgICBmYWlsLgorZXgyKF8pLgorCislJSUgRXhhbXBsZSAzCitleDMgOi0gaW5pdCwgZXgzKDEwMCkuCisKK2V4MyhOKSA6LQorCWludGVnZXIoTiksCisJZ2V0Q2VudGVyKEN4LCBDeSksCisJUiBpcyByYW5kb20qMjU1LCAKKwlHIGlzIHJhbmRvbSoyNTUsIAorCUIgaXMgcmFuZG9tKjI1NSwgCisJc2V0Q29sb3IocmdiKFIsRyxCKSksCisJZm9yKEksIDEsIE4pLAorCSAgICBYIGlzIHJvdW5kKEN4LUkqMy8yKSwKKwkgICAgWSBpcyByb3VuZChDeS1JKjMvMiksCisJICAgIFcgaXMgSSozLAorCSAgICBIIGlzIEkqMywKKwkgICAgZHJhd092YWwoWCwgWSwgVywgSCksCisgICAgICAgIGZhaWwuCQorZXgzKFgpLgorCislJSUgVXRpbGl0aWVzCitmb3IoSSwgSSwgTikgOi0gSSA9PCBOLgorZm9yKEksIEosIE4pIDotIEogPCBOLCBKMSBpcyBKKzEsIGZvcihJLCBKMSwgTikuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSBTdGFydCwgSW5pdCwgYW5kIFN0b3AKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorOi0gZHluYW1pYyBjdXJyZW50X2ltYWdlLzEsIGN1cnJlbnRfY2FudmFzLzEsIGN1cnJlbnRfZnJhbWUvMS4KKzotIGR5bmFtaWMgY3VycmVudF9jb2xvci8yLCBjdXJyZW50X2ZvbnQvMy4KKworc3RhcnQgOi0gc3RhcnQoMzUwLCAzNTApLCBpbml0LgorCitzdGFydChXaWR0aCwgSGVpZ2h0KSA6LQorCWludGVnZXIoV2lkdGgpLAorCWludGVnZXIoSGVpZ2h0KSwKKwlyZXRyYWN0YWxsKGN1cnJlbnRfZnJhbWUoXykpLAorCXJldHJhY3RhbGwoY3VycmVudF9jYW52YXMoXykpLAorCXJldHJhY3RhbGwoY3VycmVudF9pbWFnZShfKSksCisJcmV0cmFjdGFsbChjdXJyZW50X2NvbG9yKF8sXykpLAorCXJldHJhY3RhbGwoY3VycmVudF9mb250KF8sXyxfKSksCisJamF2YV9jb25zdHJ1Y3RvcignamF2YS5hd3QuRnJhbWUnLCBGcmFtZSksCisJamF2YV9jb25zdHJ1Y3RvcignamF2YS5hd3QuQm9yZGVyTGF5b3V0JywgQm9yZGVyKSwKKwlqYXZhX21ldGhvZChGcmFtZSwgc2V0TGF5b3V0KEJvcmRlciksIF8pLAorCWphdmFfbWV0aG9kKEZyYW1lLCBzZXRTaXplKFdpZHRoLEhlaWdodCksIF8pLAorCWphdmFfbWV0aG9kKEZyYW1lLCBzZXRUaXRsZSgnU2ltcGxlIEdyYXBoaWNhbCBFeGFtcGxlcycpLCBfKSwKKwlqYXZhX2NvbnN0cnVjdG9yKCdqYXZhLmF3dC5DYW52YXMnLCBDYW52YXMpLAorCWphdmFfbWV0aG9kKEZyYW1lLCBhZGQoJ0NlbnRlcicsIENhbnZhcyksIF8pLAorCWphdmFfZ2V0X2ZpZWxkKCdqYXZhLmxhbmcuQm9vbGVhbicsICdUUlVFJywgVHJ1ZSksCisJamF2YV9tZXRob2QoRnJhbWUsIHNldFZpc2libGUoVHJ1ZSksIF8pLAorCWphdmFfbWV0aG9kKENhbnZhcywgZ2V0V2lkdGgsICBDVyksCisJamF2YV9tZXRob2QoQ2FudmFzLCBnZXRIZWlnaHQsIENIKSwKKwlqYXZhX21ldGhvZChDYW52YXMsIGNyZWF0ZUltYWdlKENXLENIKSwgSW1hZ2UpLAorCWFzc2VydHooY3VycmVudF9mcmFtZShGcmFtZSkpLAorCWFzc2VydHooY3VycmVudF9jYW52YXMoQ2FudmFzKSksCisJYXNzZXJ0eihjdXJyZW50X2ltYWdlKEltYWdlKSkuCisKK2luaXQgOi0KKwlzZXRDb2xvcihibGFjayksCisJc2V0QmFja2dyb3VuZCh3aGl0ZSksCisJc2V0Rm9udChkaWFsb2csIGl0YWxpYywgMTIpLAorCWdldFNpemUoVywgSCksCisJY2xlYXJSZWN0KDAsIDAsIFcsIEgpLgorCitzdG9wIDotCisJY3VycmVudF9mcmFtZShGcmFtZSksCisJamF2YV9nZXRfZmllbGQoJ2phdmEubGFuZy5Cb29sZWFuJywgJ0ZBTFNFJywgRiksCisJamF2YV9tZXRob2QoRnJhbWUsIHNldFZpc2libGUoRiksIF8pLgorCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUgU2l6ZQorJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCitnZXRIZWlnaHQoWCkgOi0KKwljdXJyZW50X2NhbnZhcyhDKSwKKwlqYXZhX21ldGhvZChDLCBnZXRIZWlnaHQsIFgpLgorCitnZXRXaWR0aChYKSA6LQorCWN1cnJlbnRfY2FudmFzKEMpLAorCWphdmFfbWV0aG9kKEMsIGdldFdpZHRoLCBYKS4KKworZ2V0Q2VudGVyKFgsIFkpIDotCisJZ2V0V2lkdGgoVyksCisJZ2V0SGVpZ2h0KEgpLAorCVggaXMgKFcrMSkvLzIsCisJWSBpcyAoSCsxKS8vMi4KKworZ2V0U2l6ZShYLCBZKSA6LSAKKwlnZXRXaWR0aChYKSwgCisJZ2V0SGVpZ2h0KFkpLgorCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUgR3JhcGhpY3MKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorZ2V0X2dyYXBoaWNzKEdyYSwgQ2FudmFzKSA6LQorCWN1cnJlbnRfY2FudmFzKENhbnZhcyksCisJamF2YV9tZXRob2QoQ2FudmFzLCBnZXRHcmFwaGljcywgR3JhKS4KKworZ2V0X2ltYWdlX2dyYXBoaWNzKEltZ0dyYSwgSW1hZ2UpIDotCisJY3VycmVudF9pbWFnZShJbWFnZSksCisJamF2YV9tZXRob2QoSW1hZ2UsICBnZXRHcmFwaGljcywgSW1nR3JhKS4KKworcGFpbnQoRnVuY3Rpb24pIDotCisJZ2V0X2dyYXBoaWNzKEdyYSwgQ2FudmFzKSwKKwlnZXRfaW1hZ2VfZ3JhcGhpY3MoSW1nR3JhLCBJbWFnZSksCisJamF2YV9tZXRob2QoR3JhLCAgICBGdW5jdGlvbiwgXyksCisJamF2YV9tZXRob2QoSW1nR3JhLCBGdW5jdGlvbiwgXyksCisJamF2YV9tZXRob2QoR3JhLCAgICBkcmF3SW1hZ2UoSW1hZ2UsMCwwLENhbnZhcyksIF8pLgorCityZXBhaW50IDotCisJZ2V0X2dyYXBoaWNzKEdyYSwgQ2FudmFzKSwKKwlnZXRfaW1hZ2VfZ3JhcGhpY3MoXywgSW1hZ2UpLAorCWphdmFfbWV0aG9kKEdyYSwgZHJhd0ltYWdlKEltYWdlLDAsMCxDYW52YXMpLCBfKS4KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCislIERyYXdpbmcgRnVuY3Rpb25zCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKK2NsZWFyUmVjdChYLCBZLCBXaWR0aCwgSGVpZ2h0KSA6LQorCWludGVnZXIoWCksIGludGVnZXIoWSksIGludGVnZXIoV2lkdGgpLCBpbnRlZ2VyKEhlaWdodCksCisJcGFpbnQoY2xlYXJSZWN0KFgsWSxXaWR0aCxIZWlnaHQpKS4KKworZHJhd0xpbmUoWDEsIFkxLCBYMiwgWTIpIDotIAorCWludGVnZXIoWDEpLCBpbnRlZ2VyKFkxKSwgaW50ZWdlcihYMiksIGludGVnZXIoWTIpLAorCXBhaW50KGRyYXdMaW5lKFgxLFkxLFgyLFkyKSkuCisKK2RyYXdTdHJpbmcoU3RyLCBYLCBZKSA6LSAKKwlhdG9tKFN0ciksIGludGVnZXIoWCksIGludGVnZXIoWSksCisJcGFpbnQoZHJhd1N0cmluZyhTdHIsWCxZKSkuCisKK2RyYXdPdmFsKFgsIFksIFdpZHRoLCBIZWlnaHQpIDotCisJaW50ZWdlcihYKSwgaW50ZWdlcihZKSwgaW50ZWdlcihXaWR0aCksIGludGVnZXIoSGVpZ2h0KSwKKwlwYWludChkcmF3T3ZhbChYLFksV2lkdGgsSGVpZ2h0KSkuCisKK2ZpbGwzRFJlY3QoWCwgWSwgV2lkdGgsIEhlaWdodCwgUmFpc2UpIDotCisJaW50ZWdlcihYKSwgaW50ZWdlcihZKSwgaW50ZWdlcihXaWR0aCksIGludGVnZXIoSGVpZ2h0KSwKKwlib29sZWFuX21hcChSYWlzZSwgQm9vbCksCQorCXBhaW50KGZpbGwzRFJlY3QoWCxZLFdpZHRoLEhlaWdodCxCb29sKSkuCisKK2RyYXdSZWN0KFgsIFksIFdpZHRoLCBIZWlnaHQpIDotCisJaW50ZWdlcihYKSwgaW50ZWdlcihZKSwgaW50ZWdlcihXaWR0aCksIGludGVnZXIoSGVpZ2h0KSwKKwlwYWludChkcmF3UmVjdChYLFksV2lkdGgsSGVpZ2h0KSkuCisKK2ZpbGxSZWN0KFgsIFksIFdpZHRoLCBIZWlnaHQpIDotCisJaW50ZWdlcihYKSwgaW50ZWdlcihZKSwgaW50ZWdlcihXaWR0aCksIGludGVnZXIoSGVpZ2h0KSwKKwlwYWludChmaWxsUmVjdChYLFksV2lkdGgsSGVpZ2h0KSkuCisKK2RyYXczRFJlY3QoWCwgWSwgV2lkdGgsIEhlaWdodCwgUmFpc2UpIDotCisJaW50ZWdlcihYKSwgaW50ZWdlcihZKSwgaW50ZWdlcihXaWR0aCksIGludGVnZXIoSGVpZ2h0KSwKKwlib29sZWFuX21hcChSYWlzZSwgQm9vbCksCQorCXBhaW50KGRyYXczRFJlY3QoWCxZLFdpZHRoLEhlaWdodCxCb29sKSkuCisKK2ZpbGxPdmFsKFgsIFksIFdpZHRoLCBIZWlnaHQpIDotCisJaW50ZWdlcihYKSwgaW50ZWdlcihZKSwgaW50ZWdlcihXaWR0aCksIGludGVnZXIoSGVpZ2h0KSwKKwlwYWludChmaWxsT3ZhbChYLFksV2lkdGgsSGVpZ2h0KSkuCisKK2RyYXdBcmMoWCwgWSwgV2lkdGgsIEhlaWdodCwgU3RhcnRBbmdsZSwgQXJjQW5nbGUpIDotCisJaW50ZWdlcihYKSwgaW50ZWdlcihZKSwgaW50ZWdlcihXaWR0aCksIGludGVnZXIoSGVpZ2h0KSwKKwlpbnRlZ2VyKFN0YXJ0QW5nbGUpLCBpbnRlZ2VyKEFyY0FuZ2xlKSwgCisJcGFpbnQoZHJhd0FyYyhYLFksV2lkdGgsSGVpZ2h0LFN0YXJ0QW5nbGUsQXJjQW5nbGUpKS4KKworZmlsbEFyYyhYLCBZLCBXaWR0aCwgSGVpZ2h0LCBTdGFydEFuZ2xlLCBBcmNBbmdsZSkgOi0KKwlpbnRlZ2VyKFgpLCBpbnRlZ2VyKFkpLCBpbnRlZ2VyKFdpZHRoKSwgaW50ZWdlcihIZWlnaHQpLAorCWludGVnZXIoU3RhcnRBbmdsZSksIGludGVnZXIoQXJjQW5nbGUpLCAKKwlwYWludChmaWxsQXJjKFgsWSxXaWR0aCxIZWlnaHQsU3RhcnRBbmdsZSxBcmNBbmdsZSkpLgorCitkcmF3Um91bmRSZWN0KFgsIFksIFdpZHRoLCBIZWlnaHQsIEFyY1dpZHRoLCBBcmNIZWlnaHQpIDotCisJaW50ZWdlcihYKSwgaW50ZWdlcihZKSwgaW50ZWdlcihXaWR0aCksIGludGVnZXIoSGVpZ2h0KSwKKwlpbnRlZ2VyKEFyY1dpZHRoKSwgaW50ZWdlcihBcmNIZWlnaHQpLAorCXBhaW50KGRyYXdSb3VuZFJlY3QoWCxZLFdpZHRoLEhlaWdodCxBcmNXaWR0aCxBcmNIZWlnaHQpKS4KKworZmlsbFJvdW5kUmVjdChYLCBZLCBXaWR0aCwgSGVpZ2h0LCBBcmNXaWR0aCwgQXJjSGVpZ2h0KSA6LQorCWludGVnZXIoWCksIGludGVnZXIoWSksIGludGVnZXIoV2lkdGgpLCBpbnRlZ2VyKEhlaWdodCksCisJaW50ZWdlcihBcmNXaWR0aCksIGludGVnZXIoQXJjSGVpZ2h0KSwKKwlwYWludChmaWxsUm91bmRSZWN0KFgsWSxXaWR0aCxIZWlnaHQsQXJjV2lkdGgsQXJjSGVpZ2h0KSkuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSBDb2xvcgorJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCitzZXRDb2xvcihDbykgOi0gY29sb3JfbWFwKENvLCBPYmopLCAhLAorCWN1cnJlbnRfY2FudmFzKENhbnZhcyksCisJamF2YV9tZXRob2QoQ2FudmFzLCBzZXRGb3JlZ3JvdW5kKE9iaiksIF8pLAorCXJldHJhY3RhbGwoY3VycmVudF9jb2xvcihfLF8pKSwKKwlhc3NlcnR6KGN1cnJlbnRfY29sb3IoQ28sIE9iaikpLgorc2V0Q29sb3IoQ28pIDotIAorCWZpbmRhbGwoQ28sIGNvbG9yKENvKSwgRG9tYWluKSwKKwl0aHJvdyhkb21haW5fZXJyb3Ioc2V0Q29sb3IoQ28pLDEsWydyZ2IoUixHLEIpJ3xEb21haW5dLENvKSkuCisKK3NldEJhY2tncm91bmQoQ28pIDotIGNvbG9yX21hcChDbywgT2JqKSwgISwKKwljdXJyZW50X2NhbnZhcyhDYW52YXMpLAorCWphdmFfbWV0aG9kKENhbnZhcywgc2V0QmFja2dyb3VuZChPYmopLCBfKS4KK3NldEJhY2tncm91bmQoQ28pIDotIAorCWZpbmRhbGwoQ28sIGNvbG9yKENvKSwgRG9tYWluKSwKKwl0aHJvdyhkb21haW5fZXJyb3Ioc2V0QmFja2dyb3VuZChDbyksMSxbJ3JnYihSLEcsQiknfERvbWFpbl0sQ28pKS4KKworY29sb3JfbWFwKENvLCBPYmopIDotIGNvbG9yKENvKSwgICEsIAorCWphdmFfZ2V0X2ZpZWxkKCdqYXZhLmF3dC5Db2xvcicsIENvLCBPYmopLgorY29sb3JfbWFwKENvLCBPYmopIDotIAorCUNvID0gcmdiKFgsWSxaKSwgCisJUiBpcyByb3VuZChYKSwgMCA9PCBSLCBSID08IDI1NSwKKwlHIGlzIHJvdW5kKFkpLCAwID08IEcsIEcgPTwgMjU1LAorCUIgaXMgcm91bmQoWiksIDAgPTwgQiwgQiA9PCAyNTUsCisJISwKKwlqYXZhX2NvbnN0cnVjdG9yKCdqYXZhLmF3dC5Db2xvcicoUixHLEIpLCBPYmopLgorCitjb2xvcihibGFjaykuCitjb2xvcihibHVlKS4KK2NvbG9yKGN5YW4pLgorY29sb3IoZGFya0dyYXkpLgorY29sb3IoZ3JheSkuCitjb2xvcihncmVlbikuCitjb2xvcihsaWdodEdyYXkpLgorY29sb3IobWFnZW50YSkuCitjb2xvcihvcmFuZ2UpLgorY29sb3IocGluaykuCitjb2xvcihyZWQpLgorY29sb3Iod2hpdGUpLgorY29sb3IoeWVsbG93KS4KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCislIEZvbnQKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorc2V0Rm9udChGb250LCBTdHlsZSwgU2l6ZSkgOi0gZm9udF9tYXAoRm9udCwgU3R5bGUsIFNpemUsIE9iaiksICEsCisJY3VycmVudF9jYW52YXMoQ2FudmFzKSwKKwlqYXZhX21ldGhvZChDYW52YXMsIHNldEZvbnQoT2JqKSwgXyksCisJcmV0cmFjdGFsbChjdXJyZW50X2ZvbnQoXyxfLF8pKSwKKwlhc3NlcnR6KGN1cnJlbnRfZm9udChGb250LFN0eWxlLFNpemUpKS4KK3NldEZvbnQoRm9udCwgU3R5bGUsIFNpemUpIDotCisJZmluZGFsbChGLCBmb250KEYpLCBEb21haW4pLAorCXRocm93KGRvbWFpbl9lcnJvcihzZXRGb250KEZvbnQsIFN0eWxlLCBTaXplKSwxLERvbWFpbixGb250KSkuCisKK2ZvbnRfbWFwKEZvbnQsIFN0eWxlLCBTaXplLCBPYmopIDotIAorCWludGVnZXIoU2l6ZSksCisJZm9udChGb250LCBGKSwKKwlmb250X3N0eWxlKFN0eWxlLCBTdCksCisJamF2YV9jb25zdHJ1Y3RvcignamF2YS5hd3QuRm9udCcoRiwgU3QsIFNpemUpLCBPYmopLgorCitmb250KGhlbHZldGljYSwgICAgJ0hlbHZldGljYScpLgorZm9udCh0aW1lc19yb21hbiwgICdUaW1lc1JvbWFuJykuCitmb250KGNvdXJpZXIsICAgICAgJ0NvdXJpZXInKS4KK2ZvbnQoZGlhbG9nLCAgICAgICAnRGlhbG9nJykuCitmb250KGRpYWxvZ19pbnB1dCwgJ0RpYWxvZ0lucHV0JykuCisKK2ZvbnRfc3R5bGUocGxhaW4sICAwKS4KK2ZvbnRfc3R5bGUoYm9sZCwgICAxKS4KK2ZvbnRfc3R5bGUoaXRhbGljLCAyKS4KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCislIEJvb2xlYW4KKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorYm9vbGVhbl9tYXAoQm9vbCwgT2JqKSA6LQorCWJvb2xlYW4oQm9vbCwgIEIpLAorCWphdmFfZ2V0X2ZpZWxkKCdqYXZhLmxhbmcuQm9vbGVhbicsIEIsIE9iaikuCisKK2Jvb2xlYW4odHJ1ZSwgICdUUlVFJykuCitib29sZWFuKGZhbHNlLCAnRkFMU0UnKS4KKworJSUlIEVORApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvcGxjYWZlL3F1ZWVucy5wbCBiL2V4YW1wbGVzL3BsY2FmZS9xdWVlbnMucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyMWViMQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3BsY2FmZS9xdWVlbnMucGwKQEAgLTAsMCArMSwzMSBAQAorJSBGaWxlICAgOiBxdWVlbnMucGwKKyUgVXBkYXRlZDogMTQgRmVicnVhcnkgMjAwOAorJSBQdXJwb3NlOiBOLVF1ZWVuIFB1enpsZSAocG9zZWQgYnkgRnJhbnogTmF1Y2gsIDE4NTApCisKK3F1ZWVucyhOLFFzKSA6LQorCXJhbmdlKDEsTixOcyksCisJcXVlZW5zKE5zLFtdLFFzKS4KKworcXVlZW5zKFtdLFFzLFFzKS4KK3F1ZWVucyhVbnBsYWNlZFFzLFNhZmVRcyxRcykgOi0KKwlzZWxlY3QoVW5wbGFjZWRRcyxVbnBsYWNlZFFzMSxRKSwKKwlub3RfYXR0YWNrKFNhZmVRcyxRKSwKKwlxdWVlbnMoVW5wbGFjZWRRczEsW1F8U2FmZVFzXSxRcykuCisKK25vdF9hdHRhY2soWHMsWCkgOi0KKwlub3RfYXR0YWNrKFhzLFgsMSkuCisKK25vdF9hdHRhY2soW10sXyxfKSA6LSAhLgorbm90X2F0dGFjayhbWXxZc10sWCxOKSA6LQorCVggPVw9IFkrTiwgWCA9XD0gWS1OLAorCU4xIGlzIE4rMSwKKwlub3RfYXR0YWNrKFlzLFgsTjEpLgorCitzZWxlY3QoW1h8WHNdLFhzLFgpLgorc2VsZWN0KFtZfFlzXSxbWXxac10sWCkgOi0gc2VsZWN0KFlzLFpzLFgpLgorCityYW5nZShOLE4sW05dKSA6LSAhLgorcmFuZ2UoTSxOLFtNfE5zXSkgOi0KKwlNIDwgTiwKKwlNMSBpcyBNKzEsCisJcmFuZ2UoTTEsTixOcykuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9wbGNhZmUvdGhyZWFkLnBsIGIvZXhhbXBsZXMvcGxjYWZlL3RocmVhZC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWNmNTNlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcGxjYWZlL3RocmVhZC5wbApAQCAtMCwwICsxLDg0IEBACislICAgRmlsZSAgIDogdGhyZWFkLnBsCislICAgQXV0aG9yczogTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCislICAgICAgICAgICAgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorJSAgIFVwZGF0ZWQ6IDI2IE1heSAyMDA4CislICAgUHVycG9zZTogTXVsdGktdGhyZWFkIGV4ZWN1dGlvbgorJSAgIFVzYWdlICA6CislCSAgICAgJSBwbGNhZmUgLWNwIHF1ZWVucy5qYXIKKyUJICAgICA/LSBbdGhyZWFkXS4KKyUJICAgICA/LSBtYWluLgorJSAgICAgICAgIG9yCislCSAgICAgJSBwbGNhZmUgLWNwIHRocmVhZC5qYXI6cXVlZW5zLmphcgorJQkgICAgID8tIG1haW4uCisKK21haW4gOi0KKwlzdGF0aXN0aWNzKHJ1bnRpbWUsIF8pLAorCXN0YXJ0LAorCXN0YXRpc3RpY3MocnVudGltZSwgW18sVF0pLAorCXdyaXRlKCdUaW1lID0gJyksIHdyaXRlKFQpLCAKKwl3cml0ZSgnIG1zZWMuJyksIG5sLgorCitzdGFydCA6LSAKKwlHMSA9IChxdWVlbnMoMTAsIFgpLCB3cml0ZShYKSwgbmwpLAorCW1zZyhzdGFydDEgPSBHMSksCisJc3RhcnQoRzEsIEUxKSwKKwlHMiA9IChxdWVlbnMoOCwgWSksIHdyaXRlKFkpLCBubCksCisJbXNnKHN0YXJ0MiA9IEcyKSwKKwlzdGFydChHMiwgRTIpLAorCWxvb3AoRzEsIEUxLCBHMiwgRTIpLAorCXN0b3AoRTEpLAorCXN0b3AoRTIpLAorCW1zZyhlbmQpLgorCitsb29wKEcxLCBFMSwgRzIsIEUyKSA6LQorCWluX2ZhaWx1cmUoRTEpLAorCWluX2ZhaWx1cmUoRTIpLAorCSEuCitsb29wKEcxLCBFMSwgRzIsIEUyKSA6LQorCWluX3N1Y2Nlc3MoRTEpLAorCSEsCisJY29udChFMSksCisJbG9vcChHMSwgRTEsIEcyLCBFMikuCitsb29wKEcxLCBFMSwgRzIsIEUyKSA6LQorCWluX3N1Y2Nlc3MoRTIpLAorCSEsCisJY29udChFMiksCisJbG9vcChHMSwgRTEsIEcyLCBFMikuCitsb29wKEcxLCBFMSwgRzIsIEUyKSA6LQorCW1zZyh3YWl0aW5nKSwKKwlzbGVlcCg1KSwKKwlsb29wKEcxLCBFMSwgRzIsIEUyKS4KKworbXNnKE1zZykgOi0KKwl3cml0ZShNc2cpLCBubCwgZmx1c2hfb3V0cHV0LgorCislJQorJSUgVXRpbGl0aWVzCislJQorc3RhcnQoRywgRW5naW5lKSA6LQorCWphdmFfY29uc3RydWN0b3IwKCdqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuUHJvbG9nQ29udHJvbCcsIEVuZ2luZSksCisJamF2YV9tZXRob2QwKEVuZ2luZSwgc2V0UHJlZGljYXRlKEcpLCBfKSwKKwlqYXZhX21ldGhvZDAoRW5naW5lLCBzdGFydCwgXykuCisKK2luX3N1Y2Nlc3MoRW5naW5lKSA6LQorCWphdmFfZ2V0X2ZpZWxkMCgnamF2YS5sYW5nLkJvb2xlYW4nLCAnVFJVRScsIFQpLAorCWphdmFfbWV0aG9kKEVuZ2luZSwgaW5fc3VjY2VzcywgVCkuCisKK2luX2ZhaWx1cmUoRW5naW5lKSA6LQorCWphdmFfZ2V0X2ZpZWxkMCgnamF2YS5sYW5nLkJvb2xlYW4nLCAnVFJVRScsIFQpLAorCWphdmFfbWV0aG9kKEVuZ2luZSwgaW5fZmFpbHVyZSwgVCkuCisKK3JlYWR5KEVuZ2luZSkgOi0KKwlqYXZhX2dldF9maWVsZDAoJ2phdmEubGFuZy5Cb29sZWFuJywgJ1RSVUUnLCBUKSwKKwlqYXZhX21ldGhvZChFbmdpbmUsIHJlYWR5LCBUKS4KKworY29udChFbmdpbmUpIDotIGphdmFfbWV0aG9kMChFbmdpbmUsIGNvbnQsIF8pLgorCitqb2luKEVuZ2luZSkgOi0gamF2YV9tZXRob2QwKEVuZ2luZSwgam9pbiwgXykuCisKK3N0b3AoRW5naW5lKSA6LSBqYXZhX21ldGhvZDAoRW5naW5lLCBzdG9wLCBfKS4KKworc2xlZXAoTikgOi0gamF2YV9tZXRob2QoJ2phdmEubGFuZy5UaHJlYWQnLCBzbGVlcChOKSwgXykuCisKKyVyZXN1bHQoRW5naW5lLCBSZXN1bHQpIDotIGphdmFfbWV0aG9kMChFbmdpbmUsIG5leHQsIFJlc3VsdCkuCisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3BsY2FmZS90aHJlYWQyLnBsIGIvZXhhbXBsZXMvcGxjYWZlL3RocmVhZDIucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA5ZTQxOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3BsY2FmZS90aHJlYWQyLnBsCkBAIC0wLDAgKzEsNjYgQEAKKyUgICBGaWxlICAgOiB0aHJlYWQyLnBsCislICAgQXV0aG9yczogTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorJSAgICAgICAgICAgIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorJSAgIFVwZGF0ZWQ6IDI2IE1heSAyMDA4CislICAgUHVycG9zZTogTXVsdGktdGhyZWFkIGV4ZWN1dGlvbgorJSAgIFVzYWdlICA6CislCSAgICAgJSBwbGNhZmUgLWNwIHF1ZWVucy5qYXIKKyUJICAgICA/LSBbdGhyZWFkMl0uCislCSAgICAgPy0gbWFpbi4KKyUgICAgICAgICBvcgorJQkgICAgICUgcGxjYWZlIC1jcCB0aHJlYWQyLmphcjpxdWVlbnMuamFyCislCSAgICAgPy0gbWFpbi4KKworbWFpbiA6LQorCXN0YXRpc3RpY3MocnVudGltZSwgXyksCisJc3RhcnQsCisJc3RhdGlzdGljcyhydW50aW1lLCBbXyxUXSksCisJd3JpdGUoJ1RpbWUgPSAnKSwgd3JpdGUoVCksIAorCXdyaXRlKCcgbXNlYy4nKSwgbmwuCisKK3N0YXJ0IDotIAorCUcxID0gKHF1ZWVucygxMCwgWCksIHdyaXRlKFgpLCBubCwgZmFpbCksCisJbXNnKHN0YXJ0MSA9IEcxKSwKKwlzdGFydChHMSwgRTEpLAorCUcyID0gKHF1ZWVucyg4LCBZKSwgd3JpdGUoWSksIG5sLCBmYWlsKSwKKwltc2coc3RhcnQyID0gRzIpLAorCXN0YXJ0KEcyLCBFMiksCisJam9pbihFMSksCisJam9pbihFMiksCisJc3RvcChFMSksCisJc3RvcChFMiksCisJbXNnKGVuZCkuCisKK21zZyhNc2cpIDotCisJd3JpdGUoTXNnKSwgbmwsIGZsdXNoX291dHB1dC4KKworJSUKKyUlIFV0aWxpdGllcworJSUKK3N0YXJ0KEcsIEVuZ2luZSkgOi0KKwlqYXZhX2NvbnN0cnVjdG9yMCgnanAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLlByb2xvZ0NvbnRyb2wnLCBFbmdpbmUpLAorCWphdmFfbWV0aG9kMChFbmdpbmUsIHNldFByZWRpY2F0ZShHKSwgXyksCisJamF2YV9tZXRob2QwKEVuZ2luZSwgc3RhcnQsIF8pLgorCitpbl9zdWNjZXNzKEVuZ2luZSkgOi0KKwlqYXZhX2dldF9maWVsZDAoJ2phdmEubGFuZy5Cb29sZWFuJywgJ1RSVUUnLCBUKSwKKwlqYXZhX21ldGhvZChFbmdpbmUsIGluX3N1Y2Nlc3MsIFQpLgorCitpbl9mYWlsdXJlKEVuZ2luZSkgOi0KKwlqYXZhX2dldF9maWVsZDAoJ2phdmEubGFuZy5Cb29sZWFuJywgJ1RSVUUnLCBUKSwKKwlqYXZhX21ldGhvZChFbmdpbmUsIGluX2ZhaWx1cmUsIFQpLgorCityZWFkeShFbmdpbmUpIDotCisJamF2YV9nZXRfZmllbGQwKCdqYXZhLmxhbmcuQm9vbGVhbicsICdUUlVFJywgVCksCisJamF2YV9tZXRob2QoRW5naW5lLCByZWFkeSwgVCkuCisKK2NvbnQoRW5naW5lKSA6LSBqYXZhX21ldGhvZDAoRW5naW5lLCBjb250LCBfKS4KKworam9pbihFbmdpbmUpIDotIGphdmFfbWV0aG9kMChFbmdpbmUsIGpvaW4sIF8pLgorCitzdG9wKEVuZ2luZSkgOi0gamF2YV9tZXRob2QwKEVuZ2luZSwgc3RvcCwgXykuCisKK3NsZWVwKE4pIDotIGphdmFfbWV0aG9kKCdqYXZhLmxhbmcuVGhyZWFkJywgc2xlZXAoTiksIF8pLgorCislcmVzdWx0KEVuZ2luZSwgUmVzdWx0KSA6LSBqYXZhX21ldGhvZDAoRW5naW5lLCBuZXh0LCBSZXN1bHQpLgorCmRpZmYgLS1naXQgYS9leGFtcGxlcy9wcm9sb2cvTWFrZWZpbGUgYi9leGFtcGxlcy9wcm9sb2cvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmODQzZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Byb2xvZy9NYWtlZmlsZQpAQCAtMCwwICsxLDI4IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCU1ha2VmaWxlIGZvciBQcm9sb2cgQ2FmZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitQTEpBVkFDICAgICA9IHBsamF2YWMKK1BMSkFWQUNPUFRTID0gLXYKKworUExKQVIgICAgID0gcGxqYXIKK1BMSkFST1BUUyA9IC12CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5qYXIgLnBsICQoU1VGRklYRVMpCisKK2phcl9vYmplY3RzIDo9ICQocGF0c3Vic3QgJS5wbCwlLmphciwkKHdpbGRjYXJkICoucGwpKQorCisucGwuamFyOgorCSQoUExKQVIpICQoUExKQVJPUFRTKSAkQCAkPAorCS1ybSAtZiAtciAkKgorCithbGw6ICQoamFyX29iamVjdHMpCisKK2NsZWFuOgorCS1ybSAtZiBjb3JlICp+CisKK3JlYWxjbGVhbjogY2xlYW4KKwktcm0gLWYgKi5qYXIgKi5jbGFzcworCmRpZmYgLS1naXQgYS9leGFtcGxlcy9wcm9sb2cva25pZ2h0LnBsIGIvZXhhbXBsZXMvcHJvbG9nL2tuaWdodC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmRkOWNhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcHJvbG9nL2tuaWdodC5wbApAQCAtMCwwICsxLDE5OSBAQAorJSAgIEZpbGUgICA6IGtuaWdodC5wbAorJSAgIEF1dGhvcnM6IE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorJSAgICAgICAgICAgIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyUgICBVcGRhdGVkOiAyNiBNYXkgMjAwOAorJSAgIFB1cnBvc2U6IEtuaWdodCdzIFRvdXIgKHBvc2VkIGJ5IEJyb29rIFRheWxvciwgMThDKQorJSAgIE5vdGUgICA6IEVhY2ggcG9zaXRpb24gKEksSikgb24gdGhlIGJvYXJkIE4qTiAKKyUgICAgICAgICAgICBpcyBpbmRleGVkIGJ5IChOKzIpKihJLTEpK0otMQorCisvKgorfCA/LSBtYWluLgorRmluZHMgYSBLbmlnaHQncyBUb3VyIChOPj04IHRha2VzIGEgbG9uZyB0aW1lLi4uKQorTiA9IDguCisKKyAgMSAxMiAgOSAgNiAgMyAxNCAxNyAyMAorIDEwICA3ICAyIDEzIDE4IDIxICA0IDE1CisgMzEgMjggMTEgIDggIDUgMTYgMTkgMjIKKyA2NCAyNSAzMiAyOSAzNiAyMyA0OCA0NQorIDMzIDMwIDI3IDI0IDQ5IDQ2IDM3IDU4CisgMjYgNjMgNTIgMzUgNDAgNTcgNDQgNDcKKyA1MyAzNCA2MSA1MCA1NSA0MiA1OSAzOAorIDYyIDUxIDU0IDQxIDYwIDM5IDU2IDQzCisKK3llcworKi8KKworOi0gZHluYW1pYyBuLzEsIGNvcm5lci8xLCBuZXh0X0svMS4KKworbWFpbiA6LQorCXdyaXRlKCdGaW5kcyBhIEtuaWdodCcncyBUb3VyIChOPj04IHRha2VzIGEgbG9uZyB0aW1lLi4uKScpLCBubCwKKwl3cml0ZSgnTiA9ICcpLAorCWZsdXNoX291dHB1dCwKKwlyZWFkKE4pLAorCXN0YXRpc3RpY3MocnVudGltZSwgXyksCisJa25pZ2h0X3RvdXIoTiksCisJc3RhdGlzdGljcyhydW50aW1lLCBbXyxUXSksCisJbmwsCisJd3JpdGUoJ0NQVSB0aW1lID0gJyksIHdyaXRlKFQpLCB3cml0ZSgnIG1zZWMnKSwgbmwsCisJIS4KKwora25pZ2h0X3RvdXIoTikgOi0KKwlrbmlnaHRfaW5pdChOKSwKKwlnZW5fcmVzKEwpLAorCXNvbHZlKDEsIDEsIEwpLAorCXdyaXRlX2JvYXJkKEwpLgorCitrbmlnaHRfaW5pdChOKSA6LQorCXJldHJhY3RhbGwobihfKSksCisJcmV0cmFjdGFsbChjb3JuZXIoXykpLAorCXJldHJhY3RhbGwobmV4dF9LKF8pKSwKKwlhc3NlcnR6KG4oTikpLgorCislICBnZW5fcmVzLzEgY3JlYXRlcyByZXNvdXJjZXMgay8yIGFzIGEgbGlzdCwgYW5kIGFzc2VydHMgY29ybmVyLzEgYW5kIG5leHRfSy8xLgorJSAgICAtIGsoSywgXykgICAgIGZvciAgSyA9IChOKzIpKihJLTEpK0otMSwgSSA9IDEuLk4sIEogPSAxLi5OCislICAgIC0gY29ybmVyKEspICAgZm9yICBLID0gKE4rMikqKEktMSkrSi0xLCBJID0gMSxOLCBKID0gMSxOCislICAgIC0gbmV4dF9LKERLKSAgZm9yIERLID0gKE4rMikqREkrREosIChESSxESikgPSAoKy0yLCstMSksKCstMSwrLTIpCisKK2dlbl9yZXMoTCkgOi0gZ2VuX3JlcygxLCAxLCBMKS4KKworZ2VuX3JlcyhJLCBfLCBbXSkgOi0gY2xhdXNlKG4oTiksIF8pLCBJID4gTiwgISwKKwljYWxjX0soMSwgMSwgQzEpLAorCWNhbGNfSygxLCBOLCBDMiksCisJY2FsY19LKE4sIDEsIEMzKSwKKwljYWxjX0soTiwgTiwgQzQpLAorCWNhbGNfREsoLTIsIC0xLCBESzEpLAorCWNhbGNfREsoLTIsICAxLCBESzIpLAorCWNhbGNfREsoLTEsIC0yLCBESzMpLAorCWNhbGNfREsoLTEsICAyLCBESzQpLAorCWNhbGNfREsoIDEsIC0yLCBESzUpLAorCWNhbGNfREsoIDEsICAyLCBESzYpLAorCWNhbGNfREsoIDIsIC0xLCBESzcpLAorCWNhbGNfREsoIDIsICAxLCBESzgpLAorCWFzc2VydHooY29ybmVyKEMxKSksCisJYXNzZXJ0eihjb3JuZXIoQzIpKSwKKwlhc3NlcnR6KGNvcm5lcihDMykpLAorCWFzc2VydHooY29ybmVyKEM0KSksCisJYXNzZXJ0eihuZXh0X0soREsxKSksCisJYXNzZXJ0eihuZXh0X0soREsyKSksCisJYXNzZXJ0eihuZXh0X0soREszKSksCisJYXNzZXJ0eihuZXh0X0soREs0KSksCisJYXNzZXJ0eihuZXh0X0soREs1KSksCisJYXNzZXJ0eihuZXh0X0soREs2KSksCisJYXNzZXJ0eihuZXh0X0soREs3KSksCisJYXNzZXJ0eihuZXh0X0soREs4KSkuCitnZW5fcmVzKEksIEosIEwpIDotIGNsYXVzZShuKE4pLCBfKSwgSiA+IE4sICEsCisJSTEgaXMgSSArIDEsCisJZ2VuX3JlcyhJMSwgMSwgTCkuCitnZW5fcmVzKEksIEosIFtrKEssIF8pfExdKSA6LQorCWNsYXVzZShuKE4pLCBfKSwKKwlJID08IE4sIEogPTwgTiwKKwljYWxjX0soSSwgSiwgSyksCisJSjEgaXMgSiArIDEsCisJZ2VuX3JlcyhJLCBKMSwgTCkuCisKKyUgc29sdmUoK0ksICtKLCArUikgZmluZHMga25pZ2h0IHRvdXIgc3RhcnRpbmcgZnJvbSB0aGUgcG9zaXRpb24gKEksSikuCislIFIgaXMgYSBsaXN0IG9mIGsoSW5kZXgsIFN0ZXApLgorc29sdmUoSSwgSiwgUikgOi0KKwljbGF1c2UobihOKSwgXyksCisJU3RlcCA9IDEsCisJY2FsY19LKEksIEosIEspLAorCWRlbF9yZXMoayhLLFN0ZXApLCBSLCBSMCksCisJc29sdmUoU3RlcCwgTiwgSywgUjApLgorCitzb2x2ZShTdGVwLCBOLCBfLCBbXSkgOi0KKwlTdGVwID49IE4qTiwKKwkhLgorc29sdmUoU3RlcCwgTiwgSywgUikgOi0KKwlTdGVwIDwgTipOLAorCWNoZWNrKFN0ZXAsIE4sIFIpLAorCVN0ZXAxIGlzIFN0ZXAgKyAxLAorCW5leHQoSywgSzEsIFIpLAorCWRlbF9yZXMoayhLMSxTdGVwMSksIFIsIFIwKSwKKwlzb2x2ZShTdGVwMSwgTiwgSzEsIFIwKS4KKworZGVsX3JlcyhYLCBbWHxYc10sIFhzKS4KK2RlbF9yZXMoWCwgW1l8WXNdLCBbWXxac10pIDotIGRlbF9yZXMoWCwgWXMsIFpzKS4KKworY2hlY2soU3RlcCwgTiwgUikgOi0KKwkoU3RlcCBtb2QgIDQgPTo9IDAsIFN0ZXAgPCBOKk4tMQorCSAtPiBcKyBpc29sYXRlX29uZShfLCBSKQorCSA7ICB0cnVlKSwKKwkhLgorCitpc29sYXRlX29uZShLLCBSKSA6LQorCWRlbF9yZXMoayhLLCBfKSwgUiwgXyksCisJXCsgKG5leHQwKEssIEsxKSwgZGVsX3JlcyhrKEsxLCBfKSwgUiwgXykpLgorCislIGlmIGN1cnJlbnQgaXMgYSBjb3JuZXIsIGl0J3Mgb2sKK25leHQoSywgSzEsIF8pIDotCisJY2xhdXNlKGNvcm5lcihLKSwgXyksCisJISwKKwluZXh0MChLLCBLMSkuCislIGlmIHRoZSBuZXh0IGNhbiBiZSBhIG5vdC12aXNpdGllZCBjb3JuZXIsIGl0IHNob3VsZCBiZSBzZWxlY3RlZAorbmV4dChLLCBLMSwgUikgOi0KKwluZXh0MChLLCBLMSksCisJY2xhdXNlKGNvcm5lcihLMSksIF8pLAorCW5vdF92aXNpdGVkKEsxLCBSKSwKKwkhLgorJSBvdGhlcndpc2UKK25leHQoSywgSzEsIF8pIDotIG5leHQwKEssIEsxKS4KKworbmV4dDAoSywgSzEpIDotIGNsYXVzZShuZXh0X0soREspLCBfKSwgSzEgaXMgSyArIERLLgorCitub3RfdmlzaXRlZChLLCBSKSA6LSBcKyBcKyBkZWxfcmVzKGsoSywgXyksIFIsIF8pLgorCitjYWxjX0soSSwgSiwgSykgOi0gY2xhdXNlKG4oTiksIF8pLCBLIGlzIChOKzIpKihJLTEpKyhKLTEpLgorCitjYWxjX0RLKERJLCBESiwgREspIDotIGNsYXVzZShuKE4pLCBfKSwgREsgaXMgKE4rMikqREkrREouCisKKworJSAgd3JpdGVfYm9hcmQoTCkgd3JpdGVzIHN0ZXAgbnVtYmVycyBTIGZvciBlYWNoIEkgPSAxLi5OLCBKID0gMS4uTgord3JpdGVfYm9hcmQoTCkgOi0KKwljbGF1c2UobihOKSwgXyksCisJZm9yKEksIDEsIE4pLAorCSAgbmwsCisJICBmb3IoSiwgMSwgTiksCisJICAgIGNhbGNfSyhJLCBKLCBLKSwKKwkgICAgbWVtYmVyKGsoSywgU3RlcCksIEwpLAorCSAgICB3cml0ZV9udW1iZXIoU3RlcCksCisJZmFpbC4KK3dyaXRlX2JvYXJkKF8pIDotIG5sLgorCitmb3IoTSwgTSwgTikgOi0gTSA9PCBOLgorZm9yKEksIE0sIE4pIDotIE0gPTwgTiwgTTEgaXMgTSArIDEsIGZvcihJLCBNMSwgTikuCisKK3dyaXRlX251bWJlcihDKSA6LSBDIDwgMTAsICEsIHdyaXRlKCcgICcpLCB3cml0ZShDKS4KK3dyaXRlX251bWJlcihDKSA6LSB3cml0ZSgnICcpLCB3cml0ZShDKS4KKworbWVtYmVyKFgsIFtYfF9dKS4KK21lbWJlcihYLCBbX3xYc10pIDotIG1lbWJlcihYLCBYcykuCisKKworJSUlIAora25pZ2h0X3RvdXJfYXBwbGV0KE4sIEFucykgOi0KKwlrbmlnaHRfaW5pdChOKSwgCisJZ2VuX3JlcyhMKSwgCisJc29sdmUoMSwgMSwgTCksIAorCWdldF9zdGVwKEwsIEFucykuCisKK2dldF9zdGVwKEwsIEEpIDotCisJY2xhdXNlKG4oTiksIF8pLAorICAgICAgICBnZXRfc3RlcCgxLCAxLCBOLCBMLCBBKS4KKyAgICAgICAgCitnZXRfc3RlcChJLCBfLCBOLCBfLCBbXSkgOi0gCisJSSA+IE4sIAorCSEuCitnZXRfc3RlcChJLCBKLCBOLCBMLCBBKSA6LSBKID4gTiwgISwKKyAgICAgICAgSTEgaXMgSSsxLAorICAgICAgICBnZXRfc3RlcChJMSwgMSwgTiwgTCwgQSkuCitnZXRfc3RlcChJLCBKLCBOLCBMLCBbU3RlcHxBXSkgOi0KKyAgICAgICAgSSA9PCBOLCBKID08IE4sCisgICAgICAgIGNhbGNfSyhJLCBKLCBLKSwKKyAgICAgICAgbWVtYmVyKGsoSyxTdGVwKSwgTCksCisJISwKKyAgICAgICAgSjEgaXMgSisxLAorICAgICAgICBnZXRfc3RlcChJLCBKMSwgTiwgTCwgQSkuCisKKworCisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Byb2xvZy9rb21hY2hpLnBsIGIvZXhhbXBsZXMvcHJvbG9nL2tvbWFjaGkucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM4ZTUyNwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Byb2xvZy9rb21hY2hpLnBsCkBAIC0wLDAgKzEsNjEgQEAKKyUgICBGaWxlICAgOiBrb21hY2hpLnBsCislICAgQXV0aG9yczogTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCislICAgVXBkYXRlZDogMTAgTWFyY2ggMjAwOAorJSAgIFB1cnBvc2U6IFNvbHZlIGtvbWFjaGktemFuCisKK21haW4gOi0KKwl3cml0ZSgnS29tYWNoaS16YW4nKSwgbmwsCisJd3JpdGUoJ04gPSAnKSwKKwlmbHVzaF9vdXRwdXQsCisJcmVhZChOKSwKKwlOID4gMCwKKwlyZWFkX3luKCdBbGwgc29sdXRpb25zICh5L24pPyAnLCBBbGwpLAorCXJlYWRfeW4oJ091dHB1dCAoeS9uKT8gJywgT3V0cHV0KSwKKwlzdGF0aXN0aWNzKHJ1bnRpbWUsIF8pLAorCWtvbWFjaGlfc29sdmUoTiwgYWxsKEFsbCksIG91dHB1dChPdXRwdXQpKSwKKwlzdGF0aXN0aWNzKHJ1bnRpbWUsIFtfLFRdKSwKKwl3cml0ZSgnQ1BVIHRpbWUgPSAnKSwgd3JpdGUoVCksIHdyaXRlKCcgbXNlYycpLCBubC4KKworcmVhZF95bihNZXNzYWdlLCBZTikgOi0KKwl3cml0ZShNZXNzYWdlKSwKKwlmbHVzaF9vdXRwdXQsCisJcmVhZChYKSwKKwkoWCA9PSAneScgLT4gWU4gPSB5ZXM7IFlOID0gbm8pLgorCitrb21hY2hpX3NvbHZlKE4sIGFsbChYKSwgb3V0cHV0KFkpKSA6LQorCWtvbWFjaGkoTiwgRSksCisJKFkgPT0geWVzIC0+IHdyaXRlKEU9TiksIG5sOyB0cnVlKSwKKwlYID09IG5vLAorCSEuCitrb21hY2hpX3NvbHZlKF8sXyxfKS4KKwora29tYWNoaShOLCBFKSA6LQorCWdlbmVyYXRlKDksIEUpLAorCWV2YWwoRSwgTikuCisKK2dlbmVyYXRlKEksIEUpIDotCisJSSA+IDAsCisJZ2VuX251bShNLCBJLCBJMSksCisJZ2VuX25leHQoSTEsIE0sIEUpLgorCitnZW5fbnVtKEkwLCBJMCwgSSkgOi0KKwlJMCA+IDAsCisJSSBpcyBJMC0xLgorZ2VuX251bShNLCBJMCwgSSkgOi0KKwlJMCA+IDAsCisJSTEgaXMgSTAtMSwKKwlnZW5fbnVtKE0wLCBJMSwgSSksCisJTSBpcyAxMCpNMCArIEkwLgorCitnZW5fbmV4dCgwLCBNLCBNICApLgorZ2VuX25leHQoMCwgTSwgRSAgKSA6LSBFIGlzIC1NLgorZ2VuX25leHQoSSwgTSwgRStNKSA6LSBJID4gMCwgZ2VuZXJhdGUoSSwgRSkuCitnZW5fbmV4dChJLCBNLCBFLU0pIDotIEkgPiAwLCBnZW5lcmF0ZShJLCBFKS4KK2dlbl9uZXh0KEksIE0sIEUqTSkgOi0gSSA+IDAsIGdlbmVyYXRlKEksIEUpLgorCislIEV2YWx1YXRlcyBhcml0aG1ldGhpYyBleHByZXNzaW9uCitldmFsKEUsIE4pIDotIE4gaXMgRS4KKworJSBmb3IoSSwgU3RhcnQsIEVuZCwgSW5jKQorZm9yKE0sIE0sIE4sIF8pIDotIE0gPTwgTi4KK2ZvcihJLCBNLCBOLCBTKSA6LSBNID08IE4sIE0xIGlzIE0rUywgZm9yKEksIE0xLCBOLCBTKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Byb2xvZy9saXN0LnBsIGIvZXhhbXBsZXMvcHJvbG9nL2xpc3QucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIzZjU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Byb2xvZy9saXN0LnBsCkBAIC0wLDAgKzEsMTUgQEAKKyUgICBGaWxlICAgOiBsaXN0LnBsCislICAgQXV0aG9yczogTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorJSAgIFVwZGF0ZWQ6IDE0IEZlYnJ1YXJ5IDIwMDgKKyUgICBQdXJwb3NlOiBMaXN0IHByb2Nlc3NpbmcKKworYXBwZW5kKFtdLCBacywgWnMpLgorYXBwZW5kKFtYfFhzXSwgWXMsIFtYfFpzXSkgOi0gYXBwZW5kKFhzLCBZcywgWnMpLgorCitucmV2KFtdLCBbXSkuCitucmV2KFtYfFhzXSwgWSkgOi0KKyAgICBucmV2KFhzLCBZcyksIGFwcGVuZChZcywgW1hdLCBZKS4KKworcmFuZ2UoSSwgTiwgW10pIDotIEkgPiBOLCAhLgorcmFuZ2UoSSwgTiwgW0l8TF0pIDotIEkgPTwgTiwgSTEgaXMgSSsxLCByYW5nZShJMSwgTiwgTCkuCisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Byb2xvZy9tYWtldGVuLnBsIGIvZXhhbXBsZXMvcHJvbG9nL21ha2V0ZW4ucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY1NWE3MwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Byb2xvZy9tYWtldGVuLnBsCkBAIC0wLDAgKzEsMjE0IEBACislIEZpbGUgICA6IG1ha2V0ZW4ucGwKKyUgQXV0aG9yczogTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCislIFVwZGF0ZWQ6IDE0IEZlYnJ1YXJ5IDIwMDgKKyUgUHVycG9zZTogTWFrZSAxMCBmcm9tIGdpdmVuIDQgbnVtYmVycworJSBOb3RlcyAgOiBTbGlnaHRseSBjaGFuZ2VkIGJ5IE0uQmFuYmFyYQorCisKKyUlCislJSBNYWtlIDEwIGZyb20gZ2l2ZW4gNCBudW1iZXJzCislJQorCislJSBFeGFtcGxlcworJSUJWzEsMSw1LDhdICAxMD04LygxLTEvNSkKKyUlCVsxLDEsOSw5XSAgMTA9OSooMS85KzEpCislJQlbMyw0LDcsOF0gIDEwPTgqKDMtNy80KQorJSUJWzUsNSw1LDddICAxMD03KjUtNSo1CislJQlbOSw5LDksOV0gIDEwPSg5KjkrOSkvOQorZXggOi0KKwltYWtlX251bWJlcihbMSwxLDUsOF0sIDEwKSwKKwltYWtlX251bWJlcihbMSwxLDksOV0sIDEwKSwKKwltYWtlX251bWJlcihbMyw0LDcsOF0sIDEwKSwKKwltYWtlX251bWJlcihbNSw1LDUsN10sIDEwKSwKKwltYWtlX251bWJlcihbOSw5LDksOV0sIDEwKS4KKworJSUgpLmk2aTGpM40v/S7+qTLpMSkpKTGxLSk2aTrCittYWtlX3Rlbl9hbGwgOi0KKwltYWtlX251bWJlcl9hbGwoMTApLgorCittYWtlX251bWJlcl9hbGwoTikgOi0KKwlmb3IoSSwgMCwgOSksCisJZm9yKEosIEksIDkpLAorCWZvcihLLCBKLCA5KSwKKwlmb3IoTCwgSywgOSksCislCW1ha2VfbnVtYmVyKFtJLEosSyxMXSwgTiksCisJbWFrZV9udW1iZXJfeChbSSxKLEssTF0sIE4pLAorCWZhaWwuCittYWtlX251bWJlcl9hbGwoXykuCisKK21ha2VfbnVtYmVyKERzLCBOKSA6LQorCXdyaXRlKERzKSwgd3JpdGUoJyAgJyksCisJbWFrZV9udW0oRHMsIE4sIEUpLAorCXdyaXRlKE49RSksIG5sLAorCSEuCittYWtlX251bWJlcihfLCBfKSA6LQorCXdyaXRlKGZhaWwpLCBubC4KKworbWFrZV9udW1iZXJfeChEcywgTikgOi0KKwl3cml0ZSgnTWFrZSAnKSwgd3JpdGUoTiksIHdyaXRlKCcgZnJvbSAnKSwKKwl3cml0ZShEcyksIHdyaXRlKCc6ICcpLAorCWZpbmRhbGwoRSwgbWFrZV9udW0oRHMsIE4sIEUpLCBTcyksCisJbGVuZ3RoKFNzLCBMKSwKKwl3cml0ZShMKSwgd3JpdGUoJyBzb2wocyk6ICcpLAorCXdyaXRlX2hlYWRzKDMsIFNzKSwKKwlubC4KKword3JpdGVfaGVhZHMoXywgW10pIDotICEuCit3cml0ZV9oZWFkcygwLCBfKSA6LSAhLAorCXdyaXRlKCcuLi4nKS4KK3dyaXRlX2hlYWRzKE4sIFtYXSkgOi0gTiA+IDAsICEsCisJd3JpdGUoWCkuCit3cml0ZV9oZWFkcyhOLCBbWHxYc10pIDotIE4gPiAwLCAhLAorCU4xIGlzIE4tMSwKKwl3cml0ZShYKSwgd3JpdGUoJywgJyksCisJd3JpdGVfaGVhZHMoTjEsIFhzKS4KKworbWFrZV9udW0oRHMsIE4sIEUpIDotCisJYWxsX2V4cChEcywgRSksCisJcShFLCBbTiwxXSkuCisKKyUlCislJSBhbGxfZXhwKDpMaXN0LCA/RXhwKQorJSUgICBMaXN0pM7N18HHpKuk6aGkssO4ur7ovfyx6bu7u9Kkx7rupOmk7KTrvLBFeHCk8srWpLkKKyUlICAgKyCkyCAqIKTPssS0uaTIpLmk6worJSUKK2FsbF9leHAoRHMwLCBFKSA6LQorCXNvcnRfbGlzdChEczAsIERzKSwKKwlhbGxfZXhwMChEcywgRSkuCisKK2FsbF9leHAwKFtEXSwgRCkuCithbGxfZXhwMChEczAsIEUpIDotCisJRHMxID0gW198X10sIAorCURzMiA9IFtffF9dLCAKKwlkaXZfbGlzdChEczAsIERzMSwgRHMyKSwKKwlhbGxfZXhwMChEczEsIEUxKSwKKwlhbGxfZXhwMChEczIsIEUyKSwKKwlhZGRfb3AoRTEsIEUyLCBFKS4KKwkKK2FkZF9vcChFMSwgRTIsIEUxK0UyKSA6LSBFMSBAPTwgRTIuCithZGRfb3AoRTEsIEUyLCBFMS1FMikuCithZGRfb3AoRTEsIEUyLCBFMSpFMikgOi0gRTEgQD08IEUyLgorYWRkX29wKEUxLCBFMiwgRTEvRTIpLgorCitkaXZfbGlzdChEczAsIERzMSwgRHMyKSA6LQorCWRlX21lcmdlKERzMSwgRHMyLCBEczApLgorJQlEczEgQD49IERzMi4KKworZGVfbWVyZ2UoW10sIFtdLCBbXSkuCitkZV9tZXJnZShacywgW10sIFpzKSA6LSBacyA9IFtffF9dLgorZGVfbWVyZ2UoW10sIFpzLCBacykgOi0gWnMgPSBbX3xfXS4KK2RlX21lcmdlKFtYfFhzXSwgW1l8WXNdLCBbWHxac10pIDotCisJZGVfbWVyZ2UoWHMsIFtZfFlzXSwgWnMpLAorCVggQDwgWS4KK2RlX21lcmdlKFtYfFhzXSwgW1l8WXNdLCBbWXxac10pIDotCisJZGVfbWVyZ2UoW1h8WHNdLCBZcywgWnMpLAorCVkgQD08IFguCisKKyUlIKW9obylyCAow9mkpCEpCitzb3J0X2xpc3QoW10sIFtdKS4KK3NvcnRfbGlzdChbRHxEczBdLCBEcykgOi0KKwlzb3J0X2xpc3QoRHMwLCBEczEpLAorCWluc2VydChELCBEczEsIERzKS4KKworaW5zZXJ0KEQwLCBbXSwgW0QwXSkuCitpbnNlcnQoRDAsIFtEfERzMF0sIFtEMCxEfERzMF0pIDotCisJRDAgQD08IEQsICEuCitpbnNlcnQoRDAsIFtEfERzMF0sIFtEfERzXSkgOi0KKwlEMCBAPiBELAorCWluc2VydChEMCwgRHMwLCBEcykuCisKK2ZvcihJLCBNLCBOKSA6LSBNID08IE4sIEk9TS4KK2ZvcihJLCBNLCBOKSA6LSBNID08IE4sIE0xIGlzIE0rMSwgZm9yKEksIE0xLCBOKS4KKworJSUKKyUlIHEoWCwgUSkKKyUlCbywIFggpM6317u7t+uyzKTIpLekxs2tzf2/9CBRIKTyytakuQorJSUJUSA9IFtOLERdCU4+MCwgRD4wLCDAtaTOza3N/b/0pPLJvaS5IChOpMhEpM+436SkpMvBxykKKyUlCVEgPSBbTixEXQlOPDAsIEQ+MCwgyemkzs2tzf2/9KTyyb2kuSAoTqTIRKTPuN+kpKTLwccpCislJQlRID0gWzAsMV0JMKTyyb2kuQorJSUJUSA9IFsxLDBdCcy1uMLC56Tyyb2kuQorJSUJUSA9IFstMSwwXQktzLW4wsLnpPLJvaS5CislJQlRID0gWzAsMF0JydTE6qTyyb2kuQorJSUKK3EoWCwgW1gsMV0pIDotCisJaW50ZWdlcihYKS4KK3EoLVgsIFEpIDotCisJcShYLCBRMSksCisJcV9uZWcoUTEsIFEpLgorcShYK1ksIFEpIDotCisJcShYLCBRMSksCisJcShZLCBRMiksCisJcV9hZGQoUTEsIFEyLCBRKS4KK3EoWC1ZLCBRKSA6LQorCXEoWCwgUTEpLAorCXEoWSwgUTIpLAorCXFfbmVnKFEyLCBRMyksCisJcV9hZGQoUTEsIFEzLCBRKS4KK3EoWCpZLCBRKSA6LQorCXEoWCwgUTEpLAorCXEoWSwgUTIpLAorCXFfbXVsKFExLCBRMiwgUSkuCitxKFgvWSwgUSkgOi0KKwlxKFgsIFExKSwKKwlxKFksIFEyKSwKKwlxX2ludihRMiwgUTMpLAorCXFfbXVsKFExLCBRMywgUSkuCisKKyUlCislJSDNrc39v/SkzrLDu7sKKyUlCitxX2FkZChbMCwwXSwgXywgWzAsMF0pIDotICEuCitxX2FkZChfLCBbMCwwXSwgWzAsMF0pIDotICEuCitxX2FkZChbMSwwXSwgWzEsMF0sIFsxLDBdKSA6LSAhLgorcV9hZGQoWzEsMF0sIFstMSwwXSwgWzAsMF0pIDotICEuCitxX2FkZChbLTEsMF0sIFsxLDBdLCBbMCwwXSkgOi0gIS4KK3FfYWRkKFstMSwwXSwgWy0xLDBdLCBbLTEsMF0pIDotICEuCitxX2FkZChbTjEsRDFdLCBbTjIsRDJdLCBRKSA6LSBEMSA9XD0gMCwgRDIgPVw9IDAsCisJTiBpcyBOMSpEMitOMipEMSwKKwlEIGlzIEQxKkQyLAorCXFfbm9ybShbTixEXSwgUSkuCisKKyUlCislJSDNrc39v/Skzsnpv/QKKyUlCitxX25lZyhbTjEsRF0sIFEpIDotCisJTiBpcyAtTjEsCisJcV9ub3JtKFtOLERdLCBRKS4KKworJSUKKyUlIM2tzf2/9KTOvui7uworJSUKK3FfbXVsKFtOMSxEMV0sIFtOMixEMl0sIFEpIDotCisJTiBpcyBOMSpOMiwKKwlEIGlzIEQxKkQyLAorCXFfbm9ybShbTixEXSwgUSkuCisKKyUlCislJSDNrc39v/SkzrXVv/QKKyUlCitxX2ludihbTjEsRDFdLCBRKSA6LQorCXFfbm9ybShbRDEsTjFdLCBRKS4KKworJSUKKyUlIM2tzf2/9KTOwLW1rLK9CislJQorcV9ub3JtKFswLDBdLCBbMCwwXSkgOi0gIS4KK3Ffbm9ybShbTiwwXSwgWzEsMF0pIDotIE4gPiAwLCAhLgorcV9ub3JtKFtOLDBdLCBbLTEsMF0pIDotIE4gPCAwLCAhLgorcV9ub3JtKFswLERdLCBbMCwxXSkgOi0gRCA9XD0gMCwgIS4KK3Ffbm9ybShbTjEsRDFdLCBRKSA6LSBOMSA9XD0gMCwgRDEgPCAwLCAhLAorCU4yIGlzIC1OMSwKKwlEMiBpcyAtRDEsCisJcV9ub3JtKFtOMixEMl0sIFEpLgorcV9ub3JtKFtOMSxEMV0sIFtOLERdKSA6LSBOMSA9XD0gMCwgRDEgPiAwLCAhLAorCWdjZChOMSwgRDEsIEcpLAorCU4gaXMgTjEvL0csCisJRCBpcyBEMS8vRy4KKwkKK2djZCgwLCBCLCBHKSA6LQorCUcgaXMgYWJzKEIpLgorZ2NkKEEsIEIsIEcpIDotCisJQSA9XD0gMCwKKwlSIGlzIEIgbW9kIEEsCisJZ2NkKFIsIEEsIEcpLgorCmRpZmYgLS1naXQgYS9leGFtcGxlcy9wcm9sb2cvcGVnLnBsIGIvZXhhbXBsZXMvcHJvbG9nL3BlZy5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWE4NWUyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcHJvbG9nL3BlZy5wbApAQCAtMCwwICsxLDk3IEBACislIEZpbGUgICA6IHBlZy5wbAorJSBBdXRob3JzOiBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyUgVXBkYXRlZDogMTQgRmVicnVhcnkgMjAwOAorJSBQdXJwb3NlOiBQZWcgc29saXRhaXJlIGdhbWUKKyUgTm90ZXMgIDogU2xpZ2h0bHkgY2hhbmdlZCBieSBNLkJhbmJhcmEKKworLyoKK1RoaXMgc29saXRhaXJlIGdhbWUgY29uc2lzdHMgb2YgYSBib2FyZCBvZiB0aGUgZm9sbG93aW5nIHNoYXBlCithbmQgaW5pdGlhbCBjb25maWd1cmF0aW9uCisKKyAgICAgICAgeAorICAgICAgIHggeAorICAgICAgeCBvIHgKKyAgICAgeCB4IHggeAorICAgIHggeCB4IHggeAorCit3aGVyZSB4IGRlbm90ZXMgYSBwZWcgYW5kIG8gYW4gZW1wdHkgaG9sZS4gIEEgcGVnIG1heSBqdW1wIG92ZXIKK2FuIGFkamFjZW50IHBlZyBpZiB0aGUgaG9sZSBiZWhpbmQgaXQgaXMgZW1wdHkuICBUaGUgZ29hbCBpcyB0bworYmUgbGVmdCB3aXRoIG9uZSBwZWcuICBJIGZvb2xlZCBhcm91bmQgd2l0aCB0aGlzIGZvciBhYm91dCAyCittaW51dGVzIGFuZCBkZWNpZGVkIGl0IHdhcyB0b28gaGFyZCBieSBoYW5kLS0tYSBMb2xsaSBwcm9ncmFtCit3YXMgY2FsbGVkIGZvci4KKyovCisKK21haW4gOi0KKwl3cml0ZSgnUGVnIHB1enpsZSAoTj49NiB0YWtlcyBhIGxvbmcgdGltZS4uLiknKSwgbmwsCisJd3JpdGUoJ04gPSAnKSwKKwljdXJyZW50X291dHB1dChPdXQpLAorCWZsdXNoX291dHB1dChPdXQpLAorCXJlYWQoTiksIGludGVnZXIoTiksCisJd3JpdGUoJ1Bvc2l0aW9uIG9mIHRoZSBmaXJzdCBlbXB0eSBob2xlJyksIG5sLAorCXdyaXRlKCdSb3cgKDEuLicpLCB3cml0ZShOKSwgd3JpdGUoJykgPSAnKSwKKwlmbHVzaF9vdXRwdXQoT3V0KSwKKwlyZWFkKEkwKSwgaW50ZWdlcihJMCksCisJd3JpdGUoJ0NvbCAoMS4uJyksIHdyaXRlKEkwKSwgd3JpdGUoJykgPSAnKSwKKwlmbHVzaF9vdXRwdXQoT3V0KSwKKwlyZWFkKEowKSwgaW50ZWdlcihKMCksCisJc3RhdGlzdGljcyhydW50aW1lLCBfKSwKKwlwZWdfZ2FtZShOLCBJMCwgSjAsIFNvbHV0aW9uKSwKKwlzdGF0aXN0aWNzKHJ1bnRpbWUsIFtfLFRdKSwKKwl3cml0ZShTb2x1dGlvbiksIG5sLAorCXdyaXRlKCdDUFUgdGltZSA9ICcpLCB3cml0ZShUKSwgd3JpdGUoJyBtc2VjJyksIG5sLgorbWFpbiA6LQorCXN0YXRpc3RpY3MocnVudGltZSwgW18sVF0pLAorCXdyaXRlKCdObyBzb2x1dGlvbnMnKSwgbmwsCisJd3JpdGUoJ0NQVSB0aW1lID0gJyksIHdyaXRlKFQpLCB3cml0ZSgnIG1zZWMnKSwgbmwuCisKK3BlZ19nYW1lKE4sIEkwLCBKMCwgUykgOi0KKwlOID49IDMsCisJMCA8IEkwLCBJMCA9PCBOLAorCTAgPCBKMCwgSjAgPTwgSTAsCisJU3RlcCBpcyBOKihOKzEpLy8yIC0gMiwKKwlwbGFjZV9wZWdzKE4sIE4sIEkwLCBKMCwgQm9hcmQpLAorCWp1bXAoU3RlcCwgQm9hcmQsIFMpLgorCitwbGFjZV9wZWdzKE4sIE4sIEkwLCBKMCwgQm9hcmQpIDotCisJcGxhY2VfcGVncyhOLCBOLCBJMCwgSjAsIFtdLCBCb2FyZCkuCisKK3BsYWNlX3BlZ3MoMCwgMCwgSTAsIEowLCBCMCwgQikgOi0KKwlwZWdfZGVsZXRlKEIwLCBwZWcoSTAsIEowKSwgQjEpLCEsCisJQiA9IFtlbXB0eShJMCwgSjApfEIxXS4KK3BsYWNlX3BlZ3MoTSwgMCwgSTAsIEowLCBCMCwgQikgOi0KKwlNID4gMCwKKwlNMSBpcyBNLTEsCisJcGxhY2VfcGVncyhNMSwgTTEsIEkwLCBKMCwgQjAsIEIpLgorcGxhY2VfcGVncyhNLCBOLCBJMCwgSjAsIEIwLCBCKSA6LQorCU0gPiAwLCBOID4gMCwKKwlOMSBpcyBOLTEsCisJcGxhY2VfcGVncyhNLCBOMSwgSTAsIEowLCBbcGVnKE0sTil8QjBdLCBCKS4KKworcGVnX2RlbGV0ZShbUHxZc10sIFAsIFlzKSA6LSAhLgorcGVnX2RlbGV0ZShbWHxZc10sIFAsIFtYfFpzXSkgOi0KKwlwZWdfZGVsZXRlKFlzLCBQLCBacykuCisKK3BlZ19zZWxlY3QoWCwgW1h8WHNdLCBYcykuCitwZWdfc2VsZWN0KFgsIFtZfFlzXSwgW1l8WnNdKSA6LSBwZWdfc2VsZWN0KFgsIFlzLCBacykuCisKK2p1bXAoU3RlcCwgQm9hcmQwLCBbbW92ZShYLFksRFgsRFkpfE1zXSkgOi0KKwlTdGVwID4gMCwKKwlwZWdfc2VsZWN0KHBlZyhYLFkpLCBCb2FyZDAsIEJvYXJkMSksCisJZGlyZWN0aW9uKERYLCBEWSksCisJWDEgaXMgWCtEWCwgWTEgaXMgWStEWSwKKwlwZWdfc2VsZWN0KHBlZyhYMSxZMSksIEJvYXJkMSwgQm9hcmQyKSwKKwlYMiBpcyBYMStEWCwgWTIgaXMgWTErRFksCisJcGVnX3NlbGVjdChlbXB0eShYMixZMiksIEJvYXJkMiwgQm9hcmQzKSwKKwlTdGVwMSBpcyBTdGVwLTEsCisJQm9hcmQgPSBbZW1wdHkoWCxZKSwgZW1wdHkoWDEsIFkxKSwgcGVnKFgyLCBZMil8Qm9hcmQzXSwKKwlqdW1wKFN0ZXAxLCBCb2FyZCwgTXMpLgoranVtcCgwLCBfLCBbXSkuCisKK2RpcmVjdGlvbiggMSwgMCkuCitkaXJlY3Rpb24oIDEsIDEpLgorZGlyZWN0aW9uKCAwLCAxKS4KK2RpcmVjdGlvbigtMSwgMCkuCitkaXJlY3Rpb24oLTEsLTEpLgorZGlyZWN0aW9uKCAwLC0xKS4KKworCmRpZmYgLS1naXQgYS9leGFtcGxlcy9wcm9sb2cvcGVudG9taW5vLnBsIGIvZXhhbXBsZXMvcHJvbG9nL3BlbnRvbWluby5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzZjY2ZhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcHJvbG9nL3BlbnRvbWluby5wbApAQCAtMCwwICsxLDEyNzkgQEAKKyUgRmlsZSAgIDogcGVudG9taW5vLnBsCislIEF1dGhvcnM6IE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyUgICAgICAgICAgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCislIFVwZGF0ZWQ6IDE0IEZlYnJ1YXJ5IDIwMDgKKyUgUHVycG9zZTogUGVudG9taW5vIFB1enpsZQorJSAgICAgICAgICAocG9zZWQgYnkgSGVucnkgRS4gRHVkZW55LCAxOTA3IGFuZCBTb2xvbW9uIFcuIEdvbG9tYiwgMTk1MykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgQ291bnQgQWxsIFNvbHV0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NvdW50X2FsbChOKSA6LQorICAgICAgICBmaW5kYWxsKEIsIHNvbHZlX3BlbnRvbWlubyhOLCBCKSwgTCksCisgICAgICAgIGxlbmd0aChMLCBDKSwKKyAgICAgICAgd3JpdGUoQyksIHdyaXRlKCcgc29sdXRpb25zJyksIG5sLgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBNYWluCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbWFpbiA6LQorCXdyaXRlKCdQZW50b21pbm8gUHV6emxlICcpLCBubCwKKwl3cml0ZSgnICAgIFBsZWFzZSBzZWxlY3QgYSBib2FyZCBzaXplLicpLCBubCwKKwl3cml0ZSgnICAgIDMgOiAzICogMjAnKSwgbmwsCisJd3JpdGUoJyAgICA0IDogNCAqIDE1JyksIG5sLAorCXdyaXRlKCcgICAgNSA6IDUgKiAxMicpLCBubCwKKwl3cml0ZSgnICAgIDYgOiA2ICogMTAnKSwgbmwsCisJd3JpdGUoJyAgICA4IDogOCAqIDggKHdpdGggNCBibGFua3MgaW4gdGhlIGNlbnRlciknKSwgbmwsCisJd3JpdGUoJ1BsZWFzZSBzZWxlY3QgYSBib2FyZCBzaXplIGluICgzLi44KS4nKSwgbmwsCisJd3JpdGUoJ051bWJlciA9ICcpLCAKKwljdXJyZW50X291dHB1dChPdXQpLAorCWZsdXNoX291dHB1dChPdXQpLAorCXJlYWQoWCksCisJcmVhZF95bignQWxsIHNvbHV0aW9ucyAoeS9uKT8gJywgQWxsKSwKKwlyZWFkX3luKCdPdXRwdXQgKHkvbik/ICcsIE91dHB1dCksCisJc3RhdGlzdGljcyhydW50aW1lLCBfKSwKKwlzb2x2ZV9wZW50KFgsIGFsbChBbGwpLCBvdXRwdXQoT3V0cHV0KSksCisJc3RhdGlzdGljcyhydW50aW1lLCBbXyxUXSksCisJd3JpdGUoJ0NQVSB0aW1lID0gJyksIHdyaXRlKFQpLCB3cml0ZSgnIG1zZWMnKSwgbmwuCisKK3JlYWRfeW4oTWVzc2FnZSwgWU4pIDotCisJd3JpdGUoTWVzc2FnZSksCisJZmx1c2hfb3V0cHV0LAorCXJlYWQoWCksCisJKFggPT0gJ3knIC0+IFlOID0geWVzOyBZTiA9IG5vKS4KKworc29sdmVfcGVudChYLCBhbGwoQWxsKSwgb3V0cHV0KE91dHB1dCkpIDotCisJc29sdmVfcGVudG9taW5vKFgsIEJvYXJkKSwKKwkoT3V0cHV0ID09IHllcyAtPiBzaG93X3Jlc3VsdChCb2FyZCksbmw7IHRydWUpLAorCUFsbCA9PSBubywKKwkhLgorc29sdmVfcGVudChfLCBfLCBfKS4KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIMqjv/SkzqXapfOlyKXfpc6k8sfbw9akuaTrCisgIHNvbHZlX3BlbnRvbWlubyhYLCBCKQorICAgIFggOiCl3KG8pcmkzr3Eyf0oudSkzr/0KQorICAgIEIgOiCl3KG8pcmkzrm9wqTCzgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3NvbHZlX3BlbnRvbWlubyhYLCBCb2FyZCkgOi0KKwlwZW50X2JvYXJkKFgsIFksIEJvYXJkKSwKKwlDb2wgaXMgWSsyLCAKKwlzZXRfeF9wZW50b21pbm8oWCwgWSwgQ29sLCBCb2FyZCwgWjAsIFopLAorCXNvbHZlX3BlbnQoWCwgWSwgQ29sLCBCb2FyZCksCisJcmVtb3ZlX3N5bW1ldHJ5KFowLCBaKS4KKworcmVtb3ZlX3N5bW1ldHJ5KFowLCBaKSA6LQorCW5vbnZhcihaMCksIG5vbnZhcihaKSwgCisJISwKKwlaMCBAPTwgWi4KK3JlbW92ZV9zeW1tZXRyeShfLCBfKS4KKworc29sdmVfcGVudChYLCBZLCBDb2wsIEJvYXJkKSA6LQorCWdldF9zZWFyY2hfbGlzdChMaXN0LCAxLCAxLCBYLCBZLCBDb2wsIEJvYXJkKSwKKwlQdHMgPSBbJ0YnLCdJJywnTCcsJ04nLCdQJywnVCcsJ1UnLCdWJywnVycsJ1knLCdaJ10sCisJc29sdmVfcGVudDAoUHRzLCBMaXN0LCBDb2wsIEJvYXJkKS4KKworc29sdmVfcGVudDAoW10sIF8sIF8sIF8pIDotICEuCitzb2x2ZV9wZW50MChQdHMsIFsoTiwgRSl8THNdLCBDb2wsIEJvYXJkKSA6LQorCXZhcihFKSwKKwkhLAorCW5vdF9vbmVfc3BhY2UoTiwgQ29sLCBCb2FyZCksCisJcGVudF9zZWxlY3QoUCwgUHRzLCBQdHMxKSwKKwlwbGFjZV9wZW50KFAsIE4sIENvbCwgQm9hcmQpLAorCXNvbHZlX3BlbnQwKFB0czEsIExzLCBDb2wsIEJvYXJkKS4KK3NvbHZlX3BlbnQwKFB0cywgW198THNdLCBDb2wsIEJvYXJkKSA6LQorCXNvbHZlX3BlbnQwKFB0cywgTHMsIENvbCwgQm9hcmQpLgorCitub3Rfb25lX3NwYWNlKE4sIENvbCwgQikgOi0KKwkoCisJICAgIE4xIGlzIE4rMSwgYXJnKE4xLCBCLCBYMSksIHZhcihYMSkKKwk7CisJICAgIE4yIGlzIE4rQ29sLCBhcmcoTjIsIEIsIFgyKSwgdmFyKFgyKQorCSksCisJIS4KKworZ2V0X3NlYXJjaF9saXN0KFtdLCBJLCBKLCBYLCBZLCBfLCBfKSA6LQorCUogPTo9IFkrMSwgSSA9Oj0gWC0xLCAKKwkhLgorZ2V0X3NlYXJjaF9saXN0KEwsIEksIEosIFgsIFksIENvbCwgQikgOi0KKwlJID06PSAwLCBKID08IFgsCisJISwKKwlnZXRfc2VhcmNoX2xpc3QoTCwgSiwgMSwgWCwgWSwgQ29sLCBCKS4KK2dldF9zZWFyY2hfbGlzdChMLCBJLCBKLCBYLCBZLCBDb2wsIEIpIDotCisJSSA9Oj0gMCwgSiA+IFgsCisJISwKKwlKMSBpcyBKLVgrMSwKKwlnZXRfc2VhcmNoX2xpc3QoTCwgWCwgSjEsIFgsIFksIENvbCwgQikuCitnZXRfc2VhcmNoX2xpc3QoTCwgSSwgSiwgWCwgWSwgQ29sLCBCKSA6LQorCUogPTo9IFkrMSwKKwkhLAorCUoxIGlzIEkrMitZLVgsCisJZ2V0X3NlYXJjaF9saXN0KEwsIFgsIEoxLCBYLCBZLCBDb2wsIEIpLgorZ2V0X3NlYXJjaF9saXN0KFsoTixaKXxMc10sIEksIEosIFgsIFksIENvbCwgQikgOi0KKwlOIGlzIENvbCpJK0orMSwKKwlhcmcoTiwgQiwgWiksCisgICAgICAgIHZhcihaKSwKKyAgICAgICAgISwKKyAgICAgICAgSTEgaXMgSS0xLAorICAgICAgICBKMSBpcyBKKzEsCisJZ2V0X3NlYXJjaF9saXN0KExzLCBJMSwgSjEsIFgsIFksIENvbCwgQikuCitnZXRfc2VhcmNoX2xpc3QoTCwgSSwgSiwgWCwgWSwgQ29sLCBCKSA6LQorICAgICAgICBJMSBpcyBJLTEsCisgICAgICAgIEoxIGlzIEorMSwKKwlnZXRfc2VhcmNoX2xpc3QoTCwgSTEsIEoxLCBYLCBZLCBDb2wsIEIpLgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgUmVtb3ZlIFN5bW1ldHJ5IGJ5IHVzaW5nIFgtcGVudG9taW5vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc2V0X3hfcGVudG9taW5vKFgsIF8sIF8sIEJvYXJkLCBaMCwgWikgOi0KKwlYID06PSAzLCAhLAorCSgKKwkgICAgcGxhY2VfcGVudCgnWCcsIDIsIDEsIDIyLCBCb2FyZCksCisJICAgIGxvb2tfdXBfYm9hcmQoMSwgMywgMjIsIEJvYXJkLCBaMCksCisJICAgIGxvb2tfdXBfYm9hcmQoMywgMywgMjIsIEJvYXJkLCBaKQorCTsKKyAgICAJICAgIHBsYWNlX3BlbnQoJ1gnLCAyLCAyLCAyMiwgQm9hcmQpLAorCSAgICBsb29rX3VwX2JvYXJkKDEsIDQsIDIyLCBCb2FyZCwgWjApLAorCSAgICBsb29rX3VwX2JvYXJkKDMsIDQsIDIyLCBCb2FyZCwgWikKKwk7CisgICAgCSAgICBwbGFjZV9wZW50KCdYJywgMiwgMywgMjIsIEJvYXJkKSwKKwkgICAgbG9va191cF9ib2FyZCgxLCA1LCAyMiwgQm9hcmQsIFowKSwKKwkgICAgbG9va191cF9ib2FyZCgzLCA1LCAyMiwgQm9hcmQsIFopCisJOworICAgIAkgICAgcGxhY2VfcGVudCgnWCcsIDIsIDQsIDIyLCBCb2FyZCksCisJICAgIGxvb2tfdXBfYm9hcmQoMSwgNiwgMjIsIEJvYXJkLCBaMCksCisJICAgIGxvb2tfdXBfYm9hcmQoMywgNiwgMjIsIEJvYXJkLCBaKQorCTsKKyAgICAJICAgIHBsYWNlX3BlbnQoJ1gnLCAyLCA1LCAyMiwgQm9hcmQpLAorCSAgICBsb29rX3VwX2JvYXJkKDEsIDcsIDIyLCBCb2FyZCwgWjApLAorCSAgICBsb29rX3VwX2JvYXJkKDMsIDcsIDIyLCBCb2FyZCwgWikKKwk7CisgICAgCSAgICBwbGFjZV9wZW50KCdYJywgMiwgNiwgMjIsIEJvYXJkKSwKKwkgICAgbG9va191cF9ib2FyZCgxLCA4LCAyMiwgQm9hcmQsIFowKSwKKwkgICAgbG9va191cF9ib2FyZCgzLCA4LCAyMiwgQm9hcmQsIFopCisJOworICAgIAkgICAgcGxhY2VfcGVudCgnWCcsIDIsIDcsIDIyLCBCb2FyZCksCisJICAgIGxvb2tfdXBfYm9hcmQoMSwgOSwgMjIsIEJvYXJkLCBaMCksCisJICAgIGxvb2tfdXBfYm9hcmQoMywgOSwgMjIsIEJvYXJkLCBaKQorCTsKKyAgICAJICAgIHBsYWNlX3BlbnQoJ1gnLCAyLCA4LCAyMiwgQm9hcmQpLAorCSAgICBsb29rX3VwX2JvYXJkKDEsIDEwLCAyMiwgQm9hcmQsIFowKSwKKwkgICAgbG9va191cF9ib2FyZCgzLCAxMCwgMjIsIEJvYXJkLCBaKQorCTsKKyAgICAJICAgIHBsYWNlX3BlbnQoJ1gnLCAyLCA5LCAyMiwgQm9hcmQpLAorCSAgICBsb29rX3VwX2JvYXJkKDEsIDExLCAyMiwgQm9hcmQsIFowKSwKKwkgICAgbG9va191cF9ib2FyZCgzLCAxMSwgMjIsIEJvYXJkLCBaKQorCSkuCisJCitzZXRfeF9wZW50b21pbm8oWCwgXywgXywgQm9hcmQsIFowLCBaKSA6LQorCVggPTo9IDgsICEsCisJKAorCSAgICBwbGFjZV9wZW50KCdYJywgMywgMSwgMTAsIEJvYXJkKQorCTsKKyAgICAJICAgIHBsYWNlX3BlbnQoJ1gnLCA0LCAxLCAxMCwgQm9hcmQpCisJOworICAgIAkgICAgcGxhY2VfcGVudCgnWCcsIDMsIDIsIDEwLCBCb2FyZCksCisJICAgIGxvb2tfdXBfYm9hcmQoMiwgNCwgMTAsIEJvYXJkLCBaMCksCisJICAgIGxvb2tfdXBfYm9hcmQoNCwgMiwgMTAsIEJvYXJkLCBaKQorCSkuCitzZXRfeF9wZW50b21pbm8oWCwgWSwgQ29sLCBCb2FyZCwgWjAsIFopIDotCisJNCA9PCBYLCBYID08IDYsICEsCisJTSBpcyAoWC0xKS8vMiwKKwlOIGlzIChZLTEpLy8yLAorCWZvcihKMCwgMSwgTiksCisJICAgZm9yKEkwLCAxLCBNKSwKKwkgICAgSSBpcyBJMCsxLAorCSAgICBKIGlzIEowLAorCSAgICBwbGFjZV9wZW50KCdYJywgSSwgSiwgQ29sLCBCb2FyZCksCisJICAgICgKKwkJWCA9Oj0gNSwgSSA9Oj0gMyAtPgorCQlsb29rX3VwX2JvYXJkKDEsIEosIENvbCwgQm9hcmQsIFowKSwKKwkJbG9va191cF9ib2FyZCg1LCBKLCBDb2wsIEJvYXJkLCBaKQorCSAgICA7CisJCXRydWUKKwkgICAgKSwKKwkgICAgKAorCQlYID06PSA0LCBJID06PSAyLCBKID06PSA3IC0+CisJCWxvb2tfdXBfYm9hcmQoMSwgNywgQ29sLCBCb2FyZCwgWjApLAorCQlsb29rX3VwX2JvYXJkKDEsIDksIENvbCwgQm9hcmQsIFopCisJICAgIDsKKwkJdHJ1ZQorCSAgICApLgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgpdyhvKXJpM4oSaGiSinArsqspPLK1qS5CisgIGxvb2tfdXBfYm9hcmQoSSwgSiwgQ29sLCBCLCBYKQorICAgIEkgIDogudTI1rnmCisgICAgSiAgOiDO88jWueYKKyAgICBDb2w6IM7zpM6/9CsyKCsypM/KyaTOpL+k4cmszdcpCisgICAgQiAgOiCl3KG8pcmkzrm9wqTCzgorICAgIFggIDogpd6luQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCitsb29rX3VwX2JvYXJkKEksIEosIENvbCwgQiwgWCkgOi0KKwlQIGlzIENvbCpJK0orMSwKKwlhcmcoUCwgQiwgWCkuCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICCl3KG8pcmkzrruwK4KKyAgcGVudF9ib2FyZChJLCBKLCBCKQorICAgIEkgOiCl3KG8pcmkzr3Eyf0oudSkzr/0KQorICAgIEogOiCl3KG8pcmkzrKjyf0ozvOkzr/0KQorICAgIEIgOiCl3KG8pcmkzrm9wqTCzgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BlbnRfYm9hcmQoSSwgSiwgQm9hcmQpIDotIDMgPTwgSSwgSSA9PCA2LCAhLAorCUogaXMgNjAvL0ksCisJbWFrZV9ib2FyZChJLCBKLCBCb2FyZCkuCisKK3BlbnRfYm9hcmQoSSwgSSwgQm9hcmQpIDotIEkgPT0gOCwgISwKKwltYWtlX2JvYXJkKDgsIDgsIEJvYXJkKSwKKwlsb29rX3VwX2JvYXJkKDQsIDQsIDEwLCBCb2FyZCwgJyAnKSwKKwlsb29rX3VwX2JvYXJkKDQsIDUsIDEwLCBCb2FyZCwgJyAnKSwKKwlsb29rX3VwX2JvYXJkKDUsIDQsIDEwLCBCb2FyZCwgJyAnKSwKKwlsb29rX3VwX2JvYXJkKDUsIDUsIDEwLCBCb2FyZCwgJyAnKS4KKworbWFrZV9ib2FyZChJLCBKLCBCb2FyZCkgOi0KKwlNIGlzIEkrMiwgTiBpcyBKKzIsCisJVG90YWwgaXMgTSpOLAorCWZ1bmN0b3IoQm9hcmQsIGIsIFRvdGFsKSwgCisJZnJhbWUoMSwgMSwgTSwgTiwgQm9hcmQpLgorCitmcmFtZShfLCBKLCBfLCBOLCBfKSA6LSBKID4gTiwgIS4KK2ZyYW1lKEksIEosIE0sIE4sIEJvYXJkKSA6LSBJID4gTSwgISwKKwlKMSBpcyBKKzEsCisJZnJhbWUoMSwgSjEsIE0sIE4sIEJvYXJkKS4KK2ZyYW1lKEksIEosIE0sIE4sIEJvYXJkKSA6LSAKKwkoSSA9Oj0gMSA7IEkgPTo9IE0gOyBKID06PSAxIDsgSiA9Oj0gTiksCisJICEsCisJIEwgaXMgKEktMSkqTitKLAorCSBhcmcoTCwgQm9hcmQsICcqJyksCisJIEkxIGlzIEkrMSwKKwkgSjEgaXMgSiwKKwkgZnJhbWUoSTEsIEoxLCBNLCBOLCBCb2FyZCkuCitmcmFtZShJLCBKLCBNLCBOLCBCb2FyZCkgOi0gCisJSTEgaXMgSSsxLAorCUoxIGlzIEosCisJZnJhbWUoSTEsIEoxLCBNLCBOLCBCb2FyZCkuCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICCl3KG8pcmkzsm9vKgKKyAgc2hvd19yZXN1bHQoQikKKyAgICBCIDogpdyhvKXJpM65vcKkws4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzaG93X3Jlc3VsdChCKSA6LQorCWJvYXJkX3NpemUoQiwgSCwgVyksCisJQ29sIGlzIFcrMiwgCisJZm9yKEksIDEsIEgpLAorCW5sLAorCSAgIGZvcihKLCAxLCBXKSwKKwkgICBsb29rX3VwX2JvYXJkKEksIEosIENvbCwgQiwgUCksCisJICAgd3JpdGVfcGVudChQKSwKKyAgICAgICAgZmFpbC4KK3Nob3dfcmVzdWx0KF8pIDotIG5sLgorCit3cml0ZV9wZW50KFApIDotIHZhcihQKSwgISwgd3JpdGUoJ18gJykuCit3cml0ZV9wZW50KFApIDotIHdyaXRlKFApLCB3cml0ZSgnICcpLgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgpdyhvKXJpM6ltaWkpboKKyAgYm9hcmRfc2l6ZShCLCBILCBXKQorICAgIEIgOiCl3KG8pcmkzrm9wqTCzgorICAgIEggOiCl3KG8pcmkzr3Eyf0KKyAgICBXIDogpdyhvKXJpM6yo8n9CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9hcmRfc2l6ZShCLCBILCBXKSA6LSAKKwlib2FyZF93aWR0aChCLCBXKSwKKwlib2FyZF9oZWlnaHQoVywgSCkuCisKK2JvYXJkX3dpZHRoKEIsIFcpIDotIAorCWNvdW50X2ZsYW1lKEIsIDEsIFcpLgorCitjb3VudF9mbGFtZShCLCBOLCBXKSA6LSAKKwlhcmcoTiwgQiwgUCksIFAgPT0gJyonLAorCSEsCisJTjEgaXMgTisxLAorCWNvdW50X2ZsYW1lKEIsIE4xLCBXKS4KK2NvdW50X2ZsYW1lKF8sIE4sIFcpIDotCisJVyBpcyBOLTQuCisKK2JvYXJkX2hlaWdodChXLCBIKSA6LQorCTEwID08IFcsIFcgPTwgMjAsCisJISwKKwlIIGlzIDYwLy9XLgorYm9hcmRfaGVpZ2h0KDgsIDgpLgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgpdql86XIpd+lzqTyo7GkxMfbw9akuaTrCisgIHBsYWNlX3BlbnQoUCwgSSwgSiwgQ29sLCBCKQorICAgIFAgIDogpdql86XIpd+lzqTOvO/O4My+CisgICAgSSAgOiC51MjWueYKKyAgICBKICA6IM7zyNa55gorICAgIENvbDogzvOkzr/0KzIoKzKkz8rJpM6kv6ThyazN1ykKKyAgICBCICA6IKXcobylyaTOub3CpMLOCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkKK3BsYWNlX3BlbnQoUCwgSSwgSiwgQ29sLCBCKSA6LQorCUMgaXMgQ29sKkkrSisxLAorCSEsCisJcGxhY2VfcGVudChQLCBDLCBDb2wsIEIpLgorCislIFBlbnRtaW5vID0gJ1gnCislIE51bWJlciA9IDEKKyUgICBECislIEMgRSBHCislICAgRgorcGxhY2VfcGVudCgnWCcsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnWCcpLAorCUQgaXMgQy1Db2wrMSwKKwlhcmcoRCwgQm9hcmQsICdYJyksCQorCUUgaXMgQysxLAorCWFyZyhFLCBCb2FyZCwgJ1gnKSwKKwlGIGlzIEUrQ29sLAorCWFyZyhGLCBCb2FyZCwgJ1gnKSwKKwlHIGlzIEUrMSwKKwlhcmcoRywgQm9hcmQsICdYJykuCislIFBlbnRtaW5vID0gJ0YnCislIE51bWJlciA9IDEKKyUgICBEIEYKKyUgQyBFIAorJSAgIEcKK3BsYWNlX3BlbnQoJ0YnLCBDLCBDb2wsIEJvYXJkKSA6LQorCWFyZyhDLCBCb2FyZCwgJ0YnKSwKKwlEIGlzIEMtQ29sKzEsCisJYXJnKEQsIEJvYXJkLCAnRicpLAkKKwlFIGlzIEMrMSwKKwlhcmcoRSwgQm9hcmQsICdGJyksCisJRiBpcyBEKzEsCisJYXJnKEYsIEJvYXJkLCAnRicpLAorCUcgaXMgRStDb2wsCisJYXJnKEcsIEJvYXJkLCAnRicpLgorJSBQZW50bWlubyA9ICdGJworJSBOdW1iZXIgPSAyCislICAgRAorJSBDIEUgRgorJSAgICAgRworcGxhY2VfcGVudCgnRicsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnRicpLAorCUQgaXMgQy1Db2wrMSwKKwlhcmcoRCwgQm9hcmQsICdGJyksCQorCUUgaXMgQysxLAorCWFyZyhFLCBCb2FyZCwgJ0YnKSwKKwlGIGlzIEUrMSwKKwlhcmcoRiwgQm9hcmQsICdGJyksCisJRyBpcyBGK0NvbCwKKwlhcmcoRywgQm9hcmQsICdGJykuCislIFBlbnRtaW5vID0gJ0YnCislIE51bWJlciA9IDMKKyUgICBDCislICAgRSBHCislIEQgRiAKK3BsYWNlX3BlbnQoJ0YnLCBDLCBDb2wsIEJvYXJkKSA6LQorCWFyZyhDLCBCb2FyZCwgJ0YnKSwKKwlEIGlzIEMrKDIqQ29sKS0xLAorCWFyZyhELCBCb2FyZCwgJ0YnKSwJCisJRSBpcyBDK0NvbCwKKwlhcmcoRSwgQm9hcmQsICdGJyksCisJRiBpcyBEKzEsCisJYXJnKEYsIEJvYXJkLCAnRicpLAorCUcgaXMgRSsxLAorCWFyZyhHLCBCb2FyZCwgJ0YnKS4KKyUgUGVudG1pbm8gPSAnRicKKyUgTnVtYmVyID0gNAorJSBDCislIEQgRSBHCislICAgRgorcGxhY2VfcGVudCgnRicsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnRicpLAorCUQgaXMgQytDb2wsCisJYXJnKEQsIEJvYXJkLCAnRicpLAkKKwlFIGlzIEQrMSwKKwlhcmcoRSwgQm9hcmQsICdGJyksCisJRiBpcyBFK0NvbCwKKwlhcmcoRiwgQm9hcmQsICdGJyksCisJRyBpcyBFKzEsCisJYXJnKEcsIEJvYXJkLCAnRicpLgorJSBQZW50bWlubyA9ICdGJworJSBOdW1iZXIgPSA1CislIEMgRAorJSAgIEUgRworJSAgIEYKK3BsYWNlX3BlbnQoJ0YnLCBDLCBDb2wsIEJvYXJkKSA6LQorCWFyZyhDLCBCb2FyZCwgJ0YnKSwKKwlEIGlzIEMrMSwKKwlhcmcoRCwgQm9hcmQsICdGJyksCQorCUUgaXMgRCtDb2wsCisJYXJnKEUsIEJvYXJkLCAnRicpLAorCUYgaXMgRStDb2wsCisJYXJnKEYsIEJvYXJkLCAnRicpLAorCUcgaXMgRSsxLAorCWFyZyhHLCBCb2FyZCwgJ0YnKS4KKyUgUGVudG1pbm8gPSAnRicKKyUgTnVtYmVyID0gNgorJSAgICAgRQorJSBDIEQgRworJSAgIEYKK3BsYWNlX3BlbnQoJ0YnLCBDLCBDb2wsIEJvYXJkKSA6LQorCWFyZyhDLCBCb2FyZCwgJ0YnKSwKKwlEIGlzIEMrMSwKKwlhcmcoRCwgQm9hcmQsICdGJyksCQorCUUgaXMgQy1Db2wrMiwKKwlhcmcoRSwgQm9hcmQsICdGJyksCisJRiBpcyBEK0NvbCwKKwlhcmcoRiwgQm9hcmQsICdGJyksCisJRyBpcyBEKzEsCisJYXJnKEcsIEJvYXJkLCAnRicpLgorJSBQZW50bWlubyA9ICdGJworJSBOdW1iZXIgPSA3CislICAgRAorJSBDIEUKKyUgICBGIEcKK3BsYWNlX3BlbnQoJ0YnLCBDLCBDb2wsIEJvYXJkKSA6LQorCWFyZyhDLCBCb2FyZCwgJ0YnKSwKKwlEIGlzIEMtQ29sKzEsCisJYXJnKEQsIEJvYXJkLCAnRicpLAkKKwlFIGlzIEMrMSwKKwlhcmcoRSwgQm9hcmQsICdGJyksCisJRiBpcyBFK0NvbCwKKwlhcmcoRiwgQm9hcmQsICdGJyksCisJRyBpcyBGKzEsCisJYXJnKEcsIEJvYXJkLCAnRicpLgorJSBQZW50bWlubyA9ICdGJworJSBOdW1iZXIgPSA4CislICAgRAorJSBDIEYgRworJSBFCitwbGFjZV9wZW50KCdGJywgQywgQ29sLCBCb2FyZCkgOi0KKwlhcmcoQywgQm9hcmQsICdGJyksCisJRCBpcyBDLUNvbCsxLAorCWFyZyhELCBCb2FyZCwgJ0YnKSwJCisJRSBpcyBDK0NvbCwKKwlhcmcoRSwgQm9hcmQsICdGJyksCisJRiBpcyBDKzEsCisJYXJnKEYsIEJvYXJkLCAnRicpLAorCUcgaXMgRisxLAorCWFyZyhHLCBCb2FyZCwgJ0YnKS4KKyUgUGVudG1pbm8gPSAnSScKKyUgTnVtYmVyID0gMQorJSBDCislIEQKKyUgRQorJSBGCislIEcKK3BsYWNlX3BlbnQoJ0knLCBDLCBDb2wsIEJvYXJkKSA6LQorCWFyZyhDLCBCb2FyZCwgJ0knKSwKKwlEIGlzIEMrQ29sLAorCWFyZyhELCBCb2FyZCwgJ0knKSwJCisJRSBpcyBEK0NvbCwKKwlhcmcoRSwgQm9hcmQsICdJJyksCisJRiBpcyBFK0NvbCwKKwlhcmcoRiwgQm9hcmQsICdJJyksCisJRyBpcyBGK0NvbCwKKwlhcmcoRywgQm9hcmQsICdJJykuCislIFBlbnRtaW5vID0gJ0knCislIE51bWJlciA9IDIKKyUgQyBEIEUgRiBHCitwbGFjZV9wZW50KCdJJywgQywgXywgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnSScpLAorCUQgaXMgQysxLAorCWFyZyhELCBCb2FyZCwgJ0knKSwJCisJRSBpcyBEKzEsCisJYXJnKEUsIEJvYXJkLCAnSScpLAorCUYgaXMgRSsxLAorCWFyZyhGLCBCb2FyZCwgJ0knKSwKKwlHIGlzIEYrMSwKKwlhcmcoRywgQm9hcmQsICdJJykuCislIFBlbnRtaW5vID0gJ0wnCislIE51bWJlciA9IDEKKyUgQyAKKyUgRAorJSBFIAorJSBGIEcgCitwbGFjZV9wZW50KCdMJywgQywgQ29sLCBCb2FyZCkgOi0KKwlhcmcoQywgQm9hcmQsICdMJyksCisJRCBpcyBDK0NvbCwKKwlhcmcoRCwgQm9hcmQsICdMJyksCQorCUUgaXMgRCtDb2wsCisJYXJnKEUsIEJvYXJkLCAnTCcpLAorCUYgaXMgRStDb2wsCisJYXJnKEYsIEJvYXJkLCAnTCcpLAorCUcgaXMgRisxLAorCWFyZyhHLCBCb2FyZCwgJ0wnKS4KKyUgUGVudG1pbm8gPSAnTCcKKyUgTnVtYmVyID0gMgorJSBDIEUgRiBHCislIEQKK3BsYWNlX3BlbnQoJ0wnLCBDLCBDb2wsIEJvYXJkKSA6LQorCWFyZyhDLCBCb2FyZCwgJ0wnKSwKKwlEIGlzIEMrQ29sLAorCWFyZyhELCBCb2FyZCwgJ0wnKSwJCisJRSBpcyBDKzEsCisJYXJnKEUsIEJvYXJkLCAnTCcpLAorCUYgaXMgRSsxLAorCWFyZyhGLCBCb2FyZCwgJ0wnKSwKKwlHIGlzIEYrMSwKKwlhcmcoRywgQm9hcmQsICdMJykuCislIFBlbnRtaW5vID0gJ0wnCislIE51bWJlciA9IDMKKyUgQyBECislICAgRQorJSAgIEYKKyUgICBHCitwbGFjZV9wZW50KCdMJywgQywgQ29sLCBCb2FyZCkgOi0KKwlhcmcoQywgQm9hcmQsICdMJyksCisJRCBpcyBDKzEsCisJYXJnKEQsIEJvYXJkLCAnTCcpLAkKKwlFIGlzIEQrQ29sLAorCWFyZyhFLCBCb2FyZCwgJ0wnKSwKKwlGIGlzIEUrQ29sLAorCWFyZyhGLCBCb2FyZCwgJ0wnKSwKKwlHIGlzIEYrQ29sLAorCWFyZyhHLCBCb2FyZCwgJ0wnKS4KKyUgUGVudG1pbm8gPSAnTCcKKyUgTnVtYmVyID0gNAorJSAgICAgICBGCislIEMgRCBFIEcKK3BsYWNlX3BlbnQoJ0wnLCBDLCBDb2wsIEJvYXJkKSA6LQorCWFyZyhDLCBCb2FyZCwgJ0wnKSwKKwlEIGlzIEMrMSwKKwlhcmcoRCwgQm9hcmQsICdMJyksCQorCUUgaXMgRCsxLAorCWFyZyhFLCBCb2FyZCwgJ0wnKSwKKwlGIGlzIEUtQ29sKzEsCisJYXJnKEYsIEJvYXJkLCAnTCcpLAorCUcgaXMgRSsxLAorCWFyZyhHLCBCb2FyZCwgJ0wnKS4KKyUgUGVudG1pbm8gPSAnTCcKKyUgTnVtYmVyID0gNQorJSAgIEMKKyUgICBECislICAgRiAgCislIEUgRworcGxhY2VfcGVudCgnTCcsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnTCcpLAorCUQgaXMgQytDb2wsCisJYXJnKEQsIEJvYXJkLCAnTCcpLAkKKwlFIGlzIEQrKDIqQ29sKS0xLAorCWFyZyhFLCBCb2FyZCwgJ0wnKSwKKwlGIGlzIEQrQ29sLAorCWFyZyhGLCBCb2FyZCwgJ0wnKSwKKwlHIGlzIEUrMSwKKwlhcmcoRywgQm9hcmQsICdMJykuCislIFBlbnRtaW5vID0gJ0wnCislIE51bWJlciA9IDYKKyUgQworJSBEIEUgRiBHCitwbGFjZV9wZW50KCdMJywgQywgQ29sLCBCb2FyZCkgOi0KKwlhcmcoQywgQm9hcmQsICdMJyksCisJRCBpcyBDK0NvbCwKKwlhcmcoRCwgQm9hcmQsICdMJyksCQorCUUgaXMgRCsxLAorCWFyZyhFLCBCb2FyZCwgJ0wnKSwKKwlGIGlzIEUrMSwKKwlhcmcoRiwgQm9hcmQsICdMJyksCisJRyBpcyBGKzEsCisJYXJnKEcsIEJvYXJkLCAnTCcpLgorJSBQZW50bWlubyA9ICdMJworJSBOdW1iZXIgPSA3CislIEMgRQorJSBECislIEYgCislIEcKK3BsYWNlX3BlbnQoJ0wnLCBDLCBDb2wsIEJvYXJkKSA6LQorCWFyZyhDLCBCb2FyZCwgJ0wnKSwKKwlEIGlzIEMrQ29sLAorCWFyZyhELCBCb2FyZCwgJ0wnKSwJCisJRSBpcyBDKzEsCisJYXJnKEUsIEJvYXJkLCAnTCcpLAorCUYgaXMgRCtDb2wsCisJYXJnKEYsIEJvYXJkLCAnTCcpLAorCUcgaXMgRitDb2wsCisJYXJnKEcsIEJvYXJkLCAnTCcpLgorJSBQZW50bWlubyA9ICdMJworJSBOdW1iZXIgPSA4CislIEMgRCBFIEYKKyUgICAgICAgRworcGxhY2VfcGVudCgnTCcsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnTCcpLAorCUQgaXMgQysxLAorCWFyZyhELCBCb2FyZCwgJ0wnKSwJCisJRSBpcyBEKzEsCisJYXJnKEUsIEJvYXJkLCAnTCcpLAorCUYgaXMgRSsxLAorCWFyZyhGLCBCb2FyZCwgJ0wnKSwKKwlHIGlzIEYrQ29sLAorCWFyZyhHLCBCb2FyZCwgJ0wnKS4KKyUgUGVudG1pbm8gPSAnTicKKyUgTnVtYmVyID0gMQorJSBDCislIEQKKyUgRSBGCislICAgRworcGxhY2VfcGVudCgnTicsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnTicpLAorCUQgaXMgQytDb2wsCisJYXJnKEQsIEJvYXJkLCAnTicpLAkKKwlFIGlzIEQrQ29sLAorCWFyZyhFLCBCb2FyZCwgJ04nKSwKKwlGIGlzIEUrMSwKKwlhcmcoRiwgQm9hcmQsICdOJyksCisJRyBpcyBGK0NvbCwKKwlhcmcoRywgQm9hcmQsICdOJykuCislIFBlbnRtaW5vID0gJ04nCislIE51bWJlciA9IDIKKyUgICBEIEYgRworJSBDIEUKK3BsYWNlX3BlbnQoJ04nLCBDLCBDb2wsIEJvYXJkKSA6LQorCWFyZyhDLCBCb2FyZCwgJ04nKSwKKwlEIGlzIEMtQ29sKzEsCisJYXJnKEQsIEJvYXJkLCAnTicpLAkKKwlFIGlzIEMrMSwKKwlhcmcoRSwgQm9hcmQsICdOJyksCisJRiBpcyBEKzEsCisJYXJnKEYsIEJvYXJkLCAnTicpLAorCUcgaXMgRisxLAorCWFyZyhHLCBCb2FyZCwgJ04nKS4KKyUgUGVudG1pbm8gPSAnTicKKyUgTnVtYmVyID0gMworJSBDCislIEQgRQorJSAgIEYKKyUgICBHCitwbGFjZV9wZW50KCdOJywgQywgQ29sLCBCb2FyZCkgOi0KKwlhcmcoQywgQm9hcmQsICdOJyksCisJRCBpcyBDK0NvbCwKKwlhcmcoRCwgQm9hcmQsICdOJyksCQorCUUgaXMgRCsxLAorCWFyZyhFLCBCb2FyZCwgJ04nKSwKKwlGIGlzIEUrQ29sLAorCWFyZyhGLCBCb2FyZCwgJ04nKSwKKwlHIGlzIEYrQ29sLAorCWFyZyhHLCBCb2FyZCwgJ04nKS4KKyUgUGVudG1pbm8gPSAnTicKKyUgTnVtYmVyID0gNAorJSAgICAgIEUgRworJSAgQyBEIEYKK3BsYWNlX3BlbnQoJ04nLCBDLCBDb2wsIEJvYXJkKSA6LQorCWFyZyhDLCBCb2FyZCwgJ04nKSwKKwlEIGlzIEMrMSwKKwlhcmcoRCwgQm9hcmQsICdOJyksCQorCUUgaXMgQy1Db2wrMiwKKwlhcmcoRSwgQm9hcmQsICdOJyksCisJRiBpcyBEKzEsCisJYXJnKEYsIEJvYXJkLCAnTicpLAorCUcgaXMgRSsxLAorCWFyZyhHLCBCb2FyZCwgJ04nKS4KKyUgUGVudG1pbm8gPSAnTicKKyUgTnVtYmVyID0gNQorJSAgIEMKKyUgICBFCislIEQgRworJSBGCitwbGFjZV9wZW50KCdOJywgQywgQ29sLCBCb2FyZCkgOi0KKwlhcmcoQywgQm9hcmQsICdOJyksCisJRCBpcyBDKygyKkNvbCktMSwKKwlhcmcoRCwgQm9hcmQsICdOJyksCQorCUUgaXMgQytDb2wsCisJYXJnKEUsIEJvYXJkLCAnTicpLAorCUYgaXMgRCtDb2wsCisJYXJnKEYsIEJvYXJkLCAnTicpLAorCUcgaXMgRCsxLAorCWFyZyhHLCBCb2FyZCwgJ04nKS4KKyUgUGVudG1pbm8gPSAnTicKKyUgTnVtYmVyID0gNgorJSBDIEQKKyUgICBFIEYgRworcGxhY2VfcGVudCgnTicsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnTicpLAorCUQgaXMgQysxLAorCWFyZyhELCBCb2FyZCwgJ04nKSwJCisJRSBpcyBEK0NvbCwKKwlhcmcoRSwgQm9hcmQsICdOJyksCisJRiBpcyBFKzEsCisJYXJnKEYsIEJvYXJkLCAnTicpLAorCUcgaXMgRisxLAorCWFyZyhHLCBCb2FyZCwgJ04nKS4KKyUgUGVudG1pbm8gPSAnTicKKyUgTnVtYmVyID0gNworJSAgIEQKKyUgQyBGCislIEUKKyUgRworcGxhY2VfcGVudCgnTicsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnTicpLAorCUQgaXMgQy1Db2wrMSwKKwlhcmcoRCwgQm9hcmQsICdOJyksCQorCUUgaXMgQytDb2wsCisJYXJnKEUsIEJvYXJkLCAnTicpLAorCUYgaXMgQysxLAorCWFyZyhGLCBCb2FyZCwgJ04nKSwKKwlHIGlzIEUrQ29sLAorCWFyZyhHLCBCb2FyZCwgJ04nKS4KKyUgUGVudG1pbm8gPSAnTicKKyUgTnVtYmVyID0gOAorJSBDIEQgRSAKKyUgICAgIEYgRworcGxhY2VfcGVudCgnTicsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnTicpLAorCUQgaXMgQysxLAorCWFyZyhELCBCb2FyZCwgJ04nKSwJCisJRSBpcyBEKzEsCisJYXJnKEUsIEJvYXJkLCAnTicpLAorCUYgaXMgRStDb2wsCisJYXJnKEYsIEJvYXJkLCAnTicpLAorCUcgaXMgRisxLAorCWFyZyhHLCBCb2FyZCwgJ04nKS4KKyUgUGVudG1pbm8gPSAnUCcKKyUgTnVtYmVyID0gMQorJSBDIEUKKyUgRCBHCislIEYKK3BsYWNlX3BlbnQoJ1AnLCBDLCBDb2wsIEJvYXJkKSA6LQorCWFyZyhDLCBCb2FyZCwgJ1AnKSwKKwlEIGlzIEMrQ29sLAorCWFyZyhELCBCb2FyZCwgJ1AnKSwJCisJRSBpcyBDKzEsCisJYXJnKEUsIEJvYXJkLCAnUCcpLAorCUYgaXMgRCtDb2wsCisJYXJnKEYsIEJvYXJkLCAnUCcpLAorCUcgaXMgRCsxLAorCWFyZyhHLCBCb2FyZCwgJ1AnKS4KKyUgUGVudG1pbm8gPSAnUCcKKyUgTnVtYmVyID0gMgorJSBDIEQgRgorJSAgIEUgRworcGxhY2VfcGVudCgnUCcsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnUCcpLAorCUQgaXMgQysxLAorCWFyZyhELCBCb2FyZCwgJ1AnKSwJCisJRSBpcyBEK0NvbCwKKwlhcmcoRSwgQm9hcmQsICdQJyksCisJRiBpcyBEKzEsCisJYXJnKEYsIEJvYXJkLCAnUCcpLAorCUcgaXMgRSsxLAorCWFyZyhHLCBCb2FyZCwgJ1AnKS4KKyUgUGVudG1pbm8gPSAnUCcKKyUgTnVtYmVyID0gMworJSAgIEQKKyUgQyBGCislIEUgRworcGxhY2VfcGVudCgnUCcsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnUCcpLAorCUQgaXMgQy0oQ29sLTEpLAorCWFyZyhELCBCb2FyZCwgJ1AnKSwJCisJRSBpcyBDK0NvbCwKKwlhcmcoRSwgQm9hcmQsICdQJyksCisJRiBpcyBDKzEsCisJYXJnKEYsIEJvYXJkLCAnUCcpLAorCUcgaXMgRSsxLAorCWFyZyhHLCBCb2FyZCwgJ1AnKS4KKyUgUGVudG1pbm8gPSAnUCcKKyUgTnVtYmVyID0gNAorJSBDIEUKKyUgRCBGIEcKK3BsYWNlX3BlbnQoJ1AnLCBDLCBDb2wsIEJvYXJkKSA6LQorCWFyZyhDLCBCb2FyZCwgJ1AnKSwKKwlEIGlzIEMrQ29sLAorCWFyZyhELCBCb2FyZCwgJ1AnKSwJCisJRSBpcyBDKzEsCisJYXJnKEUsIEJvYXJkLCAnUCcpLAorCUYgaXMgRCsxLAorCWFyZyhGLCBCb2FyZCwgJ1AnKSwKKwlHIGlzIEYrMSwKKwlhcmcoRywgQm9hcmQsICdQJykuCislIFBlbnRtaW5vID0gJ1AnCislIE51bWJlciA9IDUKKyUgQyBFCislIEQgRgorJSAgIEcKK3BsYWNlX3BlbnQoJ1AnLCBDLCBDb2wsIEJvYXJkKSA6LQorCWFyZyhDLCBCb2FyZCwgJ1AnKSwKKwlEIGlzIEMrQ29sLAorCWFyZyhELCBCb2FyZCwgJ1AnKSwJCisJRSBpcyBDKzEsCisJYXJnKEUsIEJvYXJkLCAnUCcpLAorCUYgaXMgRCsxLAorCWFyZyhGLCBCb2FyZCwgJ1AnKSwKKwlHIGlzIEYrQ29sLAorCWFyZyhHLCBCb2FyZCwgJ1AnKS4KKyUgUGVudG1pbm8gPSAnUCcKKyUgTnVtYmVyID0gNgorJSAgIEQgRgorJSBDIEUgRworcGxhY2VfcGVudCgnUCcsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnUCcpLAorCUQgaXMgQy0oQ29sLTEpLAorCWFyZyhELCBCb2FyZCwgJ1AnKSwJCisJRSBpcyBDKzEsCisJYXJnKEUsIEJvYXJkLCAnUCcpLAorCUYgaXMgRCsxLAorCWFyZyhGLCBCb2FyZCwgJ1AnKSwKKwlHIGlzIEUrMSwKKwlhcmcoRywgQm9hcmQsICdQJykuCislIFBlbnRtaW5vID0gJ1AnCislIE51bWJlciA9IDcKKyUgQyAKKyUgRCBGCislIEUgRworcGxhY2VfcGVudCgnUCcsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnUCcpLAorCUQgaXMgQytDb2wsCisJYXJnKEQsIEJvYXJkLCAnUCcpLAkKKwlFIGlzIEQrQ29sLAorCWFyZyhFLCBCb2FyZCwgJ1AnKSwKKwlGIGlzIEQrMSwKKwlhcmcoRiwgQm9hcmQsICdQJyksCisJRyBpcyBFKzEsCisJYXJnKEcsIEJvYXJkLCAnUCcpLgorJSBQZW50bWlubyA9ICdQJworJSBOdW1iZXIgPSA4CislIEMgRSBHCislIEQgRgorcGxhY2VfcGVudCgnUCcsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnUCcpLAorCUQgaXMgQytDb2wsCisJYXJnKEQsIEJvYXJkLCAnUCcpLAkKKwlFIGlzIEMrMSwKKwlhcmcoRSwgQm9hcmQsICdQJyksCisJRiBpcyBEKzEsCisJYXJnKEYsIEJvYXJkLCAnUCcpLAorCUcgaXMgRSsxLAorCWFyZyhHLCBCb2FyZCwgJ1AnKS4KKyUgUGVudG1pbm8gPSAnVCcKKyUgTnVtYmVyID0gMQorJSBDIEQgRgorJSAgIEUKKyUgICBHCitwbGFjZV9wZW50KCdUJywgQywgQ29sLCBCb2FyZCkgOi0KKwlhcmcoQywgQm9hcmQsICdUJyksCisJRCBpcyBDKzEsCisJYXJnKEQsIEJvYXJkLCAnVCcpLAkKKwlFIGlzIEQrQ29sLAorCWFyZyhFLCBCb2FyZCwgJ1QnKSwKKwlGIGlzIEQrMSwKKwlhcmcoRiwgQm9hcmQsICdUJyksCisJRyBpcyBFK0NvbCwKKwlhcmcoRywgQm9hcmQsICdUJykuCislIFBlbnRtaW5vID0gJ1QnCislIE51bWJlciA9IDIKKyUgICAgIEUKKyUgQyBEIEYKKyUgICAgIEcKK3BsYWNlX3BlbnQoJ1QnLCBDLCBDb2wsIEJvYXJkKSA6LQorCWFyZyhDLCBCb2FyZCwgJ1QnKSwKKwlEIGlzIEMrMSwKKwlhcmcoRCwgQm9hcmQsICdUJyksCQorCUUgaXMgQy0oQ29sLTIpLAorCWFyZyhFLCBCb2FyZCwgJ1QnKSwKKwlGIGlzIEQrMSwKKwlhcmcoRiwgQm9hcmQsICdUJyksCisJRyBpcyBGK0NvbCwKKwlhcmcoRywgQm9hcmQsICdUJykuCislIFBlbnRtaW5vID0gJ1QnCislIE51bWJlciA9IDMKKyUgICBDCislICAgRQorJSBEIEYgRworcGxhY2VfcGVudCgnVCcsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnVCcpLAorCUQgaXMgQysoQ29sKjIpLTEsCisJYXJnKEQsIEJvYXJkLCAnVCcpLAkKKwlFIGlzIEMrQ29sLAorCWFyZyhFLCBCb2FyZCwgJ1QnKSwKKwlGIGlzIEQrMSwKKwlhcmcoRiwgQm9hcmQsICdUJyksCisJRyBpcyBGKzEsCisJYXJnKEcsIEJvYXJkLCAnVCcpLgorJSBQZW50bWlubyA9ICdUJworJSBOdW1iZXIgPSA0CislIEMKKyUgRCBGIEcKKyUgRQorcGxhY2VfcGVudCgnVCcsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnVCcpLAorCUQgaXMgQytDb2wsCisJYXJnKEQsIEJvYXJkLCAnVCcpLAkKKwlFIGlzIEQrQ29sLAorCWFyZyhFLCBCb2FyZCwgJ1QnKSwKKwlGIGlzIEQrMSwKKwlhcmcoRiwgQm9hcmQsICdUJyksCisJRyBpcyBGKzEsCisJYXJnKEcsIEJvYXJkLCAnVCcpLgorJSBQZW50bWlubyA9ICdVJworJSBOdW1iZXIgPSAxCislIEMgICBGCislIEQgRSBHCitwbGFjZV9wZW50KCdVJywgQywgQ29sLCBCb2FyZCkgOi0KKwlhcmcoQywgQm9hcmQsICdVJyksCisJRCBpcyBDK0NvbCwKKwlhcmcoRCwgQm9hcmQsICdVJyksCQorCUUgaXMgRCsxLAorCWFyZyhFLCBCb2FyZCwgJ1UnKSwKKwlGIGlzIEMrMiwKKwlhcmcoRiwgQm9hcmQsICdVJyksCisJRyBpcyBFKzEsCisJYXJnKEcsIEJvYXJkLCAnVScpLgorJSBQZW50bWlubyA9ICdVJworJSBOdW1iZXIgPSAyCislIEMgRQorJSBECislIEYgRworcGxhY2VfcGVudCgnVScsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnVScpLAorCUQgaXMgQytDb2wsCisJYXJnKEQsIEJvYXJkLCAnVScpLAkKKwlFIGlzIEMrMSwKKwlhcmcoRSwgQm9hcmQsICdVJyksCisJRiBpcyBEK0NvbCwKKwlhcmcoRiwgQm9hcmQsICdVJyksCisJRyBpcyBGKzEsCisJYXJnKEcsIEJvYXJkLCAnVScpLgorJSBQZW50bWlubyA9ICdVJworJSBOdW1iZXIgPSAzCislIEMgRSBGCislIEQgICBHCitwbGFjZV9wZW50KCdVJywgQywgQ29sLCBCb2FyZCkgOi0KKwlhcmcoQywgQm9hcmQsICdVJyksCisJRCBpcyBDK0NvbCwKKwlhcmcoRCwgQm9hcmQsICdVJyksCQorCUUgaXMgQysxLAorCWFyZyhFLCBCb2FyZCwgJ1UnKSwKKwlGIGlzIEUrMSwKKwlhcmcoRiwgQm9hcmQsICdVJyksCisJRyBpcyBEKzIsCisJYXJnKEcsIEJvYXJkLCAnVScpLgorJSBQZW50bWlubyA9ICdVJworJSBOdW1iZXIgPSA0CislIEMgRAorJSAgIEYKKyUgRSBHCitwbGFjZV9wZW50KCdVJywgQywgQ29sLCBCb2FyZCkgOi0KKwlhcmcoQywgQm9hcmQsICdVJyksCisJRCBpcyBDKzEsCisJYXJnKEQsIEJvYXJkLCAnVScpLAkKKwlFIGlzIEMrKDIqQ29sKSwKKwlhcmcoRSwgQm9hcmQsICdVJyksCisJRiBpcyBEK0NvbCwKKwlhcmcoRiwgQm9hcmQsICdVJyksCisJRyBpcyBFKzEsCisJYXJnKEcsIEJvYXJkLCAnVScpLgorJSBQZW50bWlubyA9ICdWJworJSBOdW1iZXIgPSAxCislIEMgCislIEQKKyUgRSBGIEcKK3BsYWNlX3BlbnQoJ1YnLCBDLCBDb2wsIEJvYXJkKSA6LQorCWFyZyhDLCBCb2FyZCwgJ1YnKSwKKwlEIGlzIEMrQ29sLAorCWFyZyhELCBCb2FyZCwgJ1YnKSwJCisJRSBpcyBEK0NvbCwKKwlhcmcoRSwgQm9hcmQsICdWJyksCisJRiBpcyBFKzEsCisJYXJnKEYsIEJvYXJkLCAnVicpLAorCUcgaXMgRisxLAorCWFyZyhHLCBCb2FyZCwgJ1YnKS4KKyUgUGVudG1pbm8gPSAnVicKKyUgTnVtYmVyID0gMgorJSBDIEUgRworJSBECislIEYKK3BsYWNlX3BlbnQoJ1YnLCBDLCBDb2wsIEJvYXJkKSA6LQorCWFyZyhDLCBCb2FyZCwgJ1YnKSwKKwlEIGlzIEMrQ29sLAorCWFyZyhELCBCb2FyZCwgJ1YnKSwJCisJRSBpcyBDKzEsCisJYXJnKEUsIEJvYXJkLCAnVicpLAorCUYgaXMgRCtDb2wsCisJYXJnKEYsIEJvYXJkLCAnVicpLAorCUcgaXMgRSsxLAorCWFyZyhHLCBCb2FyZCwgJ1YnKS4KKyUgUGVudG1pbm8gPSAnVicKKyUgTnVtYmVyID0gMworJSBDIEQgRQorJSAgICAgRgorJSAgICAgRworcGxhY2VfcGVudCgnVicsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnVicpLAorCUQgaXMgQysxLAorCWFyZyhELCBCb2FyZCwgJ1YnKSwJCisJRSBpcyBEKzEsCisJYXJnKEUsIEJvYXJkLCAnVicpLAorCUYgaXMgRStDb2wsCisJYXJnKEYsIEJvYXJkLCAnVicpLAorCUcgaXMgRitDb2wsCisJYXJnKEcsIEJvYXJkLCAnVicpLgorJSBQZW50bWlubyA9ICdWJworJSBOdW1iZXIgPSA0CislICAgICBECislICAgICBGCislIEMgRSBHCitwbGFjZV9wZW50KCdWJywgQywgQ29sLCBCb2FyZCkgOi0KKwlhcmcoQywgQm9hcmQsICdWJyksCisJRCBpcyBDLSgyKkNvbCkrMiwKKwlEID4gMCwgICAlJSUgIGFyZy8zIKTOwuiw7LD6v/SkrMnppM6/9KTLpMqk6aTKpKSkv6ThyazN1worCWFyZyhELCBCb2FyZCwgJ1YnKSwJCisJRSBpcyBDKzEsCisJYXJnKEUsIEJvYXJkLCAnVicpLAorCUYgaXMgRCtDb2wsCisJYXJnKEYsIEJvYXJkLCAnVicpLAorCUcgaXMgRSsxLAorCWFyZyhHLCBCb2FyZCwgJ1YnKS4KKyUgUGVudG1pbm8gPSAnVycKKyUgTnVtYmVyID0gMQorJSBDCislIEQgRQorJSAgIEYgRworcGxhY2VfcGVudCgnVycsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnVycpLAorCUQgaXMgQytDb2wsCisJYXJnKEQsIEJvYXJkLCAnVycpLAkKKwlFIGlzIEQrMSwKKwlhcmcoRSwgQm9hcmQsICdXJyksCisJRiBpcyBFK0NvbCwKKwlhcmcoRiwgQm9hcmQsICdXJyksCisJRyBpcyBGKzEsCisJYXJnKEcsIEJvYXJkLCAnVycpLgorJSBQZW50bWlubyA9ICdXJworJSBOdW1iZXIgPSAyCislICAgRCBHCislIEMgRgorJSBFCitwbGFjZV9wZW50KCdXJywgQywgQ29sLCBCb2FyZCkgOi0KKwlhcmcoQywgQm9hcmQsICdXJyksCisJRCBpcyBDLShDb2wtMSksCisJYXJnKEQsIEJvYXJkLCAnVycpLAkKKwlFIGlzIEMrQ29sLAorCWFyZyhFLCBCb2FyZCwgJ1cnKSwKKwlGIGlzIEMrMSwKKwlhcmcoRiwgQm9hcmQsICdXJyksCisJRyBpcyBEKzEsCisJYXJnKEcsIEJvYXJkLCAnVycpLgorJSBQZW50bWlubyA9ICdXJworJSBOdW1iZXIgPSAzCislIEMgRAorJSAgIEUgRgorJSAgICAgRworcGxhY2VfcGVudCgnVycsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnVycpLAorCUQgaXMgQysxLAorCWFyZyhELCBCb2FyZCwgJ1cnKSwJCisJRSBpcyBEK0NvbCwKKwlhcmcoRSwgQm9hcmQsICdXJyksCisJRiBpcyBFKzEsCisJYXJnKEYsIEJvYXJkLCAnVycpLAorCUcgaXMgRitDb2wsCisJYXJnKEcsIEJvYXJkLCAnVycpLgorJSBQZW50bWlubyA9ICdXJworJSBOdW1iZXIgPSA0CislICAgICBFCislICAgRCBHCislIEMgRgorcGxhY2VfcGVudCgnVycsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnVycpLAorCUQgaXMgQy0oQ29sLTEpLAorCWFyZyhELCBCb2FyZCwgJ1cnKSwJCisJRSBpcyBELShDb2wtMSksCisJYXJnKEUsIEJvYXJkLCAnVycpLAorCUYgaXMgQysxLAorCWFyZyhGLCBCb2FyZCwgJ1cnKSwKKwlHIGlzIEQrMSwKKwlhcmcoRywgQm9hcmQsICdXJykuCislIFBlbnRtaW5vID0gJ1knCislIE51bWJlciA9IDEKKyUgICAgIEUKKyUgQyBEIEYgRworcGxhY2VfcGVudCgnWScsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnWScpLAorCUQgaXMgQysxLAorCWFyZyhELCBCb2FyZCwgJ1knKSwJCisJRSBpcyBDLShDb2wtMiksCisJYXJnKEUsIEJvYXJkLCAnWScpLAorCUYgaXMgRCsxLAorCWFyZyhGLCBCb2FyZCwgJ1knKSwKKwlHIGlzIEYrMSwKKwlhcmcoRywgQm9hcmQsICdZJykuCislIFBlbnRtaW5vID0gJ1knCislIE51bWJlciA9IDIKKyUgQworJSBECislIEUgRworJSBGCitwbGFjZV9wZW50KCdZJywgQywgQ29sLCBCb2FyZCkgOi0KKwlhcmcoQywgQm9hcmQsICdZJyksCisJRCBpcyBDK0NvbCwKKwlhcmcoRCwgQm9hcmQsICdZJyksCQorCUUgaXMgRCtDb2wsCisJYXJnKEUsIEJvYXJkLCAnWScpLAorCUYgaXMgRStDb2wsCisJYXJnKEYsIEJvYXJkLCAnWScpLAorCUcgaXMgRSsxLAorCWFyZyhHLCBCb2FyZCwgJ1knKS4KKyUgUGVudG1pbm8gPSAnWScKKyUgTnVtYmVyID0gMworJSBDIEQgRiBHIAorJSAgIEUgCitwbGFjZV9wZW50KCdZJywgQywgQ29sLCBCb2FyZCkgOi0KKwlhcmcoQywgQm9hcmQsICdZJyksCisJRCBpcyBDKzEsCisJYXJnKEQsIEJvYXJkLCAnWScpLAkKKwlFIGlzIEQrQ29sLAorCWFyZyhFLCBCb2FyZCwgJ1knKSwKKwlGIGlzIEQrMSwKKwlhcmcoRiwgQm9hcmQsICdZJyksCisJRyBpcyBGKzEsCisJYXJnKEcsIEJvYXJkLCAnWScpLgorJSBQZW50bWlubyA9ICdZJworJSBOdW1iZXIgPSA0CislICAgRAorJSBDIEUKKyUgICBGCislICAgRworcGxhY2VfcGVudCgnWScsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnWScpLAorCUQgaXMgQy0oQ29sLTEpLAorCWFyZyhELCBCb2FyZCwgJ1knKSwJCisJRSBpcyBDKzEsCisJYXJnKEUsIEJvYXJkLCAnWScpLAorCUYgaXMgRStDb2wsCisJYXJnKEYsIEJvYXJkLCAnWScpLAorCUcgaXMgRitDb2wsCisJYXJnKEcsIEJvYXJkLCAnWScpLgorJSBQZW50bWlubyA9ICdZJworJSBOdW1iZXIgPSA1CislIEMKKyUgRCBGCislIEUKKyUgRworcGxhY2VfcGVudCgnWScsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnWScpLAorCUQgaXMgQytDb2wsCisJYXJnKEQsIEJvYXJkLCAnWScpLAkKKwlFIGlzIEQrQ29sLAorCWFyZyhFLCBCb2FyZCwgJ1knKSwKKwlGIGlzIEQrMSwKKwlhcmcoRiwgQm9hcmQsICdZJyksCisJRyBpcyBFK0NvbCwKKwlhcmcoRywgQm9hcmQsICdZJykuCislIFBlbnRtaW5vID0gJ1knCislIE51bWJlciA9IDYKKyUgQyBEIEUgRworJSAgICAgRgorcGxhY2VfcGVudCgnWScsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnWScpLAorCUQgaXMgQysxLAorCWFyZyhELCBCb2FyZCwgJ1knKSwJCisJRSBpcyBEKzEsCisJYXJnKEUsIEJvYXJkLCAnWScpLAorCUYgaXMgRStDb2wsCisJYXJnKEYsIEJvYXJkLCAnWScpLAorCUcgaXMgRSsxLAorCWFyZyhHLCBCb2FyZCwgJ1knKS4KKyUgUGVudG1pbm8gPSAnWScKKyUgTnVtYmVyID0gNworJSAgIEMKKyUgICBFCislIEQgRgorJSAgIEcKK3BsYWNlX3BlbnQoJ1knLCBDLCBDb2wsIEJvYXJkKSA6LQorCWFyZyhDLCBCb2FyZCwgJ1knKSwKKwlEIGlzIEMrKDIqQ29sKS0xLAorCWFyZyhELCBCb2FyZCwgJ1knKSwJCisJRSBpcyBDK0NvbCwKKwlhcmcoRSwgQm9hcmQsICdZJyksCisJRiBpcyBEKzEsCisJYXJnKEYsIEJvYXJkLCAnWScpLAorCUcgaXMgRitDb2wsCisJYXJnKEcsIEJvYXJkLCAnWScpLgorJSBQZW50bWlubyA9ICdZJworJSBOdW1iZXIgPSA4CislICAgRAorJSBDIEUgRiBHCitwbGFjZV9wZW50KCdZJywgQywgQ29sLCBCb2FyZCkgOi0KKwlhcmcoQywgQm9hcmQsICdZJyksCisJRCBpcyBDLShDb2wtMSksCisJYXJnKEQsIEJvYXJkLCAnWScpLAkKKwlFIGlzIEMrMSwKKwlhcmcoRSwgQm9hcmQsICdZJyksCisJRiBpcyBFKzEsCisJYXJnKEYsIEJvYXJkLCAnWScpLAorCUcgaXMgRisxLAorCWFyZyhHLCBCb2FyZCwgJ1knKS4KKyUgUGVudG1pbm8gPSAnWicKKyUgTnVtYmVyID0gMQorJSBDIEQKKyUgICBFCislICAgRiBHCitwbGFjZV9wZW50KCdaJywgQywgQ29sLCBCb2FyZCkgOi0KKwlhcmcoQywgQm9hcmQsICdaJyksCisJRCBpcyBDKzEsCisJYXJnKEQsIEJvYXJkLCAnWicpLAkKKwlFIGlzIEQrQ29sLAorCWFyZyhFLCBCb2FyZCwgJ1onKSwKKwlGIGlzIEUrQ29sLAorCWFyZyhGLCBCb2FyZCwgJ1onKSwKKwlHIGlzIEYrMSwKKwlhcmcoRywgQm9hcmQsICdaJykuCislIFBlbnRtaW5vID0gJ1onCislIE51bWJlciA9IDIKKyUgICAgIEYKKyUgQyBFIEcKKyUgRAorcGxhY2VfcGVudCgnWicsIEMsIENvbCwgQm9hcmQpIDotCisJYXJnKEMsIEJvYXJkLCAnWicpLAorCUQgaXMgQytDb2wsCisJYXJnKEQsIEJvYXJkLCAnWicpLAkKKwlFIGlzIEMrMSwKKwlhcmcoRSwgQm9hcmQsICdaJyksCisJRiBpcyBDLShDb2wtMiksCisJYXJnKEYsIEJvYXJkLCAnWicpLAorCUcgaXMgRSsxLAorCWFyZyhHLCBCb2FyZCwgJ1onKS4KKyUgUGVudG1pbm8gPSAnWicKKyUgTnVtYmVyID0gMworJSAgIEMgRgorJSAgIEUKKyUgRCBHCitwbGFjZV9wZW50KCdaJywgQywgQ29sLCBCb2FyZCkgOi0KKwlhcmcoQywgQm9hcmQsICdaJyksCisJRCBpcyBDKygyKkNvbCktMSwKKwlhcmcoRCwgQm9hcmQsICdaJyksCQorCUUgaXMgQytDb2wsCisJYXJnKEUsIEJvYXJkLCAnWicpLAorCUYgaXMgQysxLAorCWFyZyhGLCBCb2FyZCwgJ1onKSwKKwlHIGlzIEQrMSwKKwlhcmcoRywgQm9hcmQsICdaJykuCislIFBlbnRtaW5vID0gJ1onCislIE51bWJlciA9IDQKKyUgQworJSBEIEUgRgorJSAgICAgRworcGxhY2VfcGVudCgnWicsIEMsIENvbCwgQm9hcmQpIDotIAorCWFyZyhDLCBCb2FyZCwgJ1onKSwKKwlEIGlzIEMrQ29sLAorCWFyZyhELCBCb2FyZCwgJ1onKSwJCisJRSBpcyBEKzEsCisJYXJnKEUsIEJvYXJkLCAnWicpLAorCUYgaXMgRSsxLAorCWFyZyhGLCBCb2FyZCwgJ1onKSwKKwlHIGlzIEYrQ29sLAorCWFyZyhHLCBCb2FyZCwgJ1onKS4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlVdGlsaXRpZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitmb3IoTSwgTSwgTikgOi0gTSA9PCBOLgorZm9yKEksIE0sIE4pIDotIE0gPTwgTiwgTTEgaXMgTSArIDEsIGZvcihJLCBNMSwgTikuCisKK3BlbnRfc2VsZWN0KFgsIFtYfFhzXSwgWHMpLgorcGVudF9zZWxlY3QoWCwgW1l8WXNdLCBbWXxac10pIDotIHBlbnRfc2VsZWN0KFgsIFlzLCBacykuCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJRm9yIGFwcGxldAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGVudG9taW5vX2FwcGxldChYLCBCKSA6LQorCXNvbHZlX3BlbnRvbWlubyhYLCBCMCksCisJcmVtb3ZlX2FzdGVyaXNrKEIwLCBCKS4KKworcmVtb3ZlX2FzdGVyaXNrKEIwLCBCKSA6LQorCUIwID0uLiBbX3xBc10sCisJcm1fYXN0ZXIoQXMsIEIpLgorCitybV9hc3RlcihbXSwgW10pIDotICEuCitybV9hc3RlcihbQXxBc10sIFBzKSA6LSBBID09ICcqJywgISwKKwlybV9hc3RlcihBcyxQcykuCitybV9hc3RlcihbQXxBc10sIFtBfFBzXSkgOi0gCisJcm1fYXN0ZXIoQXMsUHMpLgorCQorCQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvcHJvbG9nL3F1ZWVucy5wbCBiL2V4YW1wbGVzL3Byb2xvZy9xdWVlbnMucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4NmEyZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Byb2xvZy9xdWVlbnMucGwKQEAgLTAsMCArMSw1NyBAQAorJSBGaWxlICAgOiBxdWVlbnMucGwKKyUgVXBkYXRlZDogMTQgRmVicnVhcnkgMjAwOAorJSBQdXJwb3NlOiBOLVF1ZWVuIFB1enpsZSAocG9zZWQgYnkgRnJhbnogTmF1Y2gsIDE4NTApCisKK21haW4gOi0KKwl3cml0ZSgnTi1RdWVlbiBQdXp6bGUgKHBvc2VkIGJ5IEZyYW56IE5hdWNoLCAxODUwKSAnKSwgbmwsCisJd3JpdGUoJ04gPSAnKSwKKwlmbHVzaF9vdXRwdXQsCisJcmVhZChOKSwKKwlOID49IDQsCisJcmVhZF95bignQWxsIHNvbHV0aW9ucyAoeS9uKT8gJywgQWxsKSwKKwlyZWFkX3luKCdPdXRwdXQgKHkvbik/ICcsIE91dHB1dCksCisJc3RhdGlzdGljcyhydW50aW1lLCBfKSwKKwlxdWVlbl9zb2x2ZShOLCBhbGwoQWxsKSwgb3V0cHV0KE91dHB1dCkpLAorCXN0YXRpc3RpY3MocnVudGltZSwgW18sVF0pLAorCXdyaXRlKCdDUFUgdGltZSA9ICcpLCB3cml0ZShUKSwgd3JpdGUoJyBtc2VjJyksIG5sLgorCityZWFkX3luKE1lc3NhZ2UsIFlOKSA6LQorCXdyaXRlKE1lc3NhZ2UpLAorCWZsdXNoX291dHB1dCwKKwlyZWFkKFgpLAorCShYID09ICd5JyAtPiBZTiA9IHllczsgWU4gPSBubykuCisKK3F1ZWVuX3NvbHZlKE4sIGFsbChYKSwgb3V0cHV0KFkpKSA6LQorCXF1ZWVucyhOLCBRKSwKKwkoWSA9PSB5ZXMgLT4gd3JpdGUoUSksIG5sOyB0cnVlKSwKKwlYID09IG5vLAorCSEuCitxdWVlbl9zb2x2ZShfLF8sXykuCisKK3F1ZWVucyhOLFFzKSA6LQorCXJhbmdlKDEsTixOcyksCisJcXVlZW5zKE5zLFtdLFFzKS4KKworcXVlZW5zKFtdLFFzLFFzKS4KK3F1ZWVucyhVbnBsYWNlZFFzLFNhZmVRcyxRcykgOi0KKwlzZWxlY3QoVW5wbGFjZWRRcyxVbnBsYWNlZFFzMSxRKSwKKwlub3RfYXR0YWNrKFNhZmVRcyxRKSwKKwlxdWVlbnMoVW5wbGFjZWRRczEsW1F8U2FmZVFzXSxRcykuCisKK25vdF9hdHRhY2soWHMsWCkgOi0KKwlub3RfYXR0YWNrKFhzLFgsMSkuCisKK25vdF9hdHRhY2soW10sXyxfKSA6LSAhLgorbm90X2F0dGFjayhbWXxZc10sWCxOKSA6LQorCVggPVw9IFkrTiwgWCA9XD0gWS1OLAorCU4xIGlzIE4rMSwKKwlub3RfYXR0YWNrKFlzLFgsTjEpLgorCitzZWxlY3QoW1h8WHNdLFhzLFgpLgorc2VsZWN0KFtZfFlzXSxbWXxac10sWCkgOi0gc2VsZWN0KFlzLFpzLFgpLgorCityYW5nZShOLE4sW05dKSA6LSAhLgorcmFuZ2UoTSxOLFtNfE5zXSkgOi0KKwlNIDwgTiwKKwlNMSBpcyBNKzEsCisJcmFuZ2UoTTEsTixOcykuCmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGF0b21fdHlwZTBfMi5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRhdG9tX3R5cGUwXzIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTAxNzU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRhdG9tX3R5cGUwXzIuamF2YQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCAganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisvKioKKyAqIDxjb2RlPickYXRvbV90eXBlMCcvMjwvY29kZT48YnI+CisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyAqLworY2xhc3MgUFJFRF8kYXRvbV90eXBlMF8yIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICBUZXJtIGFyZzEsIGFyZzI7CisKKyAgICBwdWJsaWMgUFJFRF8kYXRvbV90eXBlMF8yKFRlcm0gYTEsIFRlcm0gYTIsIFByZWRpY2F0ZSBjb250KXsgCisJYXJnMSA9IGExOworCWFyZzIgPSBhMjsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEXyRhdG9tX3R5cGUwXzIoKXt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpeworCWFyZzEgPSBhcmdzWzBdOworCWFyZzIgPSBhcmdzWzFdOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDI7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiAiJGF0b21fdHlwZTAoIiArIGFyZzEgKyAiLCAiICsgYXJnMiArICIpIjsgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisJVGVybSBhMSwgYTI7CisJaW50IHR5cGU7CisJYTEgPSBhcmcxOworCWEyID0gYXJnMjsKKworCWExID0gYTEuZGVyZWZlcmVuY2UoKTsKKwlpZighIGExLmlzU3ltYm9sKCkpCisJICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOworCXR5cGUgPSBUb2tlbi5nZXRTdHJpbmdUeXBlKCgoU3ltYm9sVGVybSlhMSkubmFtZSgpKTsKKwlpZighIGEyLnVuaWZ5KG5ldyBJbnRlZ2VyVGVybSh0eXBlKSwgZW5naW5lLnRyYWlsKSkgCisJICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOworCXJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kYmVnaW5fZXhjZXB0aW9uXzEuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kYmVnaW5fZXhjZXB0aW9uXzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjFiYTg1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRiZWdpbl9leGNlcHRpb25fMS5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKKy8qKgorICogPGNvZGU+JyRiZWdpbl9leGNlcHRpb24nLzE8L2NvZGU+PGJyPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4yCisgKi8KK2NsYXNzIFBSRURfJGJlZ2luX2V4Y2VwdGlvbl8xIGV4dGVuZHMgQmxvY2tQcmVkaWNhdGUgeworICAgIFRlcm0gYXJnMTsKKworICAgIHB1YmxpYyBQUkVEXyRiZWdpbl9leGNlcHRpb25fMShUZXJtIGExLCBQcmVkaWNhdGUgY29udCkgeworCWFyZzEgPSBhMTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEXyRiZWdpbl9leGNlcHRpb25fMSgpIHt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpeworCWFyZzEgPSBhcmdzWzBdOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDE7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiAiJGJlZ2luX2V4Y2VwdGlvbigiICsgYXJnMSArICIpIjsgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisJVGVybSBhMTsKKwlhMSA9IGFyZzE7CisKKwlpZiAoISBhMS51bmlmeShuZXcgSmF2YU9iamVjdFRlcm0odGhpcyksIGVuZ2luZS50cmFpbCkpCisJICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOworCVByZWRpY2F0ZSBjb2RlID0gY29udDsKKwlpbnQgQiA9IGVuZ2luZS5zdGFjay50b3AoKTsKKwl0aGlzLm91dE9mU2NvcGUgPSBmYWxzZTsKKwl0aGlzLm91dE9mTG9vcCAgPSBmYWxzZTsKKwllbmdpbmUudHJhaWwucHVzaChuZXcgT3V0T2ZMb29wKHRoaXMpKTsKKworCXRyeSB7CisJICAgIG1haW5fbG9vcDp3aGlsZSh0cnVlKSB7CisJCXdoaWxlIChlbmdpbmUuZXhjZXB0aW9uUmFpc2VkID09IDApIHsKKwkJICAgIGlmIChlbmdpbmUuY29udHJvbC50aHJlYWQgPT0gbnVsbCkKKwkJCWJyZWFrIG1haW5fbG9vcDsKKwkJICAgIGlmIChvdXRPZkxvb3ApCisJCQlicmVhayBtYWluX2xvb3A7CisJCSAgICBjb2RlID0gY29kZS5leGVjKGVuZ2luZSk7CisJCX0KKwkJc3dpdGNoIChlbmdpbmUuZXhjZXB0aW9uUmFpc2VkKSB7CisJCWNhc2UgMTogIC8vIGhhbHQvMAorCQkgICAgYnJlYWsgbWFpbl9sb29wOworCQljYXNlIDI6ICAvLyBmcmVlemUvMgorCQkgICAgdGhyb3cgbmV3IFN5c3RlbUV4Y2VwdGlvbigiZnJlZXplLzIgaXMgbm90IHN1cHBvcnRlZCB5ZXQiKTsKKwkJICAgIC8vIERvIHNvbWV0aGluZyBoZXJlCisgICAgICAgICAgICAgICAgICAgIC8vIGVuZ2luZS5leGNlcHRpb25SYWlzZWQgPSAwIDsKKwkJICAgIC8vIGJyZWFrCisJCWRlZmF1bHQ6CisJCSAgICBicmVhayBtYWluX2xvb3A7CisJCX0KKwkgICAgfQorCX0gY2F0Y2ggKFByb2xvZ0V4Y2VwdGlvbiBlKSB7CisJICAgIGlmIChvdXRPZlNjb3BlKQorCQl0aHJvdyBlOworCSAgICBlbmdpbmUuc2V0RXhjZXB0aW9uKGVuZ2luZS5jb3B5KGUuZ2V0TWVzc2FnZVRlcm0oKSkpOworCSAgICBlbmdpbmUuY3V0KEIpOworCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKwl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCSAgICBpZiAob3V0T2ZTY29wZSkKKwkJdGhyb3cgbmV3IEphdmFFeGNlcHRpb24oZSk7CisJICAgIGVuZ2luZS5zZXRFeGNlcHRpb24obmV3IEphdmFPYmplY3RUZXJtKGUpKTsKKwkgICAgZW5naW5lLmN1dChCKTsKKwkgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJfQorCXJldHVybiBjb2RlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kYmVnaW5fc3luY18yLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGJlZ2luX3N5bmNfMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOTJhNjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGJlZ2luX3N5bmNfMi5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCAganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisvKioKKyAqIDxjb2RlPickYmVnaW5fc3luYycvMjwvY29kZT4KKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMgorICovCitjbGFzcyBQUkVEXyRiZWdpbl9zeW5jXzIgZXh0ZW5kcyBCbG9ja1ByZWRpY2F0ZSB7CisgICAgVGVybSBhcmcxLCBhcmcyOworCisgICAgcHVibGljIFBSRURfJGJlZ2luX3N5bmNfMihUZXJtIGExLCBUZXJtIGEyLCBQcmVkaWNhdGUgY29udCkgeworCWFyZzEgPSBhMTsKKwlhcmcyID0gYTI7CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisgICAgcHVibGljIFBSRURfJGJlZ2luX3N5bmNfMigpIHt9CisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KXsKKwlhcmcxID0gYXJnc1swXTsKKwlhcmcyID0gYXJnc1sxXTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAyOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gIiRiZWdpbl9zeW5jKCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIpIjsgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisJVGVybSBhMSwgYTI7CisJYTEgPSBhcmcxOworCWEyID0gYXJnMjsKKworCU9iamVjdCBvID0gbnVsbDsKKwlQcmVkaWNhdGUgY29kZSA9IG51bGw7CisKKwkvLyAxc3QuIGFyZ3VtZW50CisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOworCWlmIChhMS5pc1ZhcmlhYmxlKCkpCisJICAgIHRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAxKTsKKwlpZiAoISBhMS5pc0phdmFPYmplY3QoKSkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDEsICJqYXZhIiwgYTEpOworCW8gPSAoKEphdmFPYmplY3RUZXJtKWExKS5vYmplY3QoKTsKKwkvLyAybmQuIGFyZ3VtZW50CisJYTIgPSBhMi5kZXJlZmVyZW5jZSgpOworCWlmICghIGEyLmlzVmFyaWFibGUoKSkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJ2YXJpYWJsZSIsIGExKTsKKwkoKFZhcmlhYmxlVGVybSkgYTIpLmJpbmQobmV3IEphdmFPYmplY3RUZXJtKHRoaXMpLCBlbmdpbmUudHJhaWwpOworCS8vCisJY29kZSA9IGNvbnQ7CisJdGhpcy5vdXRPZlNjb3BlID0gZmFsc2U7CisJdGhpcy5vdXRPZkxvb3AgID0gZmFsc2U7CisJZW5naW5lLnRyYWlsLnB1c2gobmV3IE91dE9mTG9vcCh0aGlzKSk7CisJbWFpbl9sb29wOndoaWxlKHRydWUpIHsKKwkgICAgc3luY2hyb25pemVkIChvKSB7CisJCXdoaWxlICghIG91dE9mU2NvcGUpIHsKKwkJICAgIGlmIChlbmdpbmUuZXhjZXB0aW9uUmFpc2VkICE9IDApIHsKKwkJCXN3aXRjaCAoZW5naW5lLmV4Y2VwdGlvblJhaXNlZCkgeworCQkJY2FzZSAxOiAgLy8gaGFsdC8wCisJCQkgICAgYnJlYWsgbWFpbl9sb29wOworCQkJY2FzZSAyOiAgLy8gZnJlZXplLzIKKwkJCSAgICB0aHJvdyBuZXcgU3lzdGVtRXhjZXB0aW9uKCJmcmVlemUvMiBpcyBub3Qgc3VwcG9ydGVkIHlldCIpOworCQkJICAgIC8vIERvIHNvbWV0aGluZyBoZXJlCisJCQkgICAgLy8gZW5naW5lLmV4Y2VwdGlvblJhaXNlZCA9IDAgOworCQkJICAgIC8vIGJyZWFrCisJCQlkZWZhdWx0OgorCQkJICAgIGJyZWFrIG1haW5fbG9vcDsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGlmIChlbmdpbmUuY29udHJvbC50aHJlYWQgPT0gbnVsbCkKKwkJCWJyZWFrIG1haW5fbG9vcDsKKwkJICAgIGlmIChvdXRPZkxvb3ApCisJCQlicmVhayBtYWluX2xvb3A7CisJCSAgICBjb2RlID0gY29kZS5leGVjKGVuZ2luZSk7CisJCX0KKworCSAgICB9CisJICAgIHdoaWxlIChvdXRPZlNjb3BlKSB7CisJCWlmIChlbmdpbmUuZXhjZXB0aW9uUmFpc2VkICE9IDApIHsKKwkJICAgIHN3aXRjaCAoZW5naW5lLmV4Y2VwdGlvblJhaXNlZCkgeworCQkgICAgY2FzZSAxOiAgLy8gaGFsdC8wCisJCQlicmVhayBtYWluX2xvb3A7CisJCSAgICBjYXNlIDI6ICAvLyBmcmVlemUvMgorCQkJdGhyb3cgbmV3IFN5c3RlbUV4Y2VwdGlvbigiZnJlZXplLzIgaXMgbm90IHN1cHBvcnRlZCB5ZXQiKTsKKwkJCS8vIERvIHNvbWV0aGluZyBoZXJlCisJCQkvLyBlbmdpbmUuZXhjZXB0aW9uUmFpc2VkID0gMCA7CisJCQkvLyBicmVhaworCQkgICAgZGVmYXVsdDoKKwkJCWJyZWFrIG1haW5fbG9vcDsKKwkJICAgIH0KKwkJfQorCQlpZiAoZW5naW5lLmNvbnRyb2wudGhyZWFkID09IG51bGwpCisJCSAgICBicmVhayBtYWluX2xvb3A7CisJCWlmIChvdXRPZkxvb3ApCisJCSAgICBicmVhayBtYWluX2xvb3A7CisJCWNvZGUgPSBjb2RlLmV4ZWMoZW5naW5lKTsKKwkgICAgfQorCisJfQorCXJldHVybiBjb2RlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kY2FsbF8yLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGNhbGxfMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MjdkMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGNhbGxfMi5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOworLyoqCisgKiA8Y29kZT4nJGNhbGwnLzI8L2NvZGU+PGJyPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK2NsYXNzIFBSRURfJGNhbGxfMiBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgVGVybSBhcmcxLCBhcmcyOworICAgIFByZWRpY2F0ZSBjb250OworICAgIHB1YmxpYyBzdGF0aWMgU3ltYm9sVGVybSBTWU1fU0xBU0hfMiA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiLyIsIDIpOworCisgICAgcHVibGljIFBSRURfJGNhbGxfMigpIHt9CisgICAgcHVibGljIFBSRURfJGNhbGxfMihUZXJtIGExLCBUZXJtIGEyLCBQcmVkaWNhdGUgY29udCkgeworCWFyZzEgPSBhMTsKKwlhcmcyID0gYTI7CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtIGFyZ3NbXSwgUHJlZGljYXRlIGNvbnQpIHsKKwlhcmcxID0gYXJnc1swXTsKKwlhcmcyID0gYXJnc1sxXTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAyOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gIiRjYWxsKCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIpIjsgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisJVGVybSBhMSwgYTI7CisJYTEgPSBhcmcxLmRlcmVmZXJlbmNlKCk7IC8vIGExIG11c3QgYmUgYXRvbSBvZiBwYWNrYWdlIG5hbWUKKwlhMiA9IGFyZzIuZGVyZWZlcmVuY2UoKTsgLy8gYTIgbXVzdCBiZSBjYWxsYWJsZSBuYW1lCisKKwlTdHJpbmcgZnVuY3RvcjsKKwlpbnQgYXJpdHk7CisJVGVybVtdIGFyZ3M7CisJQ2xhc3MgY2xheno7CisJQ29uc3RydWN0b3IgY29uc3RyOworCVByZWRpY2F0ZSBwcmVkOworCisJdHJ5IHsKKwkgICAgaWYgKCEgYTEuaXNTeW1ib2woKSkKKwkJdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDEsICJhdG9tIiwgYTEpOworCSAgICBpZiAoYTIuaXNTeW1ib2woKSkgeworCQlmdW5jdG9yID0gKChTeW1ib2xUZXJtKWEyKS5uYW1lKCk7CisJCWFyZ3MgICAgPSBudWxsOworCQlhcml0eSAgID0gMDsKKwkgICAgfSBlbHNlIGlmIChhMi5pc1N0cnVjdHVyZSgpKSB7CisJCWZ1bmN0b3IgPSAoKFN0cnVjdHVyZVRlcm0pYTIpLmZ1bmN0b3IoKS5uYW1lKCk7CisJCWFyZ3MgICAgPSAoKFN0cnVjdHVyZVRlcm0pYTIpLmFyZ3MoKTsKKwkJYXJpdHkgICA9ICgoU3RydWN0dXJlVGVybSlhMikuYXJpdHkoKTsKKwkgICAgfSBlbHNlIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJjYWxsYWJsZSIsIGEyKTsKKwkgICAgfQorCSAgICB0cnkgeworCQljbGF6eiA9IGVuZ2luZS5wY2wubG9hZFByZWRpY2F0ZUNsYXNzKCgoU3ltYm9sVGVybSlhMSkubmFtZSgpLCBmdW5jdG9yLCBhcml0eSwgdHJ1ZSk7CisJICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQl0cnkgeworCQkgICAgY2xhenogPSBlbmdpbmUucGNsLmxvYWRQcmVkaWNhdGVDbGFzcygianAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluIiwgZnVuY3RvciwgYXJpdHksIHRydWUpOworCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGVlKSB7CisJCSAgICBpZiAoKGVuZ2luZS5nZXRVbmtub3duKCkpLmVxdWFscygiZmFpbCIpKQorCQkJcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJCSAgICBUZXJtW10gZmEgPSB7U3ltYm9sVGVybS5tYWtlU3ltYm9sKGZ1bmN0b3IpLCBuZXcgSW50ZWdlclRlcm0oYXJpdHkpfTsKKwkJICAgIHRocm93IG5ldyBFeGlzdGVuY2VFeGNlcHRpb24odGhpcywgMCwgInByb2NlZHVyZSIsIG5ldyBTdHJ1Y3R1cmVUZXJtKFNZTV9TTEFTSF8yLCBmYSksICIiKTsKKwkJfQorCSAgICB9CisJICAgIGNvbnN0ciA9IGNsYXp6LmdldENvbnN0cnVjdG9yKCk7CisJICAgIGNvbnN0ci5zZXRBY2Nlc3NpYmxlKHRydWUpOworCSAgICBwcmVkID0gKFByZWRpY2F0ZSljb25zdHIubmV3SW5zdGFuY2UoKTsKKwkgICAgcHJlZC5zZXRBcmd1bWVudChhcmdzLCBjb250KTsKKwkgICAgcmV0dXJuIHByZWQ7CisJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKwkgICAgdGhyb3cgbmV3IFN5c3RlbUV4Y2VwdGlvbihlLnRvU3RyaW5nKCkgKyAiIGluICIgKyB0aGlzLnRvU3RyaW5nKCkpOworCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworCSAgICB0aHJvdyBuZXcgU3lzdGVtRXhjZXB0aW9uKGUudG9TdHJpbmcoKSArICIgaW4gIiArIHRoaXMudG9TdHJpbmcoKSk7CisJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisJICAgIHRocm93IG5ldyBTeXN0ZW1FeGNlcHRpb24oZS50b1N0cmluZygpICsgIiBpbiAiICsgdGhpcy50b1N0cmluZygpKTsKKwl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisJICAgIHRocm93IG5ldyBTeXN0ZW1FeGNlcHRpb24oZS50b1N0cmluZygpICsgIiBpbiAiICsgdGhpcy50b1N0cmluZygpKTsKKwl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCSAgICB0aHJvdyBuZXcgU3lzdGVtRXhjZXB0aW9uKGUudG9TdHJpbmcoKSArICIgaW4gIiArIHRoaXMudG9TdHJpbmcoKSk7CisJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisJICAgIHRocm93IG5ldyBTeXN0ZW1FeGNlcHRpb24oZS50b1N0cmluZygpICsgIiBpbiAiICsgdGhpcy50b1N0cmluZygpKTsKKwl9CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kY2FsbF9jbG9zdXJlXzEuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kY2FsbF9jbG9zdXJlXzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjE1MjA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRjYWxsX2Nsb3N1cmVfMS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKKy8qKgorICogPGNvZGU+JyRjYWxsX2Nsb3N1cmUnLzE8L2NvZGU+PGJyPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK2NsYXNzIFBSRURfJGNhbGxfY2xvc3VyZV8xIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICBUZXJtIGFyZzE7CisgICAgUHJlZGljYXRlIGNvbnQ7CisKKyAgICBwdWJsaWMgUFJFRF8kY2FsbF9jbG9zdXJlXzEoVGVybSBhMSwgUHJlZGljYXRlIGNvbnQpIHsKKwlhcmcxID0gYTE7CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF8kY2FsbF9jbG9zdXJlXzEoKSB7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybSBhcmdzW10sIFByZWRpY2F0ZSBjb250KSB7CisJYXJnMSA9IGFyZ3NbMF07CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMTsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlyZXR1cm4gIiRjYWxsX2Nsb3N1cmUoIiArIGFyZzEgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisJVGVybSBhMTsKKwlQcmVkaWNhdGUgY29kZTsKKworCS8vIGExIG11c3QgYmUgY2xvc3VyZQorCWExID0gYXJnMS5kZXJlZmVyZW5jZSgpOworCisJaWYgKCEgYTEuaXNDbG9zdXJlKCkpCisJICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOworCWNvZGUgPSAoKENsb3N1cmVUZXJtKSBhMSkuZ2V0Q29kZSgpOworCWNvZGUuY29udCA9IHRoaXMuY29udDsKKwlyZXR1cm4gY29kZTsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRjdXRfMS5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRjdXRfMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4Yzc1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGN1dF8xLmphdmEKQEAgLTAsMCArMSw0MyBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisvKioKKyA8Y29kZT4nJGN1dCcvMTwvY29kZT48YnI+CisgQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyBAdmVyc2lvbiAxLjAKKyovCitwdWJsaWMgY2xhc3MgUFJFRF8kY3V0XzEgZXh0ZW5kcyBQcmVkaWNhdGUgeworCisgICAgcHVibGljIFRlcm0gYXJnMTsKKworICAgIHB1YmxpYyBQUkVEXyRjdXRfMShUZXJtIGExLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYTE7CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfJGN1dF8xKCl7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhcmdzWzBdOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAxOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIiRjdXQoIiArIGFyZzEgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKwkvLyAgICAgICAgZW5naW5lLnNldEIwKCk7IAorICAgICAgICBUZXJtIGExOworICAgICAgICBhMSA9IGFyZzE7CisgICAgICAgIGExID0gYTEuZGVyZWZlcmVuY2UoKTsKKyAgICAgICAgaWYgKCEgYTEuaXNJbnRlZ2VyKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbigiaW50ZWdlciIsIGExKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVuZ2luZS5jdXQoKChJbnRlZ2VyVGVybSkgYTEpLmludFZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kZW5kX2V4Y2VwdGlvbl8xLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGVuZF9leGNlcHRpb25fMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NmM3M2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGVuZF9leGNlcHRpb25fMS5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKKy8qKgorICogPGNvZGU+JyRlbmRfZXhjZXB0aW9uJy8xPGNvZGU+PGJyPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK2NsYXNzIFBSRURfJGVuZF9leGNlcHRpb25fMSBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgVGVybSBhcmcxOworCisgICAgcHVibGljIFBSRURfJGVuZF9leGNlcHRpb25fMShUZXJtIGExLCBQcmVkaWNhdGUgY29udCkgeworCWFyZzEgPSBhMTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEXyRlbmRfZXhjZXB0aW9uXzEoKSB7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KXsKKwlhcmcxID0gYXJnc1swXTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAxOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gIiRlbmRfZXhjZXB0aW9uKCIgKyBhcmcxICsgIikiOyB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKwlUZXJtIGExOworCWExID0gYXJnMTsKKworCWExID0gYTEuZGVyZWZlcmVuY2UoKTsKKwlpZiAoISBhMS5pc0phdmFPYmplY3QoKSkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDEsICJqYXZhIiwgYTEpOworCU9iamVjdCBvYmogPSAoKEphdmFPYmplY3RUZXJtKWExKS5vYmplY3QoKTsKKwlpZiAoISAob2JqIGluc3RhbmNlb2YgUFJFRF8kYmVnaW5fZXhjZXB0aW9uXzEpKQorCSAgICB0aHJvdyBuZXcgU3lzdGVtRXhjZXB0aW9uKCJhMSBtdXN0IGJlIGFuIG9iamVjdCBvZiBQUkVEXyRiZWdpbl9leGNlcHRpb25fMTogIiArIHRoaXMudG9TdHJpbmcoKSk7CisJUFJFRF8kYmVnaW5fZXhjZXB0aW9uXzEgcCA9ICgoUFJFRF8kYmVnaW5fZXhjZXB0aW9uXzEpIG9iaik7CisJcC5vdXRPZlNjb3BlID0gdHJ1ZTsKKwllbmdpbmUudHJhaWwucHVzaChuZXcgT3V0T2ZTY29wZShwKSk7CisJcmV0dXJuIGNvbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRlbmRfc3luY18xLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGVuZF9zeW5jXzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTM5NDljCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRlbmRfc3luY18xLmphdmEKQEAgLTAsMCArMSw0MyBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQgIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworLyoqCisgKiA8Y29kZT4nJGVuZF9zeW5jJy8xPC9jb2RlPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK2NsYXNzIFBSRURfJGVuZF9zeW5jXzEgZXh0ZW5kcyBQcmVkaWNhdGUgeworICAgIFRlcm0gYXJnMTsKKworICAgIHB1YmxpYyBQUkVEXyRlbmRfc3luY18xKFRlcm0gYTEsIFByZWRpY2F0ZSBjb250KSB7CisJYXJnMSA9IGExOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorICAgIHB1YmxpYyBQUkVEXyRlbmRfc3luY18xKCkge30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCl7CisJYXJnMSA9IGFyZ3NbMF07CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMTsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuICIkZW5kX3N5bmMoIiArIGFyZzEgKyAiKSI7IH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworCVRlcm0gYTE7CisJYTEgPSBhcmcxOworCisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOworCWlmICghIGExLmlzSmF2YU9iamVjdCgpKQorCSAgICB0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMSwgImphdmEiLCBhMSk7CisJT2JqZWN0IG9iaiA9ICgoSmF2YU9iamVjdFRlcm0pYTEpLm9iamVjdCgpOworCWlmICghIChvYmogaW5zdGFuY2VvZiBQUkVEXyRiZWdpbl9zeW5jXzIpKQorCSAgICB0aHJvdyBuZXcgU3lzdGVtRXhjZXB0aW9uKCJhMSBtdXN0IGJlIGFuIG9iamVjdCBvZiBQUkVEXyRiZWdpbl9zeW5jXzI6ICIgKyB0aGlzKTsKKwlQUkVEXyRiZWdpbl9zeW5jXzIgcCA9ICgoUFJFRF8kYmVnaW5fc3luY18yKSBvYmopOworCXAub3V0T2ZTY29wZSA9IHRydWU7CisJZW5naW5lLnRyYWlsLnB1c2gobmV3IE91dE9mU2NvcGUocCkpOworCXJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kZXJhc2VfMS5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRlcmFzZV8xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3MDc1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kZXJhc2VfMS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKKy8qKgorICogPGNvZGU+JyRlcmFzZScvMTwvY29kZT48YnI+CisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjEKKyAqLworY2xhc3MgUFJFRF8kZXJhc2VfMSBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgIFRlcm0gYXJnMTsKKworICAgIHB1YmxpYyBQUkVEXyRlcmFzZV8xKFRlcm0gYTEsIFByZWRpY2F0ZSBjb250KSB7CisJYXJnMSA9IGExOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfJGVyYXNlXzEoKSB7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KXsKKwlhcmcxID0gYXJnc1swXTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAxOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gIiRlcmFzZSgiICsgYXJnMSArICIpIjsgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisJVGVybSBhMSA9IGFyZzE7CisJaW50IGlkeDsKKworCWExID0gYTEuZGVyZWZlcmVuY2UoKTsKKwlpZiAoISBhMS5pc0ludGVnZXIoKSkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDEsICJpbnRlZ2VyIiwgYTEpOworCWlkeCA9ICgoSW50ZWdlclRlcm0pYTEpLmludFZhbHVlKCk7CisJZW5naW5lLmludGVybmFsREIuZXJhc2UoaWR4KTsKKwlyZXR1cm4gY29udDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGZhc3Rfd3JpdGVfMS5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRmYXN0X3dyaXRlXzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWI1MzEwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRmYXN0X3dyaXRlXzEuamF2YQpAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCAganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisvKioKKyAqIDxjb2RlPickZmFzdF93cml0ZScvMTwvY29kZT48YnI+CisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIFBSRURfJGZhc3Rfd3JpdGVfMSBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgVGVybSBhcmcxOworCisgICAgcHVibGljIFBSRURfJGZhc3Rfd3JpdGVfMShUZXJtIGExLCBQcmVkaWNhdGUgY29udCkgeworCWFyZzEgPSBhMTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKyAgICBwdWJsaWMgUFJFRF8kZmFzdF93cml0ZV8xKCkge30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCl7CisJYXJnMSA9IGFyZ3NbMF07CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMTsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuICIkZmFzdF93cml0ZSgiICsgYXJnMSArICIpIjsgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisJVGVybSBhMTsKKwlhMSA9IGFyZzEuZGVyZWZlcmVuY2UoKTsKKwllbmdpbmUuZ2V0Q3VycmVudE91dHB1dCgpLnByaW50KGExLnRvU3RyaW5nKCkpOworCXJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kZmFzdF93cml0ZV8yLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGZhc3Rfd3JpdGVfMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZDdlZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGZhc3Rfd3JpdGVfMi5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworLyoqCisgKiA8Y29kZT4nJGZhc3Rfd3JpdGUnLzI8L2NvZGU+PGJyPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBQUkVEXyRmYXN0X3dyaXRlXzIgZXh0ZW5kcyBQcmVkaWNhdGUgeworICAgIFRlcm0gYXJnMSwgYXJnMjsKKworICAgIHB1YmxpYyBQUkVEXyRmYXN0X3dyaXRlXzIoVGVybSBhMSwgVGVybSBhMiwgUHJlZGljYXRlIGNvbnQpIHsKKwlhcmcxID0gYTE7CisJYXJnMiA9IGEyOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfJGZhc3Rfd3JpdGVfMigpIHt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpeworCWFyZzEgPSBhcmdzWzBdOworCWFyZzIgPSBhcmdzWzFdOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDI7fQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuICIkZmFzdF93cml0ZSgiICsgYXJnMSArICIsICIgKyBhcmcyICsgIikiOyB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKwlUZXJtIGExLCBhMjsKKyAgICAgICAgYTEgPSBhcmcxOworICAgICAgICBhMiA9IGFyZzI7CisJT2JqZWN0IHN0cmVhbSA9IG51bGw7CisKKwkvLyBTX29yX2EKKwlhMSA9IGExLmRlcmVmZXJlbmNlKCk7IAorCWlmIChhMS5pc1ZhcmlhYmxlKCkpIHsKKwkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDEpOworCX0gZWxzZSBpZiAoYTEuaXNTeW1ib2woKSkgeworCSAgICBpZiAoISBlbmdpbmUuZ2V0U3RyZWFtTWFuYWdlcigpLmNvbnRhaW5zS2V5KGExKSkKKwkJdGhyb3cgbmV3IEV4aXN0ZW5jZUV4Y2VwdGlvbih0aGlzLCAxLCAic3RyZWFtIiwgYTEsICIiKTsKKwkgICAgc3RyZWFtID0gKChKYXZhT2JqZWN0VGVybSkgZW5naW5lLmdldFN0cmVhbU1hbmFnZXIoKS5nZXQoYTEpKS5vYmplY3QoKTsKKwl9IGVsc2UgaWYgKGExLmlzSmF2YU9iamVjdCgpKSB7CisJICAgIHN0cmVhbSA9ICgoSmF2YU9iamVjdFRlcm0pIGExKS5vYmplY3QoKTsKKwl9IGVsc2UgeworCSAgICB0aHJvdyBuZXcgSWxsZWdhbERvbWFpbkV4Y2VwdGlvbih0aGlzLCAxLCAic3RyZWFtX29yX2FsaWFzIiwgYTEpOworCX0KKwlpZiAoISAoc3RyZWFtIGluc3RhbmNlb2YgUHJpbnRXcml0ZXIpKQorCSAgICB0aHJvdyBuZXcgUGVybWlzc2lvbkV4Y2VwdGlvbih0aGlzLCAib3V0cHV0IiwgInN0cmVhbSIsIGExLCAiIik7CisJLy8gcHJpbnQgdGVybQorCSgoUHJpbnRXcml0ZXIpIHN0cmVhbSkucHJpbnQoYTIuZGVyZWZlcmVuY2UoKS50b1N0cmluZygpKTsKKwlyZXR1cm4gY29udDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGZhc3Rfd3JpdGVxXzEuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kZmFzdF93cml0ZXFfMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZjBiZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGZhc3Rfd3JpdGVxXzEuamF2YQpAQCAtMCwwICsxLDM1IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCAganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisvKioKKyAqIDxjb2RlPickZmFzdF93cml0ZXEnLzE8L2NvZGU+PGJyPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBQUkVEXyRmYXN0X3dyaXRlcV8xIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICBUZXJtIGFyZzE7CisKKyAgICBwdWJsaWMgUFJFRF8kZmFzdF93cml0ZXFfMShUZXJtIGExLCBQcmVkaWNhdGUgY29udCkgeworCWFyZzEgPSBhMTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEXyRmYXN0X3dyaXRlcV8xKCkge30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCl7CisJYXJnMSA9IGFyZ3NbMF07CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMTsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuICIkZmFzdF93cml0ZXEoIiArIGFyZzEgKyAiKSI7IH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworCVRlcm0gYTE7CisJYTEgPSBhcmcxLmRlcmVmZXJlbmNlKCk7CisJZW5naW5lLmdldEN1cnJlbnRPdXRwdXQoKS5wcmludChhMS50b1F1b3RlZFN0cmluZygpKTsKKwlyZXR1cm4gY29udDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGZhc3Rfd3JpdGVxXzIuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kZmFzdF93cml0ZXFfMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NTgyNDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGZhc3Rfd3JpdGVxXzIuamF2YQpAQCAtMCwwICsxLDU2IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCAganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKy8qKgorICogPGNvZGU+JyRmYXN0X3dyaXRlcScvMjwvY29kZT48YnI+CisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIFBSRURfJGZhc3Rfd3JpdGVxXzIgZXh0ZW5kcyBQcmVkaWNhdGUgeworICAgIFRlcm0gYXJnMSwgYXJnMjsKKworICAgIHB1YmxpYyBQUkVEXyRmYXN0X3dyaXRlcV8yKFRlcm0gYTEsIFRlcm0gYTIsIFByZWRpY2F0ZSBjb250KSB7CisJYXJnMSA9IGExOworCWFyZzIgPSBhMjsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKyAgICBwdWJsaWMgUFJFRF8kZmFzdF93cml0ZXFfMigpIHt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpeworCWFyZzEgPSBhcmdzWzBdOworCWFyZzIgPSBhcmdzWzFdOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDI7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiAiJGZhc3Rfd3JpdGVxKCIgKyBhcmcxICsgIiwgIiArIGFyZzIgKyAiKSI7IH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworCVRlcm0gYTEsIGEyOworICAgICAgICBhMSA9IGFyZzE7CisgICAgICAgIGEyID0gYXJnMjsKKwlPYmplY3Qgc3RyZWFtID0gbnVsbDsKKworCS8vIFNfb3JfYQorCWExID0gYTEuZGVyZWZlcmVuY2UoKTsgCisJaWYgKGExLmlzVmFyaWFibGUoKSkgeworCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMSk7CisJfSBlbHNlIGlmIChhMS5pc1N5bWJvbCgpKSB7CisJICAgIGlmICghIGVuZ2luZS5nZXRTdHJlYW1NYW5hZ2VyKCkuY29udGFpbnNLZXkoYTEpKQorCQl0aHJvdyBuZXcgRXhpc3RlbmNlRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW0iLCBhMSwgIiIpOworCSAgICBzdHJlYW0gPSAoKEphdmFPYmplY3RUZXJtKSBlbmdpbmUuZ2V0U3RyZWFtTWFuYWdlcigpLmdldChhMSkpLm9iamVjdCgpOworCX0gZWxzZSBpZiAoYTEuaXNKYXZhT2JqZWN0KCkpIHsKKwkgICAgc3RyZWFtID0gKChKYXZhT2JqZWN0VGVybSkgYTEpLm9iamVjdCgpOworCX0gZWxzZSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW1fb3JfYWxpYXMiLCBhMSk7CisJfQorCWlmICghIChzdHJlYW0gaW5zdGFuY2VvZiBQcmludFdyaXRlcikpCisJICAgIHRocm93IG5ldyBQZXJtaXNzaW9uRXhjZXB0aW9uKHRoaXMsICJvdXRwdXQiLCAic3RyZWFtIiwgYTEsICIiKTsKKwkvLyBwcmludCB0ZXJtCisJKChQcmludFdyaXRlcikgc3RyZWFtKS5wcmludChhMi5kZXJlZmVyZW5jZSgpLnRvUXVvdGVkU3RyaW5nKCkpOworCXJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kZ2V0X2N1cnJlbnRfQl8xLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGdldF9jdXJyZW50X0JfMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NTQ5NDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGdldF9jdXJyZW50X0JfMS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKKy8qKgorICogPGNvZGU+JyRnZXRfY3VycmVudF9CJy8xPC9jb2RlPjxicj4KKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMAorICovCitjbGFzcyBQUkVEXyRnZXRfY3VycmVudF9CXzEgZXh0ZW5kcyBQcmVkaWNhdGUgeworICAgICBUZXJtIGFyZzE7CisKKyAgICBwdWJsaWMgUFJFRF8kZ2V0X2N1cnJlbnRfQl8xKFRlcm0gYTEsIFByZWRpY2F0ZSBjb250KSB7CisJYXJnMSA9IGExOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfJGdldF9jdXJyZW50X0JfMSgpIHt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpeworCWFyZzEgPSBhcmdzWzBdOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDE7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiAiJGdldF9jdXJyZW50X0IoIiArIGFyZzEgKyAiKSI7IH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworCVRlcm0gYTE7CisJYTEgPSBhcmcxOworCWlmICghIGExLnVuaWZ5KG5ldyBJbnRlZ2VyVGVybShlbmdpbmUuc3RhY2sudG9wKCkpLCBlbmdpbmUudHJhaWwpKSAKKwkgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJcmV0dXJuIGNvbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRnZXRfZXhjZXB0aW9uXzEuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kZ2V0X2V4Y2VwdGlvbl8xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUxYzI5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kZ2V0X2V4Y2VwdGlvbl8xLmphdmEKQEAgLTAsMCArMSwzNyBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQgIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworLyoqCisgKiA8Y29kZT4nJGdldF9leGNlcHRpb24nLzE8L2NvZGU+PGJyPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK2NsYXNzIFBSRURfJGdldF9leGNlcHRpb25fMSBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgIFRlcm0gYXJnMTsKKworICAgIHB1YmxpYyBQUkVEXyRnZXRfZXhjZXB0aW9uXzEoVGVybSBhMSwgUHJlZGljYXRlIGNvbnQpIHsKKwlhcmcxID0gYTE7CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF8kZ2V0X2V4Y2VwdGlvbl8xKCkge30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCl7CisJYXJnMSA9IGFyZ3NbMF07CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMTsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuICIkZ2V0X2V4Y2VwdGlvbigiICsgYXJnMSArICIpIjsgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisJVGVybSBhMTsKKwlhMSA9IGFyZzE7CisKKwlpZiAoISBhMS51bmlmeShlbmdpbmUuZ2V0RXhjZXB0aW9uKCksIGVuZ2luZS50cmFpbCkpCisJICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOworCXJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kZ2V0X2hhc2hfbWFuYWdlcl8xLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGdldF9oYXNoX21hbmFnZXJfMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjI1MTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGdldF9oYXNoX21hbmFnZXJfMS5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0IGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworLyoqCisgICA8Y29kZT4nJGdldF9oYXNoX21hbmFnZXInLzE8L2NvZGU+PGJyPgorICAgQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgICBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICAgQHZlcnNpb24gMS4wCisqLworY2xhc3MgUFJFRF8kZ2V0X2hhc2hfbWFuYWdlcl8xIGV4dGVuZHMgUHJlZGljYXRlIHsKKworICAgIHB1YmxpYyBUZXJtIGFyZzE7CisKKyAgICBwdWJsaWMgUFJFRF8kZ2V0X2hhc2hfbWFuYWdlcl8xKFRlcm0gYTEsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhMTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF8kZ2V0X2hhc2hfbWFuYWdlcl8xKCl7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhcmdzWzBdOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAxOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIiRnZXRfaGFzaF9tYW5hZ2VyKCIgKyBhcmcxICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworICAgICAgICBUZXJtIGExOworICAgICAgICBhMSA9IGFyZzE7CisKKwlhMSA9IGExLmRlcmVmZXJlbmNlKCk7CisJaWYgKCEgYTEuaXNWYXJpYWJsZSgpKQorCSAgICB0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMSwgInZhcmlhYmxlIiwgYTEpOworCWlmICghIGExLnVuaWZ5KG5ldyBKYXZhT2JqZWN0VGVybShlbmdpbmUuZ2V0SGFzaE1hbmFnZXIoKSksIGVuZ2luZS50cmFpbCkpCisJICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOworICAgICAgICByZXR1cm4gY29udDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGdldF9pbnN0YW5jZXNfMi5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRnZXRfaW5zdGFuY2VzXzIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjJlNmUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRnZXRfaW5zdGFuY2VzXzIuamF2YQpAQCAtMCwwICsxLDc2IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKKy8qKgorICAgPGNvZGU+JyRnZXRfaW5zdGFuY2VzJy8yPC9jb2RlPjxicj4KKyAgIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICAgQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAgIEB2ZXJzaW9uIDEuMQorKi8KK2NsYXNzIFBSRURfJGdldF9pbnN0YW5jZXNfMiBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgcHVibGljIFRlcm0gYXJnMSwgYXJnMjsKKyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFRlcm0gQ09NTUEgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woIiwiLCAyKTsKKworICAgIHB1YmxpYyBQUkVEXyRnZXRfaW5zdGFuY2VzXzIoVGVybSBhMSwgVGVybSBhMiwgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGExOworICAgICAgICBhcmcyID0gYTI7CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfJGdldF9pbnN0YW5jZXNfMigpe30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYXJnc1swXTsKKyAgICAgICAgYXJnMiA9IGFyZ3NbMV07CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDI7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiJGdldF9pbnN0YW5jZXMoIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworICAgICAgICBUZXJtIGExLCBhMjsKKyAgICAgICAgYTEgPSBhcmcxOworICAgICAgICBhMiA9IGFyZzI7CisJaW50IGlkeDsKKworCWExID0gYTEuZGVyZWZlcmVuY2UoKTsKKwlpZiAoYTEuaXNOaWwoKSkKKwkgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJaWYgKCEgYTEuaXNMaXN0KCkpCisJICAgIHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAxLCAibGlzdCIsIGExKTsKKwlUZXJtIHggPSBQcm9sb2cuTmlsOworCVRlcm0gdG1wID0gYTE7CisJd2hpbGUoISB0bXAuaXNOaWwoKSkgeworCSAgICBpZiAoISB0bXAuaXNMaXN0KCkpCisJCXRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAxLCAibGlzdCIsIGExKTsKKwkgICAgVGVybSBjYXIgPSAoKExpc3RUZXJtKXRtcCkuY2FyKCkuZGVyZWZlcmVuY2UoKTsKKwkgICAgaWYgKGNhci5pc1ZhcmlhYmxlKCkpCisJCXRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAxKTsKKwkgICAgaWYgKCEgY2FyLmlzSW50ZWdlcigpKSAKKwkJdGhyb3cgbmV3IFJlcHJlc2VudGF0aW9uRXhjZXB0aW9uKHRoaXMsIDEsICJpbnRlZ2VyIik7CisJICAgIC8vIGNhciBpcyBhbiBpbnRlZ2VyCisJICAgIGludCBpID0gKChJbnRlZ2VyVGVybSljYXIpLmludFZhbHVlKCk7CisJICAgIFRlcm0gZSA9IGVuZ2luZS5pbnRlcm5hbERCLmdldChpKTsKKwkgICAgaWYgKGUgIT0gbnVsbCkgeworCQlUZXJtW10gYXJnID0ge2UsIGNhcn07CisJCXggPSBuZXcgTGlzdFRlcm0obmV3IFN0cnVjdHVyZVRlcm0oQ09NTUEsIGFyZyksIHgpOworCSAgICB9IAorCSAgICAvLwkgICAgZWxzZSB7CisJICAgIC8vCQlTeXN0ZW0ub3V0LnByaW50bG4oImluZGV4ICIgKyBpICsgIiBpcyBkZWxldGVkLiIpOworCSAgICAvLwkgICAgfQorCisJICAgIC8vCSAgICBpZiAoZSA9PSBudWxsKQorCSAgICAvLwkJdGhyb3cgbmV3IFN5c3RlbUV4Y2VwdGlvbigiaW52YWxpZCBpbmRleCIpOworCSAgICAvLwkgICAgVGVybVtdIGFyZyA9IHtlLCBjYXJ9OworCSAgICAvLwkgICAgeCA9IG5ldyBMaXN0VGVybShuZXcgU3RydWN0dXJlVGVybShDT01NQSwgYXJnKSwgeCk7CisJICAgIHRtcCA9ICgoTGlzdFRlcm0pdG1wKS5jZHIoKS5kZXJlZmVyZW5jZSgpOworCX0KKwlpZiAoISBhMi51bmlmeSh4LCBlbmdpbmUudHJhaWwpKQorCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKwlyZXR1cm4gY29udDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGdldF9sZXZlbF8xLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGdldF9sZXZlbF8xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk1NGU5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kZ2V0X2xldmVsXzEuamF2YQpAQCAtMCwwICsxLDQwIEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKKy8qKgorIDxjb2RlPickZ2V0X2xldmVsJy8xPC9jb2RlPjxicj4KKyBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorIEB2ZXJzaW9uIDEuMAorKi8KK3B1YmxpYyBjbGFzcyBQUkVEXyRnZXRfbGV2ZWxfMSBleHRlbmRzIFByZWRpY2F0ZSB7CisKKyAgICBwdWJsaWMgVGVybSBhcmcxOworCisgICAgcHVibGljIFBSRURfJGdldF9sZXZlbF8xKFRlcm0gYTEsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhMTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF8kZ2V0X2xldmVsXzEoKXt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGFyZ3NbMF07CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDE7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiJGdldF9sZXZlbCgiICsgYXJnMSArICIpIjsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworCS8vICAgICAgICBlbmdpbmUuc2V0QjAoKTsgCisJVGVybSBhMTsKKyAgICAgICAgYTEgPSBhcmcxOworICAgICAgICBpZiAoISBhMS51bmlmeShuZXcgSW50ZWdlclRlcm0oZW5naW5lLkIwKSwgZW5naW5lLnRyYWlsKSkgeworICAgICAgICAgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRnZXRfcHJvbG9nX2ltcGxfZmxhZ18yLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGdldF9wcm9sb2dfaW1wbF9mbGFnXzIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODNmNWYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRnZXRfcHJvbG9nX2ltcGxfZmxhZ18yLmphdmEKQEAgLTAsMCArMSw5MyBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisvKioKKyAgIDxjb2RlPickZ2V0X3Byb2xvZ19pbXBsX2ZsYWcnLzI8L2NvZGU+PGJyPgorICAgQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgICBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICAgQHZlcnNpb24gMS4wCisqLworY2xhc3MgUFJFRF8kZ2V0X3Byb2xvZ19pbXBsX2ZsYWdfMiBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gVFJVRSAgICAgICAgICAgICAgICAgICAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgidHJ1ZSIpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIEZBTFNFICAgICAgICAgICAgICAgICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woImZhbHNlIik7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gQk9VTkRFRCAgICAgICAgICAgICAgICAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiYm91bmRlZCIpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIE1BWF9JTlRFR0VSICAgICAgICAgICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woIm1heF9pbnRlZ2VyIik7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gTUlOX0lOVEVHRVIgICAgICAgICAgICAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgibWluX2ludGVnZXIiKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBJTlRFR0VSX1JPVU5ESU5HX0ZVTkNUSU9OID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJpbnRlZ2VyX3JvdW5kaW5nX2Z1bmN0aW9uIik7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gQ0hBUl9DT05WRVJTSU9OICAgICAgICAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiY2hhcl9jb252ZXJzaW9uIik7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gREVCVUcgICAgICAgICAgICAgICAgICAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiZGVidWciKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBNQVhfQVJJVFkgICAgICAgICAgICAgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJtYXhfYXJpdHkiKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBVTktOT1dOICAgICAgICAgICAgICAgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJ1bmtub3duIik7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gRE9VQkxFX1FVT1RFUyAgICAgICAgICAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiZG91YmxlX3F1b3RlcyIpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFBSSU5UX1NUQUNLX1RSQUNFICAgICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woInByaW50X3N0YWNrX3RyYWNlIik7CisKKyAgICBwdWJsaWMgVGVybSBhcmcxLCBhcmcyOworCisgICAgcHVibGljIFBSRURfJGdldF9wcm9sb2dfaW1wbF9mbGFnXzIoVGVybSBhMSwgVGVybSBhMiwgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGExOworICAgICAgICBhcmcyID0gYTI7CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfJGdldF9wcm9sb2dfaW1wbF9mbGFnXzIoKXt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGFyZ3NbMF07CisgICAgICAgIGFyZzIgPSBhcmdzWzFdOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAyOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIiRnZXRfcHJvbG9nX2ltcGxfZmxhZygiICsgYXJnMSArICIsIiArIGFyZzIgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisgICAgICAgIFRlcm0gYTEsIGEyOworICAgICAgICBhMSA9IGFyZzE7CisgICAgICAgIGEyID0gYXJnMjsKKwlhMSA9IGExLmRlcmVmZXJlbmNlKCk7CisJYTIgPSBhMi5kZXJlZmVyZW5jZSgpOworCisJaWYgKGExLmVxdWFscyhCT1VOREVEKSkgeworCSAgICBpZiAoZW5naW5lLmlzQm91bmRlZCgpKSB7CisJCWlmICghIGEyLnVuaWZ5KFRSVUUsIGVuZ2luZS50cmFpbCkpCisJCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKwkgICAgfSBlbHNlIHsKKwkJaWYgKCEgYTIudW5pZnkoRkFMU0UsIGVuZ2luZS50cmFpbCkpCisJCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKwkgICAgfQorCX0gZWxzZSBpZiAoYTEuZXF1YWxzKE1BWF9JTlRFR0VSKSkgeworCSAgICBpZiAoISBhMi51bmlmeShuZXcgSW50ZWdlclRlcm0oZW5naW5lLmdldE1heEludGVnZXIoKSksIGVuZ2luZS50cmFpbCkpCisJCXJldHVybiBlbmdpbmUuZmFpbCgpOworCX0gZWxzZSBpZiAoYTEuZXF1YWxzKE1JTl9JTlRFR0VSKSkgeworCSAgICBpZiAoISBhMi51bmlmeShuZXcgSW50ZWdlclRlcm0oZW5naW5lLmdldE1pbkludGVnZXIoKSksIGVuZ2luZS50cmFpbCkpCisJCXJldHVybiBlbmdpbmUuZmFpbCgpOworCX0gZWxzZSBpZiAoYTEuZXF1YWxzKElOVEVHRVJfUk9VTkRJTkdfRlVOQ1RJT04pKSB7CisJICAgIGlmICghIGEyLnVuaWZ5KFN5bWJvbFRlcm0ubWFrZVN5bWJvbChlbmdpbmUuZ2V0SW50ZWdlclJvdW5kaW5nRnVuY3Rpb24oKSksIGVuZ2luZS50cmFpbCkpCisJCXJldHVybiBlbmdpbmUuZmFpbCgpOworCX0gZWxzZSBpZiAoYTEuZXF1YWxzKENIQVJfQ09OVkVSU0lPTikpIHsKKwkgICAgaWYgKCEgYTIudW5pZnkoU3ltYm9sVGVybS5tYWtlU3ltYm9sKGVuZ2luZS5nZXRDaGFyQ29udmVyc2lvbigpKSwgZW5naW5lLnRyYWlsKSkKKwkJcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJfSBlbHNlIGlmIChhMS5lcXVhbHMoREVCVUcpKSB7CisJICAgIGlmICghIGEyLnVuaWZ5KFN5bWJvbFRlcm0ubWFrZVN5bWJvbChlbmdpbmUuZ2V0RGVidWcoKSksIGVuZ2luZS50cmFpbCkpCisJCXJldHVybiBlbmdpbmUuZmFpbCgpOworCX0gZWxzZSBpZiAoYTEuZXF1YWxzKE1BWF9BUklUWSkpIHsKKwkgICAgaWYgKCEgYTIudW5pZnkobmV3IEludGVnZXJUZXJtKGVuZ2luZS5nZXRNYXhBcml0eSgpKSwgZW5naW5lLnRyYWlsKSkKKwkJcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJfSBlbHNlIGlmIChhMS5lcXVhbHMoVU5LTk9XTikpIHsKKwkgICAgaWYgKCEgYTIudW5pZnkoU3ltYm9sVGVybS5tYWtlU3ltYm9sKGVuZ2luZS5nZXRVbmtub3duKCkpLCBlbmdpbmUudHJhaWwpKQorCQlyZXR1cm4gZW5naW5lLmZhaWwoKTsKKwl9IGVsc2UgaWYgKGExLmVxdWFscyhET1VCTEVfUVVPVEVTKSkgeworCSAgICBpZiAoISBhMi51bmlmeShTeW1ib2xUZXJtLm1ha2VTeW1ib2woZW5naW5lLmdldERvdWJsZVF1b3RlcygpKSwgZW5naW5lLnRyYWlsKSkKKwkJcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJfSBlbHNlIGlmIChhMS5lcXVhbHMoUFJJTlRfU1RBQ0tfVFJBQ0UpKSB7CisJICAgIGlmICghIGEyLnVuaWZ5KFN5bWJvbFRlcm0ubWFrZVN5bWJvbChlbmdpbmUuZ2V0UHJpbnRTdGFja1RyYWNlKCkpLCBlbmdpbmUudHJhaWwpKQorCQlyZXR1cm4gZW5naW5lLmZhaWwoKTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKwl9CisgICAgICAgIHJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kZ2V0X3N0cmVhbV9tYW5hZ2VyXzEuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kZ2V0X3N0cmVhbV9tYW5hZ2VyXzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDI1NDYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRnZXRfc3RyZWFtX21hbmFnZXJfMS5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0IGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworLyoqCisgICA8Y29kZT4nJGdldF9zdHJlYW1fbWFuYWdlcicvMTwvY29kZT48YnI+CisgICBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAgIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgICBAdmVyc2lvbiAxLjAKKyovCitjbGFzcyBQUkVEXyRnZXRfc3RyZWFtX21hbmFnZXJfMSBleHRlbmRzIFByZWRpY2F0ZSB7CisKKyAgICBwdWJsaWMgVGVybSBhcmcxOworCisgICAgcHVibGljIFBSRURfJGdldF9zdHJlYW1fbWFuYWdlcl8xKFRlcm0gYTEsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhMTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF8kZ2V0X3N0cmVhbV9tYW5hZ2VyXzEoKXt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGFyZ3NbMF07CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDE7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiJGdldF9zdHJlYW1fbWFuYWdlcigiICsgYXJnMSArICIpIjsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKyAgICAgICAgVGVybSBhMTsKKyAgICAgICAgYTEgPSBhcmcxOworCisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOworCWlmICghIGExLmlzVmFyaWFibGUoKSkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDEsICJ2YXJpYWJsZSIsIGExKTsKKwlpZiAoISBhMS51bmlmeShuZXcgSmF2YU9iamVjdFRlcm0oZW5naW5lLmdldFN0cmVhbU1hbmFnZXIoKSksIGVuZ2luZS50cmFpbCkpCisJICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOworICAgICAgICByZXR1cm4gY29udDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGhhc2hfYWRkYV8zLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGhhc2hfYWRkYV8zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1ZTUxNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kaGFzaF9hZGRhXzMuamF2YQpAQCAtMCwwICsxLDY3IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworLyoqCisgICA8Y29kZT4nJGhhc2hfYWRkYScvMzwvY29kZT48YnI+CisgICBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAgIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgICBAdmVyc2lvbiAxLjAKKyovCitjbGFzcyBQUkVEXyRoYXNoX2FkZGFfMyBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgcHVibGljIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9OSUwgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woIltdIik7CisgICAgcHVibGljIFRlcm0gYXJnMSwgYXJnMiwgYXJnMzsKKworICAgIHB1YmxpYyBQUkVEXyRoYXNoX2FkZGFfMyhUZXJtIGExLCBUZXJtIGEyLCBUZXJtIGEzLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYTE7CisgICAgICAgIGFyZzIgPSBhMjsKKyAgICAgICAgYXJnMyA9IGEzOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEXyRoYXNoX2FkZGFfMygpe30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYXJnc1swXTsKKyAgICAgICAgYXJnMiA9IGFyZ3NbMV07CisgICAgICAgIGFyZzMgPSBhcmdzWzJdOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAzOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIiRoYXNoX2FkZGEoIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIiwiICsgYXJnMyArICIpIjsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKyAgICAgICAgVGVybSBhMSwgYTIsIGEzOworICAgICAgICBhMSA9IGFyZzE7CisgICAgICAgIGEyID0gYXJnMjsKKyAgICAgICAgYTMgPSBhcmczOworCisJT2JqZWN0IGhhc2ggPSBudWxsOworCisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOworCWlmIChhMS5pc1ZhcmlhYmxlKCkpIHsKKwkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDEpOworCX0gZWxzZSBpZiAoYTEuaXNTeW1ib2woKSkgeworCSAgICBpZiAoISBlbmdpbmUuZ2V0SGFzaE1hbmFnZXIoKS5jb250YWluc0tleShhMSkpCisJCXRocm93IG5ldyBFeGlzdGVuY2VFeGNlcHRpb24odGhpcywgMSwgImhhc2giLCBhMSwgIiIpOworCSAgICBoYXNoID0gKChKYXZhT2JqZWN0VGVybSkgZW5naW5lLmdldEhhc2hNYW5hZ2VyKCkuZ2V0KGExKSkub2JqZWN0KCk7CisJfSBlbHNlIGlmIChhMS5pc0phdmFPYmplY3QoKSkgeworCSAgICBoYXNoID0gKChKYXZhT2JqZWN0VGVybSkgYTEpLm9iamVjdCgpOworCX0gZWxzZSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDEsICJoYXNoX29yX2FsaWFzIiwgYTEpOworCX0KKwlpZiAoISAoaGFzaCBpbnN0YW5jZW9mIEhhc2h0YWJsZU9mVGVybSkpCisJICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbih0aGlzICsgIjogSGFzaCBpcyBub3QgSGFzaHRhYmxlT2ZUZXJtIik7CisJYTIgPSBhMi5kZXJlZmVyZW5jZSgpOworCVRlcm0gZWxlbSA9ICgoSGFzaHRhYmxlT2ZUZXJtKSBoYXNoKS5nZXQoYTIpOworCWlmIChlbGVtID09IG51bGwpCisJICAgIGVsZW0gPSBTWU1fTklMOworCWEzID0gYTMuZGVyZWZlcmVuY2UoKTsKKwkoKEhhc2h0YWJsZU9mVGVybSkgaGFzaCkucHV0KGEyLCBuZXcgTGlzdFRlcm0oYTMsIGVsZW0pKTsKKyAgICAgICAgcmV0dXJuIGNvbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRoYXNoX2FkZHpfMy5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRoYXNoX2FkZHpfMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5M2I5YjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGhhc2hfYWRkel8zLmphdmEKQEAgLTAsMCArMSw4MyBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKy8qKgorICAgPGNvZGU+JyRoYXNoX2FkZHonLzM8L2NvZGU+PGJyPgorICAgQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgICBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICAgQHZlcnNpb24gMS4wCisqLworY2xhc3MgUFJFRF8kaGFzaF9hZGR6XzMgZXh0ZW5kcyBQcmVkaWNhdGUgeworICAgIHB1YmxpYyBzdGF0aWMgU3ltYm9sVGVybSBTWU1fTklMID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJbXSIpOworICAgIHB1YmxpYyBUZXJtIGFyZzEsIGFyZzIsIGFyZzM7CisKKyAgICBwdWJsaWMgUFJFRF8kaGFzaF9hZGR6XzMoVGVybSBhMSwgVGVybSBhMiwgVGVybSBhMywgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGExOworICAgICAgICBhcmcyID0gYTI7CisgICAgICAgIGFyZzMgPSBhMzsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF8kaGFzaF9hZGR6XzMoKXt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGFyZ3NbMF07CisgICAgICAgIGFyZzIgPSBhcmdzWzFdOworICAgICAgICBhcmczID0gYXJnc1syXTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMzsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICIkaGFzaF9hZGR6KCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIsIiArIGFyZzMgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisgICAgICAgIFRlcm0gYTEsIGEyLCBhMzsKKyAgICAgICAgYTEgPSBhcmcxOworICAgICAgICBhMiA9IGFyZzI7CisgICAgICAgIGEzID0gYXJnMzsKKworCU9iamVjdCBoYXNoID0gbnVsbDsKKworCWExID0gYTEuZGVyZWZlcmVuY2UoKTsKKwlpZiAoYTEuaXNWYXJpYWJsZSgpKSB7CisJICAgIHRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAxKTsKKwl9IGVsc2UgaWYgKGExLmlzU3ltYm9sKCkpIHsKKwkgICAgaWYgKCEgZW5naW5lLmdldEhhc2hNYW5hZ2VyKCkuY29udGFpbnNLZXkoYTEpKQorCQl0aHJvdyBuZXcgRXhpc3RlbmNlRXhjZXB0aW9uKHRoaXMsIDEsICJoYXNoIiwgYTEsICIiKTsKKwkgICAgaGFzaCA9ICgoSmF2YU9iamVjdFRlcm0pIGVuZ2luZS5nZXRIYXNoTWFuYWdlcigpLmdldChhMSkpLm9iamVjdCgpOworCX0gZWxzZSBpZiAoYTEuaXNKYXZhT2JqZWN0KCkpIHsKKwkgICAgaGFzaCA9ICgoSmF2YU9iamVjdFRlcm0pIGExKS5vYmplY3QoKTsKKwl9IGVsc2UgeworCSAgICB0aHJvdyBuZXcgSWxsZWdhbERvbWFpbkV4Y2VwdGlvbih0aGlzLCAxLCAiaGFzaF9vcl9hbGlhcyIsIGExKTsKKwl9CisJaWYgKCEgKGhhc2ggaW5zdGFuY2VvZiBIYXNodGFibGVPZlRlcm0pKQorCSAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24odGhpcyArICI6IEhhc2ggaXMgbm90IEhhc2h0YWJsZU9mVGVybSIpOworCWEyID0gYTIuZGVyZWZlcmVuY2UoKTsKKwlUZXJtIGVsZW0gPSAoKEhhc2h0YWJsZU9mVGVybSkgaGFzaCkuZ2V0KGEyKTsKKwlpZiAoZWxlbSA9PSBudWxsKQorCSAgICBlbGVtID0gU1lNX05JTDsKKwlhMyA9IGEzLmRlcmVmZXJlbmNlKCk7CisJaWYgKGVsZW0uaXNOaWwoKSkgeworCSAgICBlbGVtID0gbmV3IExpc3RUZXJtKGEzLCBlbGVtKTsKKwl9IGVsc2UgeworCSAgICBUZXJtIHggPSBlbGVtOworCSAgICBUZXJtIHk7CisJICAgIHdoaWxlKHRydWUpIHsKKwkJaWYgKCEgeC5pc0xpc3QoKSkKKwkJICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbih0aGlzICsgIjogdGhlIHZhbHVzIG9mICIgKyBhMiArICIgaXMgbm90IGxpc3Qgc3RydWN0dXJlIik7CisJCXkgPSAoKExpc3RUZXJtKXgpLmNkcigpLmRlcmVmZXJlbmNlKCk7CisJCWlmICh5LmlzTmlsKCkpIHsKKwkJICAgICgoTGlzdFRlcm0peCkuc2V0Q2RyKG5ldyBMaXN0VGVybShhMywgU1lNX05JTCkpOworCQkgICAgYnJlYWs7CisJCX0KKwkJeCA9IHk7CisJICAgIH0KKwl9CisJKChIYXNodGFibGVPZlRlcm0pIGhhc2gpLnB1dChhMiwgZWxlbSk7CisgICAgICAgIHJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kaGFzaF9yZW1vdmVfZmlyc3RfMy5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRoYXNoX3JlbW92ZV9maXJzdF8zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyZjIwMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kaGFzaF9yZW1vdmVfZmlyc3RfMy5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0IGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisvKioKKyAgIDxjb2RlPickaGFzaF9yZW1vdmVfZmlyc3QnLzM8L2NvZGU+PGJyPgorICAgQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgICBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICAgQHZlcnNpb24gMS4wCisqLworY2xhc3MgUFJFRF8kaGFzaF9yZW1vdmVfZmlyc3RfMyBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgcHVibGljIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9OSUwgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woIltdIik7CisgICAgcHVibGljIFRlcm0gYXJnMSwgYXJnMiwgYXJnMzsKKworICAgIHB1YmxpYyBQUkVEXyRoYXNoX3JlbW92ZV9maXJzdF8zKFRlcm0gYTEsIFRlcm0gYTIsIFRlcm0gYTMsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhMTsKKyAgICAgICAgYXJnMiA9IGEyOworICAgICAgICBhcmczID0gYTM7CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfJGhhc2hfcmVtb3ZlX2ZpcnN0XzMoKXt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGFyZ3NbMF07CisgICAgICAgIGFyZzIgPSBhcmdzWzFdOworICAgICAgICBhcmczID0gYXJnc1syXTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMzsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICIkaGFzaF9yZW1vdmVfZmlyc3QoIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIiwiICsgYXJnMyArICIpIjsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKyAgICAgICAgVGVybSBhMSwgYTIsIGEzOworICAgICAgICBhMSA9IGFyZzE7CisgICAgICAgIGEyID0gYXJnMjsKKyAgICAgICAgYTMgPSBhcmczOworCisJT2JqZWN0IGhhc2ggPSBudWxsOworCisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOworCWlmIChhMS5pc1ZhcmlhYmxlKCkpIHsKKwkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDEpOworCX0gZWxzZSBpZiAoYTEuaXNTeW1ib2woKSkgeworCSAgICBpZiAoISBlbmdpbmUuZ2V0SGFzaE1hbmFnZXIoKS5jb250YWluc0tleShhMSkpCisJCXRocm93IG5ldyBFeGlzdGVuY2VFeGNlcHRpb24odGhpcywgMSwgImhhc2giLCBhMSwgIiIpOworCSAgICBoYXNoID0gKChKYXZhT2JqZWN0VGVybSkgZW5naW5lLmdldEhhc2hNYW5hZ2VyKCkuZ2V0KGExKSkub2JqZWN0KCk7CisJfSBlbHNlIGlmIChhMS5pc0phdmFPYmplY3QoKSkgeworCSAgICBoYXNoID0gKChKYXZhT2JqZWN0VGVybSkgYTEpLm9iamVjdCgpOworCX0gZWxzZSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDEsICJoYXNoX29yX2FsaWFzIiwgYTEpOworCX0KKwlpZiAoISAoaGFzaCBpbnN0YW5jZW9mIEhhc2h0YWJsZU9mVGVybSkpCisJICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbih0aGlzICsgIjogSGFzaCBpcyBub3QgSGFzaHRhYmxlT2ZUZXJtIik7CisJYTIgPSBhMi5kZXJlZmVyZW5jZSgpOworCVRlcm0gZWxlbSA9ICgoSGFzaHRhYmxlT2ZUZXJtKSBoYXNoKS5nZXQoYTIpOworCWlmIChlbGVtID09IG51bGwgfHwgZWxlbS5pc05pbCgpKQorCSAgICByZXR1cm4gY29udDsKKwlhMyA9IGEzLmRlcmVmZXJlbmNlKCk7CisJVGVybSB4ICA9IGVsZW07CisJVGVybSB4MCA9IFByb2xvZy5OaWw7CisJVGVybSB5LHo7CisJd2hpbGUoISB4LmlzTmlsKCkpIHsKKwkgICAgaWYgKCEgeC5pc0xpc3QoKSkKKwkJdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKHRoaXMgKyAiOiB0aGUgdmFsdXMgb2YgIiArIGEyICsgIiBpcyBub3QgbGlzdCBzdHJ1Y3R1cmUiKTsKKwkgICAgeSA9ICgoTGlzdFRlcm0peCkuY2FyKCkuZGVyZWZlcmVuY2UoKTsKKwkgICAgeiA9ICgoTGlzdFRlcm0peCkuY2RyKCkuZGVyZWZlcmVuY2UoKTsKKwkgICAgaWYgKHkuZXF1YWxzKGEzKSkgeworCQlpZiAoei5pc05pbCgpKSB7CisJCSAgICBpZiAoeDAuaXNMaXN0KCkpCisJCQkoKExpc3RUZXJtKXgwKS5zZXRDZHIoUHJvbG9nLk5pbCk7CisJCSAgICBlbHNlIAorCQkJZWxlbSA9IFByb2xvZy5OaWw7CisJCX0gZWxzZSB7CisJCSAgICAoKExpc3RUZXJtKXgpLnNldENhcigoKExpc3RUZXJtKXopLmNhcigpLmRlcmVmZXJlbmNlKCkpOworCQkgICAgKChMaXN0VGVybSl4KS5zZXRDZHIoKChMaXN0VGVybSl6KS5jZHIoKS5kZXJlZmVyZW5jZSgpKTsKKwkJfQorCQlicmVhazsKKwkgICAgfQorCSAgICB4MCA9IHg7CisJICAgIHggPSB6OworCX0KKwlpZiAoZWxlbS5pc05pbCgpICYmIGEyLmlzSW50ZWdlcigpKSB7CisJICAgICgoSGFzaHRhYmxlT2ZUZXJtKWhhc2gpLnJlbW92ZShhMik7CisJICAgIC8vCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyMjIyMjIyMjIyMjIyMga2V5ICIgKyBhMiArICIgaXMgcmVtb3ZlZCIpOworCX0gZWxzZSB7CisJICAgICgoSGFzaHRhYmxlT2ZUZXJtKSBoYXNoKS5wdXQoYTIsIGVsZW0pOworCX0KKyAgICAgICAgcmV0dXJuIGNvbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRpbnNlcnRfMi5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRpbnNlcnRfMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ODQ1MTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJGluc2VydF8yLmphdmEKQEAgLTAsMCArMSw0OCBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisvKioKKyAgIDxjb2RlPickaW5zZXJ0Jy8yPC9jb2RlPjxicj4KKyAgIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICAgQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAgIEB2ZXJzaW9uIDEuMQorKi8KK2NsYXNzIFBSRURfJGluc2VydF8yIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICBwdWJsaWMgVGVybSBhcmcxLCBhcmcyOworCisgICAgcHVibGljIFBSRURfJGluc2VydF8yKFRlcm0gYTEsIFRlcm0gYTIsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhMTsKKyAgICAgICAgYXJnMiA9IGEyOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEXyRpbnNlcnRfMigpe30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYXJnc1swXTsKKyAgICAgICAgYXJnMiA9IGFyZ3NbMV07CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDI7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiJGluc2VydCgiICsgYXJnMSArICIsIiArIGFyZzIgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisgICAgICAgIFRlcm0gYTEsIGEyOworICAgICAgICBhMSA9IGFyZzE7CisgICAgICAgIGEyID0gYXJnMjsKKwlpbnQgaWR4OworCisJYTIgPSBhMi5kZXJlZmVyZW5jZSgpOworCWlmICghIGEyLmlzVmFyaWFibGUoKSkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJ2YXJpYWJsZSIsIGEyKTsKKwlhMSA9IGExLmRlcmVmZXJlbmNlKCk7CisJaWR4ID0gZW5naW5lLmludGVybmFsREIuaW5zZXJ0KGExKTsKKwlpZiAoISBhMi51bmlmeShuZXcgSW50ZWdlclRlcm0oaWR4KSwgZW5naW5lLnRyYWlsKSkKKwkgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJcmV0dXJuIGNvbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRuZWNrX2N1dF8wLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJG5lY2tfY3V0XzAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzIzOGZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRuZWNrX2N1dF8wLmphdmEKQEAgLTAsMCArMSwzMiBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisvKioKKyA8Y29kZT4nJG5lY2tfY3V0Jy8wPC9jb2RlPjxicj4KKyBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorIEB2ZXJzaW9uIDEuMAorKi8KK3B1YmxpYyBjbGFzcyBQUkVEXyRuZWNrX2N1dF8wIGV4dGVuZHMgUHJlZGljYXRlIHsKKworICAgIHB1YmxpYyBQUkVEXyRuZWNrX2N1dF8wKFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfJG5lY2tfY3V0XzAoKXt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMDsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICIkbmVja19jdXQiOworICAgIH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisJLy8gICAgICAgIGVuZ2luZS5zZXRCMCgpOyAKKyAgICAgICAgZW5naW5lLm5lY2tDdXQoKTsKKyAgICAgICAgcmV0dXJuIGNvbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRwcmludF9zdGFja190cmFjZV8xLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJHByaW50X3N0YWNrX3RyYWNlXzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWQxZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRwcmludF9zdGFja190cmFjZV8xLmphdmEKQEAgLTAsMCArMSw0OCBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisvKioKKyAqIDxjb2RlPickcHJpbnRfc3RhY2tfdHJhY2UnLzE8L2NvZGU+CisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyovCitjbGFzcyBQUkVEXyRwcmludF9zdGFja190cmFjZV8xIGV4dGVuZHMgUHJlZGljYXRlIHsKKworICAgIHB1YmxpYyBUZXJtIGFyZzE7CisKKyAgICBwdWJsaWMgUFJFRF8kcHJpbnRfc3RhY2tfdHJhY2VfMShUZXJtIGExLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYTE7CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfJHByaW50X3N0YWNrX3RyYWNlXzEoKXt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGFyZ3NbMF07CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDE7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiJHByaW50X3N0YWNrX3RyYWNlKCIgKyBhcmcxICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworICAgICAgICBUZXJtIGExOworICAgICAgICBhMSA9IGFyZzE7CisKKwlhMSA9IGExLmRlcmVmZXJlbmNlKCk7CisJaWYgKGExLmlzVmFyaWFibGUoKSkKKwkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDEpOworCWlmICghIGExLmlzSmF2YU9iamVjdCgpKQorCSAgICB0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMSwgImphdmEiLCBhMSk7CisJT2JqZWN0IG9iaiA9ICgoSmF2YU9iamVjdFRlcm0pIGExKS5vYmplY3QoKTsKKwlpZiAob2JqIGluc3RhbmNlb2YgSW50ZXJydXB0ZWRFeGNlcHRpb24pCisJICAgIFN5c3RlbS5leGl0KDEpOworCWlmIChlbmdpbmUuZ2V0UHJpbnRTdGFja1RyYWNlKCkuZXF1YWxzKCJvbiIpKQorCSAgICAoKEV4Y2VwdGlvbikgb2JqKS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgcmV0dXJuIGNvbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRyZWFkX3Rva2VuMF8zLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJHJlYWRfdG9rZW4wXzMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWZlYzA1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRyZWFkX3Rva2VuMF8zLmphdmEKQEAgLTAsMCArMSw5NSBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQgIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworaW1wb3J0IGphdmEuaW8uKjsKKy8qKgorICogPGNvZGU+JyRyZWFkX3Rva2VuMCcvMzwvY29kZT48YnI+CisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyAqIEBzaW5jZSAwLjcKKyAqLworY2xhc3MgUFJFRF8kcmVhZF90b2tlbjBfMyBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgVGVybSBhcmcxLCBhcmcyLCBhcmczOworICAKKyAgICBwdWJsaWMgUFJFRF8kcmVhZF90b2tlbjBfMyhUZXJtIGExLCBUZXJtIGEyLCBUZXJtIGEzLCBQcmVkaWNhdGUgY29udCl7IAorCWFyZzEgPSBhMTsKKwlhcmcyID0gYTI7CisJYXJnMyA9IGEzOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorICAgIHB1YmxpYyBQUkVEXyRyZWFkX3Rva2VuMF8zKCl7fQorICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCl7CisJYXJnMSA9IGFyZ3NbMF07CisJYXJnMiA9IGFyZ3NbMV07CisJYXJnMyA9IGFyZ3NbMl07CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMzsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlyZXR1cm4gIiRyZWFkX3Rva2VuMCgiICsgYXJnMSArICIsICIgKyBhcmcyICsgIiwiICsgYXJnMyArICIpIjsKKyAgICB9CisKKyAgICAvKiBUaGUgYTEgbXVzdCBiZSB1c2VyLCB1c2VyX2lucHV0LCBhbmQgCisgICAgICAgamF2YS5pby5QdXNoYmFja1JlYWRlciwgb3RoZXJ3aXNlIGZhaWxzLiAqLworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworCVRlcm0gYTEsIGEyLCBhMzsKKwlhMSA9IGFyZzE7CisJYTIgPSBhcmcyOworCWEzID0gYXJnMzsKKworCU9iamVjdCBzdHJlYW0gPSBudWxsOworCVN0cmluZ0J1ZmZlciBzOworCWludCB0eXBlOworCVRlcm0gdG9rZW47CisKKwkvLyBTX29yX2EKKwlhMSA9IGExLmRlcmVmZXJlbmNlKCk7IAorCWlmIChhMS5pc1ZhcmlhYmxlKCkpIHsKKwkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDEpOworCX0gZWxzZSBpZiAoYTEuaXNTeW1ib2woKSkgeworCSAgICBpZiAoISBlbmdpbmUuZ2V0U3RyZWFtTWFuYWdlcigpLmNvbnRhaW5zS2V5KGExKSkKKwkJdGhyb3cgbmV3IEV4aXN0ZW5jZUV4Y2VwdGlvbih0aGlzLCAxLCAic3RyZWFtIiwgYTEsICIiKTsKKwkgICAgc3RyZWFtID0gKChKYXZhT2JqZWN0VGVybSkgZW5naW5lLmdldFN0cmVhbU1hbmFnZXIoKS5nZXQoYTEpKS5vYmplY3QoKTsKKwl9IGVsc2UgaWYgKGExLmlzSmF2YU9iamVjdCgpKSB7CisJICAgIHN0cmVhbSA9ICgoSmF2YU9iamVjdFRlcm0pIGExKS5vYmplY3QoKTsKKwl9IGVsc2UgeworCSAgICB0aHJvdyBuZXcgSWxsZWdhbERvbWFpbkV4Y2VwdGlvbih0aGlzLCAxLCAic3RyZWFtX29yX2FsaWFzIiwgYTEpOworCX0KKwlpZiAoISAoc3RyZWFtIGluc3RhbmNlb2YgUHVzaGJhY2tSZWFkZXIpKQorCSAgICB0aHJvdyBuZXcgUGVybWlzc2lvbkV4Y2VwdGlvbih0aGlzLCAiaW5wdXQiLCAic3RyZWFtIiwgYTEsICIiKTsKKwkvLyByZWFkIHRva2VuCisJcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwl0cnkgeworCSAgICB0eXBlID0gVG9rZW4ucmVhZF90b2tlbihzLCAoUHVzaGJhY2tSZWFkZXIpc3RyZWFtKTsKKwkgICAgc3dpdGNoKHR5cGUpIHsKKwkgICAgY2FzZSAnSSc6CisJCXRva2VuID0gbmV3IEludGVnZXJUZXJtKEludGVnZXIucGFyc2VJbnQocy50b1N0cmluZygpKSk7IAorCQlicmVhazsKKwkgICAgY2FzZSAnRCc6CisJCXRva2VuID0gbmV3IERvdWJsZVRlcm0oRG91YmxlLnBhcnNlRG91YmxlKHMudG9TdHJpbmcoKSkpOyAKKwkJYnJlYWs7CisJICAgIGNhc2UgJ1MnOgorCQljaGFyW10gY2hhcnMgPSAocy50b1N0cmluZygpKS50b0NoYXJBcnJheSgpOworCQl0b2tlbiA9IFByb2xvZy5OaWw7CisJCWZvciAoaW50IGk9Y2hhcnMubGVuZ3RoOyBpPjA7IGktLSl7CisJCSAgICB0b2tlbiA9IG5ldyBMaXN0VGVybShuZXcgSW50ZWdlclRlcm0oKGludCljaGFyc1tpLTFdKSwgdG9rZW4pOworCQl9CisJCWJyZWFrOworCSAgICBkZWZhdWx0IDoKKwkJdG9rZW4gPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2wocy50b1N0cmluZygpKTsKKwkJYnJlYWs7CisJICAgIH0KKwl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAxLCBlKTsKKwl9CisJaWYgKCEgYTIudW5pZnkobmV3IEludGVnZXJUZXJtKHR5cGUpLCBlbmdpbmUudHJhaWwpKQorCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKwlpZiAoISBhMy51bmlmeSh0b2tlbiwgZW5naW5lLnRyYWlsKSkKKwkgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJcmV0dXJuIGNvbnQ7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJHNldF9leGNlcHRpb25fMS5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRzZXRfZXhjZXB0aW9uXzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWJmOGRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyRzZXRfZXhjZXB0aW9uXzEuamF2YQpAQCAtMCwwICsxLDM3IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCAganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisvKioKKyAqIDxjb2RlPickc2V0X2V4Y2VwdGlvbicvMTwvY29kZT48YnI+CisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyAqLworY2xhc3MgUFJFRF8kc2V0X2V4Y2VwdGlvbl8xIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICAgVGVybSBhcmcxOworCisgICAgcHVibGljIFBSRURfJHNldF9leGNlcHRpb25fMShUZXJtIGExLCBQcmVkaWNhdGUgY29udCkgeworCWFyZzEgPSBhMTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEXyRzZXRfZXhjZXB0aW9uXzEoKSB7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KXsKKwlhcmcxID0gYXJnc1swXTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAxOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gIiRzZXRfZXhjZXB0aW9uKCIgKyBhcmcxICsgIikiOyB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKwlUZXJtIGExOworCWExID0gYXJnMTsKKworCWExID0gYTEuZGVyZWZlcmVuY2UoKTsKKwllbmdpbmUuc2V0RXhjZXB0aW9uKGExKTsKKwlyZXR1cm4gY29udDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJHNldF9wcm9sb2dfaW1wbF9mbGFnXzIuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kc2V0X3Byb2xvZ19pbXBsX2ZsYWdfMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MGNjMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJHNldF9wcm9sb2dfaW1wbF9mbGFnXzIuamF2YQpAQCAtMCwwICsxLDcxIEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKKy8qKgorICAgPGNvZGU+JyRzZXRfcHJvbG9nX2ltcGxfZmxhZycvMjwvY29kZT48YnI+CisgICBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAgIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgICBAdmVyc2lvbiAxLjAKKyovCitjbGFzcyBQUkVEXyRzZXRfcHJvbG9nX2ltcGxfZmxhZ18yIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBDSEFSX0NPTlZFUlNJT04gICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiY2hhcl9jb252ZXJzaW9uIik7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gREVCVUcgICAgICAgICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woImRlYnVnIik7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gVU5LTk9XTiAgICAgICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woInVua25vd24iKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBET1VCTEVfUVVPVEVTICAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiZG91YmxlX3F1b3RlcyIpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFBSSU5UX1NUQUNLX1RSQUNFID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJwcmludF9zdGFja190cmFjZSIpOworCisgICAgcHVibGljIFRlcm0gYXJnMSwgYXJnMjsKKworICAgIHB1YmxpYyBQUkVEXyRzZXRfcHJvbG9nX2ltcGxfZmxhZ18yKFRlcm0gYTEsIFRlcm0gYTIsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhMTsKKyAgICAgICAgYXJnMiA9IGEyOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEXyRzZXRfcHJvbG9nX2ltcGxfZmxhZ18yKCl7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhcmdzWzBdOworICAgICAgICBhcmcyID0gYXJnc1sxXTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMjsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICIkc2V0X3Byb2xvZ19pbXBsX2ZsYWcoIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworICAgICAgICBUZXJtIGExLCBhMjsKKyAgICAgICAgYTEgPSBhcmcxOworICAgICAgICBhMiA9IGFyZzI7CisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOworCWEyID0gYTIuZGVyZWZlcmVuY2UoKTsKKworCWlmIChhMS5lcXVhbHMoQ0hBUl9DT05WRVJTSU9OKSkgeworCSAgICBpZiAoISBhMi5pc1N5bWJvbCgpKQorCQlyZXR1cm4gZW5naW5lLmZhaWwoKTsKKwkgICAgZW5naW5lLnNldENoYXJDb252ZXJzaW9uKCgoU3ltYm9sVGVybSlhMikubmFtZSgpKTsKKwl9IGVsc2UgaWYgKGExLmVxdWFscyhERUJVRykpIHsKKwkgICAgaWYgKCEgYTIuaXNTeW1ib2woKSkKKwkJcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJICAgIGVuZ2luZS5zZXREZWJ1ZygoKFN5bWJvbFRlcm0pYTIpLm5hbWUoKSk7CisJfSBlbHNlIGlmIChhMS5lcXVhbHMoVU5LTk9XTikpIHsKKwkgICAgaWYgKCEgYTIuaXNTeW1ib2woKSkKKwkJcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJICAgIGVuZ2luZS5zZXRVbmtub3duKCgoU3ltYm9sVGVybSlhMikubmFtZSgpKTsKKwl9IGVsc2UgaWYgKGExLmVxdWFscyhET1VCTEVfUVVPVEVTKSkgeworCSAgICBpZiAoISBhMi5pc1N5bWJvbCgpKQorCQlyZXR1cm4gZW5naW5lLmZhaWwoKTsKKwkgICAgZW5naW5lLnNldERvdWJsZVF1b3RlcygoKFN5bWJvbFRlcm0pYTIpLm5hbWUoKSk7CisJfSBlbHNlIGlmIChhMS5lcXVhbHMoUFJJTlRfU1RBQ0tfVFJBQ0UpKSB7CisJICAgIGlmICghIGEyLmlzU3ltYm9sKCkpCisJCXJldHVybiBlbmdpbmUuZmFpbCgpOworCSAgICBlbmdpbmUuc2V0UHJpbnRTdGFja1RyYWNlKCgoU3ltYm9sVGVybSlhMikubmFtZSgpKTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKwl9CisgICAgICAgIHJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kc3RhdGlzdGljc18yLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJHN0YXRpc3RpY3NfMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMjRjNWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJHN0YXRpc3RpY3NfMi5qYXZhCkBAIC0wLDAgKzEsNzggQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKKy8qKgorICAgPGNvZGU+JyRzdGF0aXN0aWNzJy8yPC9jb2RlPjxicj4KKyAgIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICAgQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAgIEB2ZXJzaW9uIDEuMAorKi8KK2NsYXNzIFBSRURfJHN0YXRpc3RpY3NfMiBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgcHVibGljIHN0YXRpYyBTeW1ib2xUZXJtIE5pbCAgICAgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJbXSIpOworICAgIHB1YmxpYyBzdGF0aWMgU3ltYm9sVGVybSBTWU1fUlVOVElNRSA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgicnVudGltZSIpOworICAgIHB1YmxpYyBzdGF0aWMgU3ltYm9sVGVybSBTWU1fVFJBSUwgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgidHJhaWwiKTsKKyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFRlcm0gU1lNX0NIT0lDRSAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woImNob2ljZSIpOworCisgICAgVGVybSBhcmcxLCBhcmcyOworCisgICAgcHVibGljIFBSRURfJHN0YXRpc3RpY3NfMihUZXJtIGExLCBUZXJtIGEyLCBQcmVkaWNhdGUgY29udCl7CisJYXJnMSA9IGExOworCWFyZzIgPSBhMjsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKyAgICBwdWJsaWMgUFJFRF8kc3RhdGlzdGljc18yKCl7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KXsKKwlhcmcxID0gYXJnc1swXTsKKwlhcmcyID0gYXJnc1sxXTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAyIDsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpeyByZXR1cm4gIiRzdGF0aXN0aWNzKCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIpIjsgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKwlUZXJtIGExLCBhMjsKKwlhMSA9IGFyZzE7CisJYTIgPSBhcmcyOworCVRlcm0gcmVzdWx0ID0gbnVsbDsKKworCWExID0gYTEuZGVyZWZlcmVuY2UoKTsKKwlpZiAoYTEuaXNWYXJpYWJsZSgpKSB7CisJICAgIHRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAxKTsKKwl9IGVsc2UgaWYgKCEgYTEuaXNTeW1ib2woKSkgeworCSAgICB0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMSwgImF0b20iLCBhMSk7CisJfSBlbHNlIGlmIChhMS5lcXVhbHMoU1lNX1JVTlRJTUUpKSB7CisJICAgIGxvbmcgdmFsMSwgdmFsMjsKKwkgICAgVGVybSBzdGFydCwgcHJldmlvdXM7CisJICAgIHZhbDEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGVuZ2luZS5nZXRTdGFydFJ1bnRpbWUoKTsKKwkgICAgdmFsMiA9IHZhbDEgLSBlbmdpbmUuZ2V0UHJldmlvdXNSdW50aW1lKCk7CisJICAgIGVuZ2luZS5zZXRQcmV2aW91c1J1bnRpbWUodmFsMSk7CisJICAgIHN0YXJ0ICAgID0gbmV3IEludGVnZXJUZXJtKChpbnQpdmFsMSk7CisJICAgIHByZXZpb3VzID0gbmV3IEludGVnZXJUZXJtKChpbnQpdmFsMik7CisJICAgIHJlc3VsdCAgID0gbmV3IExpc3RUZXJtKHN0YXJ0LCBuZXcgTGlzdFRlcm0ocHJldmlvdXMsIE5pbCkpOworCX0gZWxzZSBpZiAoYTEuZXF1YWxzKFNZTV9UUkFJTCkpIHsKKwkgICAgaW50IHRvcCwgbWF4OworCSAgICBUZXJtIGZyZWUsIHVzZWQ7CisJICAgIHRvcCAgICA9IGVuZ2luZS50cmFpbC50b3AoKTsKKwkgICAgbWF4ICAgID0gZW5naW5lLnRyYWlsLm1heCgpOworCSAgICB1c2VkICAgPSBuZXcgSW50ZWdlclRlcm0odG9wKTsKKwkgICAgZnJlZSAgID0gbmV3IEludGVnZXJUZXJtKG1heCAtIHRvcCk7CisJICAgIHJlc3VsdCA9IG5ldyBMaXN0VGVybSh1c2VkLCBuZXcgTGlzdFRlcm0oZnJlZSwgTmlsKSk7CisJfSBlbHNlIGlmIChhMS5lcXVhbHMoU1lNX0NIT0lDRSkpIHsKKwkgICAgaW50IHRvcCwgbWF4OworCSAgICBUZXJtIGZyZWUsIHVzZWQ7CisJICAgIHRvcCAgICA9IGVuZ2luZS5zdGFjay50b3AoKTsKKwkgICAgbWF4ICAgID0gZW5naW5lLnN0YWNrLm1heCgpOworCSAgICB1c2VkICAgPSBuZXcgSW50ZWdlclRlcm0odG9wKTsKKwkgICAgZnJlZSAgID0gbmV3IEludGVnZXJUZXJtKG1heCAtIHRvcCk7CisJICAgIHJlc3VsdCA9IG5ldyBMaXN0VGVybSh1c2VkLCBuZXcgTGlzdFRlcm0oZnJlZSwgTmlsKSk7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJfQorCWlmICghIGEyLnVuaWZ5KHJlc3VsdCwgZW5naW5lLnRyYWlsKSkgCisJICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOworCXJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kdGVybV9oYXNoXzIuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kdGVybV9oYXNoXzIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjYxOTRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyR0ZXJtX2hhc2hfMi5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKKy8qKgorICogPGNvZGU+JyR0ZXJtX2hhc2gnLzI8L2NvZGU+PGJyPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4xCisgKi8KK3B1YmxpYyBjbGFzcyBQUkVEXyR0ZXJtX2hhc2hfMiBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgVGVybSBhcmcxLCBhcmcyOworCisgICAgcHVibGljIFBSRURfJHRlcm1faGFzaF8yKFRlcm0gYTEsIFRlcm0gYTIsIFByZWRpY2F0ZSBjb250KSB7CisJYXJnMSA9IGExOworCWFyZzIgPSBhMjsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEXyR0ZXJtX2hhc2hfMigpIHt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpeworCWFyZzEgPSBhcmdzWzBdOworCWFyZzIgPSBhcmdzWzFdOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDI7fQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuICIkdGVybV9oYXNoKCIgKyBhcmcxICsgIiwgIiArIGFyZzIgKyAiKSI7IH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworCVRlcm0gYTEsIGEyOworICAgICAgICBhMSA9IGFyZzE7CisgICAgICAgIGEyID0gYXJnMjsKKworCWExID0gYTEuZGVyZWZlcmVuY2UoKTsgCisJaWYgKCEgYTIudW5pZnkobmV3IEludGVnZXJUZXJtKGExLmhhc2hDb2RlKCkpLCBlbmdpbmUudHJhaWwpKQorCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKwlyZXR1cm4gY29udDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfJHVuaXZfMi5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyR1bml2XzIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDBhYjdjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyR1bml2XzIuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisvKioKKyAgIDxjb2RlPickdW5pdicvMjwvY29kZT48YnI+CisgICBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAgIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgICBAdmVyc2lvbiAxLjAKKyovCitwdWJsaWMgY2xhc3MgUFJFRF8kdW5pdl8yIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fRE9UID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCIuIik7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gU1lNX05JTCA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiW10iKTsKKyAgICBwdWJsaWMgVGVybSBhcmcxLCBhcmcyOworCisgICAgcHVibGljIFBSRURfJHVuaXZfMihUZXJtIGExLCBUZXJtIGEyLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYTE7CisgICAgICAgIGFyZzIgPSBhMjsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF8kdW5pdl8yKCl7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhcmdzWzBdOworICAgICAgICBhcmcyID0gYXJnc1sxXTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMjsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICI9Li4oIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworICAgICAgICBUZXJtIGExLCBhMjsKKyAgICAgICAgYTEgPSBhcmcxOworICAgICAgICBhMiA9IGFyZzI7CisKKwlhMSA9IGExLmRlcmVmZXJlbmNlKCk7CisJaWYgKGExLmlzU3ltYm9sKCkgfHwgYTEuaXNOdW1iZXIoKSB8fCBhMS5pc0phdmFPYmplY3QoKSB8fCBhMS5pc0Nsb3N1cmUoKSkgeworCSAgICBpZiAoISBhMi51bmlmeShuZXcgTGlzdFRlcm0oYTEsIFNZTV9OSUwpLCBlbmdpbmUudHJhaWwpKQorCQlyZXR1cm4gZW5naW5lLmZhaWwoKTsKKwl9IGVsc2UgaWYgKGExLmlzTGlzdCgpKSB7CisJICAgIFRlcm0gdCA9IG5ldyBMaXN0VGVybSgoKExpc3RUZXJtKWExKS5jZHIoKSwgU1lNX05JTCk7CisJICAgIHQgPSBuZXcgTGlzdFRlcm0oKChMaXN0VGVybSlhMSkuY2FyKCksIHQpOworCSAgICB0ID0gbmV3IExpc3RUZXJtKFNZTV9ET1QsIHQpOworCSAgICBpZiAoISBhMi51bmlmeSh0LCBlbmdpbmUudHJhaWwpKQorCQlyZXR1cm4gZW5naW5lLmZhaWwoKTsKKwl9IGVsc2UgaWYgKGExLmlzU3RydWN0dXJlKCkpIHsKKwkgICAgU3ltYm9sVGVybSBzeW0gPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woKChTdHJ1Y3R1cmVUZXJtKWExKS5mdW5jdG9yKCkubmFtZSgpKTsKKwkgICAgVGVybVtdIGFyZ3MgPSAoKFN0cnVjdHVyZVRlcm0pYTEpLmFyZ3MoKTsKKwkgICAgVGVybSB0ID0gU1lNX05JTDsKKwkgICAgZm9yIChpbnQgaT1hcmdzLmxlbmd0aDsgaT4wOyBpLS0pCisJCXQgPSBuZXcgTGlzdFRlcm0oYXJnc1tpLTFdLCB0KTsKKwkgICAgaWYgKCEgYTIudW5pZnkobmV3IExpc3RUZXJtKHN5bSwgdCksIGVuZ2luZS50cmFpbCkpCisJCXJldHVybiBlbmdpbmUuZmFpbCgpOworCX0gZWxzZSBpZiAoYTEuaXNWYXJpYWJsZSgpKSB7CisJICAgIGEyID0gYTIuZGVyZWZlcmVuY2UoKTsKKwkgICAgaWYgKGEyLmlzVmFyaWFibGUoKSkKKwkJdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDIpOworCSAgICBlbHNlIGlmIChhMi5lcXVhbHMoU1lNX05JTCkpCisJCXRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDIsICJub25fZW1wdHlfbGlzdCIsIGEyKTsKKwkgICAgZWxzZSBpZiAoISBhMi5pc0xpc3QoKSkKKwkJdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJsaXN0IiwgYTIpOworCSAgICBUZXJtIGhlYWQgPSAoKExpc3RUZXJtKWEyKS5jYXIoKS5kZXJlZmVyZW5jZSgpOworCSAgICBUZXJtIHRhaWwgPSAoKExpc3RUZXJtKWEyKS5jZHIoKS5kZXJlZmVyZW5jZSgpOworCSAgICBpZiAoaGVhZC5pc1ZhcmlhYmxlKCkpCisJCXRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAyKTsKKwkgICAgaWYgKHRhaWwuZXF1YWxzKFNZTV9OSUwpKSB7CisJCWlmIChoZWFkLmlzU3ltYm9sKCkgfHwgaGVhZC5pc051bWJlcigpIHx8IGhlYWQuaXNKYXZhT2JqZWN0KCkgfHwgaGVhZC5pc0Nsb3N1cmUoKSkgeworCQkgICAgaWYgKCEgYTEudW5pZnkoaGVhZCwgZW5naW5lLnRyYWlsKSkKKwkJCXJldHVybiBlbmdpbmUuZmFpbCgpOworCQkgICAgcmV0dXJuIGNvbnQ7CisJCX0gZWxzZSB7CisJCSAgICB0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMiwgImF0b21pYyIsIGhlYWQpOworCQl9CisJICAgIH0KKwkgICAgaWYgKCEgaGVhZC5pc1N5bWJvbCgpKQorCQl0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMiwgImF0b20iLCBoZWFkKTsKKwkgICAgVGVybSB4ID0gdGFpbDsKKwkgICAgd2hpbGUoISB4LmVxdWFscyhTWU1fTklMKSkgeworCQlpZiAoeC5pc1ZhcmlhYmxlKCkpCisJCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMik7CisJCWlmICghIHguaXNMaXN0KCkpCisJCSAgICB0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMiwgImxpc3QiLCBhMik7CisJCXggPSAoKExpc3RUZXJtKXgpLmNkcigpLmRlcmVmZXJlbmNlKCk7CisJICAgIH0KKwkgICAgaW50IG4gPSAoKExpc3RUZXJtKWEyKS5sZW5ndGgoKSAtIDE7CisJICAgIFN5bWJvbFRlcm0gc3ltID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCgoU3ltYm9sVGVybSloZWFkKS5uYW1lKCksIG4pOworCSAgICBUZXJtW10gYXJncyA9IG5ldyBUZXJtW25dOworCSAgICBmb3IoaW50IGk9MDsgaTxuOyBpKyspIHsKKwkJYXJnc1tpXSA9ICgoTGlzdFRlcm0pdGFpbCkuY2FyKCkuZGVyZWZlcmVuY2UoKTsKKwkJdGFpbCA9ICgoTGlzdFRlcm0pdGFpbCkuY2RyKCkuZGVyZWZlcmVuY2UoKTsKKwkgICAgfQorCSAgICBpZiAoISBhMS51bmlmeShuZXcgU3RydWN0dXJlVGVybShzeW0sIGFyZ3MpLCBlbmdpbmUudHJhaWwpKQorCQlyZXR1cm4gZW5naW5lLmZhaWwoKTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKwl9CisgICAgICAgIHJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kd3JpdGVfdG9TdHJpbmdfMi5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEXyR3cml0ZV90b1N0cmluZ18yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE0NWMzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF8kd3JpdGVfdG9TdHJpbmdfMi5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworLyoqCisgKiA8Y29kZT4nJHdyaXRlX3RvU3RyaW5nJy8yPC9jb2RlPjxicj4KKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMAorICovCitjbGFzcyBQUkVEXyR3cml0ZV90b1N0cmluZ18yIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICBUZXJtIGFyZzEsIGFyZzI7CisKKyAgICBwdWJsaWMgUFJFRF8kd3JpdGVfdG9TdHJpbmdfMihUZXJtIGExLCBUZXJtIGEyLCBQcmVkaWNhdGUgY29udCkgeworCWFyZzEgPSBhMTsKKwlhcmcyID0gYTI7CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF8kd3JpdGVfdG9TdHJpbmdfMigpIHt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpeworCWFyZzEgPSBhcmdzWzBdOworCWFyZzIgPSBhcmdzWzFdOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDI7fQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuICIkd3JpdGVfdG9TdHJpbmcoIiArIGFyZzEgKyAiLCAiICsgYXJnMiArICIpIjsgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisJVGVybSBhMSwgYTI7CisgICAgICAgIGExID0gYXJnMTsKKyAgICAgICAgYTIgPSBhcmcyOworCU9iamVjdCBzdHJlYW0gPSBudWxsOworCisJLy8gU19vcl9hCisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOyAKKwlpZiAoYTEuaXNWYXJpYWJsZSgpKSB7CisJICAgIHRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAxKTsKKwl9IGVsc2UgaWYgKGExLmlzU3ltYm9sKCkpIHsKKwkgICAgaWYgKCEgZW5naW5lLmdldFN0cmVhbU1hbmFnZXIoKS5jb250YWluc0tleShhMSkpCisJCXRocm93IG5ldyBFeGlzdGVuY2VFeGNlcHRpb24odGhpcywgMSwgInN0cmVhbSIsIGExLCAiIik7CisJICAgIHN0cmVhbSA9ICgoSmF2YU9iamVjdFRlcm0pIGVuZ2luZS5nZXRTdHJlYW1NYW5hZ2VyKCkuZ2V0KGExKSkub2JqZWN0KCk7CisJfSBlbHNlIGlmIChhMS5pc0phdmFPYmplY3QoKSkgeworCSAgICBzdHJlYW0gPSAoKEphdmFPYmplY3RUZXJtKSBhMSkub2JqZWN0KCk7CisJfSBlbHNlIHsKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxEb21haW5FeGNlcHRpb24odGhpcywgMSwgInN0cmVhbV9vcl9hbGlhcyIsIGExKTsKKwl9CisJaWYgKCEgKHN0cmVhbSBpbnN0YW5jZW9mIFByaW50V3JpdGVyKSkKKwkgICAgdGhyb3cgbmV3IFBlcm1pc3Npb25FeGNlcHRpb24odGhpcywgIm91dHB1dCIsICJzdHJlYW0iLCBhMSwgIiIpOworCWEyID0gYTIuZGVyZWZlcmVuY2UoKTsgCisJaWYgKCEgYTIuaXNKYXZhT2JqZWN0KCkpCisJICAgIHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAyLCAiamF2YSIsIGEyKTsKKwkvLyBwcmludCBqYXZhCisJKChQcmludFdyaXRlcikgc3RyZWFtKS5wcmludCgoKEphdmFPYmplY3RUZXJtKWEyKS5vYmplY3QoKS50b1N0cmluZygpKTsKKwlyZXR1cm4gY29udDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfYXJnXzMuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9hcmdfMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNmVmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfYXJnXzMuamF2YQpAQCAtMCwwICsxLDcwIEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCAganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisvKioKKyAqIDxjb2RlPmFyZy8zPC9jb2RlPjxicj4KKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgUFJFRF9hcmdfMyBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgVGVybSBhcmcxLCBhcmcyLCBhcmczOworCisgICAgcHVibGljIFBSRURfYXJnXzMoVGVybSBhMSwgVGVybSBhMiwgVGVybSBhMywgUHJlZGljYXRlIGNvbnQpIHsKKwlhcmcxID0gYTE7CisJYXJnMiA9IGEyOworCWFyZzMgPSBhMzsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEX2FyZ18zKCl7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KXsKKwlhcmcxID0gYXJnc1swXTsKKwlhcmcyID0gYXJnc1sxXTsKKwlhcmczID0gYXJnc1syXTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAzIDsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuICJhcmcoIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIiwiICsgYXJnMyArICIpIjsgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisJVGVybSBhMSwgYTIsIGEzOworCWExID0gYXJnMTsKKwlhMiA9IGFyZzI7CisJYTMgPSBhcmczOworCisJVGVybVtdIGFyZ3M7CisJaW50IGFyaXR5LCBhcmdObzsKKworCWExID0gYTEuZGVyZWZlcmVuY2UoKTsKKwlpZihhMS5pc1ZhcmlhYmxlKCkpCisJICAgIHRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAxKTsKKwllbHNlIGlmKCEgYTEuaXNJbnRlZ2VyKCkpCisJICAgIHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAxLCAiaW50ZWdlciIsIGExKTsKKwlhMiA9IGEyLmRlcmVmZXJlbmNlKCk7CisJaWYgKGEyLmlzTGlzdCgpKSB7CisJICAgIGFyZ3MgPSBuZXcgVGVybVsyXTsKKwkgICAgYXJnc1swXSA9ICgoTGlzdFRlcm0pYTIpLmNhcigpOworCSAgICBhcmdzWzFdID0gKChMaXN0VGVybSlhMikuY2RyKCk7CisJICAgIGFyaXR5ID0gMjsKKwl9IGVsc2UgaWYgKGEyLmlzU3RydWN0dXJlKCkpIHsKKwkgICAgYXJncyA9ICAoKFN0cnVjdHVyZVRlcm0pYTIpLmFyZ3MoKTsKKwkgICAgYXJpdHkgPSAoKFN0cnVjdHVyZVRlcm0pYTIpLmFyaXR5KCk7CisJfSBlbHNlIGlmIChhMi5pc1ZhcmlhYmxlKCkpIHsKKwkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDIpOworCX0gZWxzZSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAyLCAiY29tcG91bmQiLCBhMik7CisJfQorCWFyZ05vID0gKChJbnRlZ2VyVGVybSlhMSkuaW50VmFsdWUoKTsKKwlpZiAoYXJnTm8gPCAwKQorCSAgICB0aHJvdyBuZXcgSWxsZWdhbERvbWFpbkV4Y2VwdGlvbih0aGlzLCAxLCAibm90X2xlc3NfdGhhbl96ZXJvIiwgYTEpOworCWlmIChhcmdObyA+IGFyaXR5IHx8IGFyZ05vIDwgMSkKKwkgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJaWYgKCEgYTMudW5pZnkoYXJnc1thcmdOby0xXSwgZW5naW5lLnRyYWlsKSkgCisJICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOworCXJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9hdG9tX2NoYXJzXzIuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9hdG9tX2NoYXJzXzIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzU4YjdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2F0b21fY2hhcnNfMi5qYXZhCkBAIC0wLDAgKzEsODIgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKKy8qKgorICogPGNvZGU+YXRvbV9jaGFycy8yPC9jb2RlPjxicj4KKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMQorICovCitwdWJsaWMgY2xhc3MgUFJFRF9hdG9tX2NoYXJzXzIgZXh0ZW5kcyBQcmVkaWNhdGUgeworICAgIHN0YXRpYyBTeW1ib2xUZXJtIE5pbCA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiW10iKTsKKyAgICBUZXJtIGFyZzEsIGFyZzI7CisKKyAgICBwdWJsaWMgUFJFRF9hdG9tX2NoYXJzXzIoVGVybSBhMSwgVGVybSBhMiwgUHJlZGljYXRlIGNvbnQpIHsKKwlhcmcxID0gYTE7CisJYXJnMiA9IGEyOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfYXRvbV9jaGFyc18yKCkge30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCl7CisJYXJnMSA9IGFyZ3NbMF07CisJYXJnMiA9IGFyZ3NbMV07CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMiA7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiAiYXRvbV9jaGFycygiICsgYXJnMSArICIsIiArIGFyZzIgKyAiKSI7IH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworCVRlcm0gYTEsIGEyOworCWExID0gYXJnMTsKKwlhMiA9IGFyZzI7CisKKwlhMSA9IGExLmRlcmVmZXJlbmNlKCk7CisJYTIgPSBhMi5kZXJlZmVyZW5jZSgpOworCWlmIChhMS5pc1ZhcmlhYmxlKCkpIHsgLy8gYXRvbV9jaGFycygtQXRvbSwgK0NoYXJMaXN0KQorCSAgICBpZiAoYTIuaXNOaWwoKSkgeworCQlpZiAoISBhMS51bmlmeShTeW1ib2xUZXJtLm1ha2VTeW1ib2woIiIpLCBlbmdpbmUudHJhaWwpKQorCQkgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJCXJldHVybiBjb250OworCSAgICB9IGVsc2UgaWYgKGEyLmlzVmFyaWFibGUoKSkgeworCQl0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMik7CisJICAgIH0gZWxzZSBpZiAoISBhMi5pc0xpc3QoKSkgeworCQl0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMiwgImxpc3QiLCBhMik7CisJICAgIH0KKwkgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCSAgICBUZXJtIHggPSBhMjsKKwkgICAgd2hpbGUoISB4LmlzTmlsKCkpIHsKKwkJaWYgKHguaXNWYXJpYWJsZSgpKQorCQkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDIpOworCQlpZiAoISB4LmlzTGlzdCgpKQorCQkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJsaXN0IiwgYTIpOworCQlUZXJtIGNhciA9ICgoTGlzdFRlcm0peCkuY2FyKCkuZGVyZWZlcmVuY2UoKTsKKwkJaWYgKGNhci5pc1ZhcmlhYmxlKCkpCisJCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMik7CisJCWlmICghIGNhci5pc1N5bWJvbCgpIHx8ICgoU3ltYm9sVGVybSljYXIpLm5hbWUoKS5sZW5ndGgoKSAhPSAxKQorCQkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJjaGFyYWN0ZXIiLCBhMik7CisJCXNiLmFwcGVuZCgoKFN5bWJvbFRlcm0pY2FyKS5uYW1lKCkpOworCQl4ID0gKChMaXN0VGVybSl4KS5jZHIoKS5kZXJlZmVyZW5jZSgpOworCSAgICB9CisJICAgIGlmICghIGExLnVuaWZ5KFN5bWJvbFRlcm0ubWFrZVN5bWJvbChzYi50b1N0cmluZygpKSwgZW5naW5lLnRyYWlsKSkKKwkJcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJICAgIHJldHVybiBjb250OworCX0gZWxzZSBpZiAoYTIuaXNOaWwoKSB8fCBhMi5pc1ZhcmlhYmxlKCkgfHwgYTIuaXNMaXN0KCkpIHsgLy8gYXRvbV9jaGFycygrQXRvbSwgP0NoYXJMaXN0KQorCSAgICBpZiAoISBhMS5pc1N5bWJvbCgpKQorCQl0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMSwgImF0b20iLCBhMSk7CisJICAgIFN0cmluZyBzID0gKChTeW1ib2xUZXJtKWExKS5uYW1lKCk7CisJICAgIFRlcm0geCA9IE5pbDsKKwkgICAgZm9yIChpbnQgaT1zLmxlbmd0aCgpOyBpPjA7IGktLSkgeworCQl4ID0gbmV3IExpc3RUZXJtKFN5bWJvbFRlcm0ubWFrZVN5bWJvbChzLnN1YnN0cmluZyhpLTEsaSkpLCB4KTsKKwkgICAgfQorCSAgICBpZighIGEyLnVuaWZ5KHgsIGVuZ2luZS50cmFpbCkpIAorCQlyZXR1cm4gZW5naW5lLmZhaWwoKTsKKwkgICAgcmV0dXJuIGNvbnQ7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9hdG9tX2NvZGVzXzIuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9hdG9tX2NvZGVzXzIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjQ3OTFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2F0b21fY29kZXNfMi5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKKy8qKgorICogPGNvZGU+YXRvbV9jb2Rlcy8yPC9jb2RlPjxicj4KKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMQorICovCitwdWJsaWMgY2xhc3MgUFJFRF9hdG9tX2NvZGVzXzIgZXh0ZW5kcyBQcmVkaWNhdGUgeworICAgIHN0YXRpYyBTeW1ib2xUZXJtIE5pbCA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiW10iKTsKKyAgICBUZXJtIGFyZzEsIGFyZzI7CisKKyAgICBwdWJsaWMgUFJFRF9hdG9tX2NvZGVzXzIoVGVybSBhMSwgVGVybSBhMiwgUHJlZGljYXRlIGNvbnQpIHsKKwlhcmcxID0gYTE7CisJYXJnMiA9IGEyOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfYXRvbV9jb2Rlc18yKCkge30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCl7CisJYXJnMSA9IGFyZ3NbMF07CisJYXJnMiA9IGFyZ3NbMV07CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMiA7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiAiYXRvbV9jb2RlcygiICsgYXJnMSArICIsIiArIGFyZzIgKyAiKSI7IH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworCVRlcm0gYTEsIGEyOworCWExID0gYXJnMTsKKwlhMiA9IGFyZzI7CisKKwlhMSA9IGExLmRlcmVmZXJlbmNlKCk7CisJYTIgPSBhMi5kZXJlZmVyZW5jZSgpOworCWlmIChhMS5pc1ZhcmlhYmxlKCkpIHsgLy8gYXRvbV9jb2RlcygtQXRvbSwgK0NoYXJDb2RlTGlzdCkKKwkgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCSAgICBUZXJtIHggPSBhMjsKKwkgICAgd2hpbGUoISB4LmlzTmlsKCkpIHsKKwkJaWYgKHguaXNWYXJpYWJsZSgpKQorCQkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDIpOworCQlpZiAoISB4LmlzTGlzdCgpKQorCQkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJsaXN0IiwgYTIpOworCQlUZXJtIGNhciA9ICgoTGlzdFRlcm0peCkuY2FyKCkuZGVyZWZlcmVuY2UoKTsKKwkJaWYgKGNhci5pc1ZhcmlhYmxlKCkpCisJCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMik7CisJCWlmICghIGNhci5pc0ludGVnZXIoKSkgCisJCSAgICB0aHJvdyBuZXcgUmVwcmVzZW50YXRpb25FeGNlcHRpb24odGhpcywgMiwgImNoYXJhY3Rlcl9jb2RlIik7CisJCS8vIGNhciBpcyBhbiBpbnRlZ2VyCisJCWludCBpID0gKChJbnRlZ2VyVGVybSljYXIpLmludFZhbHVlKCk7CisJCWlmICghIENoYXJhY3Rlci5pc0RlZmluZWQoKGNoYXIpaSkpCisJCSAgICB0aHJvdyBuZXcgUmVwcmVzZW50YXRpb25FeGNlcHRpb24odGhpcywgMiwgImNoYXJhY3Rlcl9jb2RlIik7CisJCXNiLmFwcGVuZCgoY2hhcilpKTsKKwkJeCA9ICgoTGlzdFRlcm0peCkuY2RyKCkuZGVyZWZlcmVuY2UoKTsKKwkgICAgfQorCSAgICBpZiAoISBhMS51bmlmeShTeW1ib2xUZXJtLm1ha2VTeW1ib2woc2IudG9TdHJpbmcoKSksIGVuZ2luZS50cmFpbCkpCisJCXJldHVybiBlbmdpbmUuZmFpbCgpOworCSAgICByZXR1cm4gY29udDsKKwl9IGVsc2UgeyAvLyBhdG9tX2NvZGVzKCtBdG9tLCA/Q2hhckNvZGVMaXN0KQorCSAgICBpZiAoISBhMS5pc1N5bWJvbCgpKQorCQl0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMSwgImF0b20iLCBhMSk7CisJICAgIGNoYXJbXSBjaGFycyA9ICgoU3ltYm9sVGVybSlhMSkubmFtZSgpLnRvQ2hhckFycmF5KCk7CisJICAgIFRlcm0geCA9IE5pbDsKKwkgICAgZm9yIChpbnQgaT1jaGFycy5sZW5ndGg7IGk+MDsgaS0tKSB7CisJCXggPSBuZXcgTGlzdFRlcm0obmV3IEludGVnZXJUZXJtKChpbnQpY2hhcnNbaS0xXSksIHgpOworCSAgICB9CisJICAgIGlmKCEgYTIudW5pZnkoeCwgZW5naW5lLnRyYWlsKSkgCisJCXJldHVybiBlbmdpbmUuZmFpbCgpOworCSAgICByZXR1cm4gY29udDsKKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2F0b21fY29uY2F0XzMuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9hdG9tX2NvbmNhdF8zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNkMjU0YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9hdG9tX2NvbmNhdF8zLmphdmEKQEAgLTAsMCArMSw3MyBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisvKioKKyAqIDxjb2RlPmF0b21fY29uY2F0LzM8L2NvZGU+PGJyPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisqLworcHVibGljIGNsYXNzIFBSRURfYXRvbV9jb25jYXRfMyBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gQUNfMiA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiYWMiLCAyKTsKKyAgICBwdWJsaWMgVGVybSBhcmcxLCBhcmcyLCBhcmczOworCisgICAgcHVibGljIFBSRURfYXRvbV9jb25jYXRfMyhUZXJtIGExLCBUZXJtIGEyLCBUZXJtIGEzLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYTE7CisgICAgICAgIGFyZzIgPSBhMjsKKyAgICAgICAgYXJnMyA9IGEzOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEX2F0b21fY29uY2F0XzMoKXt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGFyZ3NbMF07CisgICAgICAgIGFyZzIgPSBhcmdzWzFdOworICAgICAgICBhcmczID0gYXJnc1syXTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMzsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJhdG9tX2NvbmNhdCgiICsgYXJnMSArICIsIiArIGFyZzIgKyAiLCIgKyBhcmczICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworICAgICAgICBUZXJtIGExLCBhMiwgYTM7CisgICAgICAgIGExID0gYXJnMTsKKyAgICAgICAgYTIgPSBhcmcyOworICAgICAgICBhMyA9IGFyZzM7CisKKwlhMyA9IGEzLmRlcmVmZXJlbmNlKCk7CisJaWYgKGEzLmlzU3ltYm9sKCkpIHsKKwkgICAgU3RyaW5nIHN0cjMgPSAoKFN5bWJvbFRlcm0pYTMpLm5hbWUoKTsKKwkgICAgaW50IGVuZEluZGV4ID0gc3RyMy5sZW5ndGgoKTsKKwkgICAgVGVybSB0ID0gUHJvbG9nLk5pbDsKKwkgICAgZm9yIChpbnQgaT0wOyBpPD1lbmRJbmRleDsgaSsrKSB7CisJCVRlcm1bXSBhcmdzID0ge1N5bWJvbFRlcm0ubWFrZVN5bWJvbChzdHIzLnN1YnN0cmluZygwLCBpKSksCisJCQkgICAgICAgU3ltYm9sVGVybS5tYWtlU3ltYm9sKHN0cjMuc3Vic3RyaW5nKGksIGVuZEluZGV4KSl9OworCQl0ID0gbmV3IExpc3RUZXJtKG5ldyBTdHJ1Y3R1cmVUZXJtKEFDXzIsIGFyZ3MpLCB0KTsKKwkgICAgfQorCSAgICBUZXJtW10gYXJnczEyID0ge2ExLGEyfTsKKwkgICAgcmV0dXJuIG5ldyBQUkVEXyRtZW1iZXJfaW5fcmV2ZXJzZV8yKG5ldyBTdHJ1Y3R1cmVUZXJtKEFDXzIsIGFyZ3MxMiksIHQsIGNvbnQpOworCX0gZWxzZSBpZiAoISBhMy5pc1ZhcmlhYmxlKCkpIHsKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDMsICJhdG9tIiwgYTMpOworCX0KKwkvLyBhMyBpcyBhIHZhcmlhYmxlCisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOworCWEyID0gYTIuZGVyZWZlcmVuY2UoKTsKKwlpZiAoYTEuaXNWYXJpYWJsZSgpKQorCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMSk7CisJaWYgKGEyLmlzVmFyaWFibGUoKSkKKwkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDIpOworCWlmICghIGExLmlzU3ltYm9sKCkpCisJICAgIHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAxLCAiaW50ZWdlciIsIGExKTsKKwlpZiAoISBhMi5pc1N5bWJvbCgpKQorCSAgICB0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMiwgImludGVnZXIiLCBhMik7CisJU3RyaW5nIHN0cjMgPSAoKFN5bWJvbFRlcm0pIGExKS5uYW1lKCkuY29uY2F0KCgoU3ltYm9sVGVybSkgYTIpLm5hbWUoKSk7CisJaWYgKCEgYTMudW5pZnkoU3ltYm9sVGVybS5tYWtlU3ltYm9sKHN0cjMpLCBlbmdpbmUudHJhaWwpKQorCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKyAgICAgICAgcmV0dXJuIGNvbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2F0b21fbGVuZ3RoXzIuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9hdG9tX2xlbmd0aF8yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZjZDYzNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9hdG9tX2xlbmd0aF8yLmphdmEKQEAgLTAsMCArMSw2MiBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisvKioKKyAqIDxjb2RlPmF0b21fbGVuZ3QvMjwvY29kZT48YnI+CisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyovCitwdWJsaWMgY2xhc3MgUFJFRF9hdG9tX2xlbmd0aF8yIGV4dGVuZHMgUHJlZGljYXRlIHsKKworICAgIHB1YmxpYyBUZXJtIGFyZzEsIGFyZzI7CisKKyAgICBwdWJsaWMgUFJFRF9hdG9tX2xlbmd0aF8yKFRlcm0gYTEsIFRlcm0gYTIsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhMTsKKyAgICAgICAgYXJnMiA9IGEyOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEX2F0b21fbGVuZ3RoXzIoKXt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGFyZ3NbMF07CisgICAgICAgIGFyZzIgPSBhcmdzWzFdOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAyOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gImF0b21fbGVuZ3RoKCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIpIjsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKyAgICAgICAgVGVybSBhMSwgYTI7CisgICAgICAgIGExID0gYXJnMTsKKyAgICAgICAgYTIgPSBhcmcyOworCWludCBsZW5ndGg7CisKKwlhMSA9IGExLmRlcmVmZXJlbmNlKCk7CisJYTIgPSBhMi5kZXJlZmVyZW5jZSgpOworCisJaWYgKGExLmlzVmFyaWFibGUoKSkKKwkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDEpOworCWlmICghIGExLmlzU3ltYm9sKCkpCisJICAgIHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAxLCAiYXRvbSIsIGExKTsKKwlsZW5ndGggPSAoKFN5bWJvbFRlcm0pYTEpLm5hbWUoKS5sZW5ndGgoKTsKKwlpZiAoYTIuaXNWYXJpYWJsZSgpKSB7CisJICAgIGlmICghIGEyLnVuaWZ5KG5ldyBJbnRlZ2VyVGVybShsZW5ndGgpLCBlbmdpbmUudHJhaWwpKQorCQlyZXR1cm4gZW5naW5lLmZhaWwoKTsKKwl9IGVsc2UgaWYgKGEyLmlzSW50ZWdlcigpKSB7CisJICAgIGludCBuID0gKChJbnRlZ2VyVGVybSlhMikuaW50VmFsdWUoKTsKKwkgICAgaWYgKG4gPCAwKQorCQl0aHJvdyBuZXcgSWxsZWdhbERvbWFpbkV4Y2VwdGlvbih0aGlzLCAyLCAibm90X2xlc3NfdGhhbl96ZXJvIiwgYTIpOworCSAgICBpZiAobGVuZ3RoICE9IG4pCisJCXJldHVybiBlbmdpbmUuZmFpbCgpOworCX0gZWxzZSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAxLCAiaW50ZWdlciIsIGEyKTsKKwl9CisgICAgICAgIHJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9jaGFyX2NvZGVfMi5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2NoYXJfY29kZV8yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRmZTQwZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9jaGFyX2NvZGVfMi5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKKy8qKgorICogPGNvZGU+Y2hhcl9jb2RlLzI8L2NvZGU+PGJyPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBQUkVEX2NoYXJfY29kZV8yIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICAvLyAgICBzdGF0aWMgU3ltYm9sVGVybSBOaWwgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woIltdIik7CisgICAgVGVybSBhcmcxLCBhcmcyOworCisgICAgcHVibGljIFBSRURfY2hhcl9jb2RlXzIoVGVybSBhMSwgVGVybSBhMiwgUHJlZGljYXRlIGNvbnQpIHsKKwlhcmcxID0gYTE7CisJYXJnMiA9IGEyOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfY2hhcl9jb2RlXzIoKSB7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KXsKKwlhcmcxID0gYXJnc1swXTsKKwlhcmcyID0gYXJnc1sxXTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAyIDsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuICJjaGFyX2NvZGUoIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIikiOyB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKwlUZXJtIGExLCBhMjsKKwlhMSA9IGFyZzE7CisJYTIgPSBhcmcyOworCisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOworCWEyID0gYTIuZGVyZWZlcmVuY2UoKTsKKwlpZiAoYTEuaXNWYXJpYWJsZSgpKSB7IC8vIGNoYXJfY29kZSgtQ2hhciwgK0NoYXJDb2RlKQorCSAgICBpZiAoYTIuaXNWYXJpYWJsZSgpKSB7CisJCXRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAyKTsKKwkgICAgfSBlbHNlIGlmICghIGEyLmlzSW50ZWdlcigpKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAyLCAiaW50ZWdlciIsIGEyKTsKKwkgICAgfQorCSAgICBpbnQgaSA9ICgoSW50ZWdlclRlcm0pYTIpLmludFZhbHVlKCk7CisJICAgIGlmICghIENoYXJhY3Rlci5pc0RlZmluZWQoaSkpCisJCXRocm93IG5ldyBSZXByZXNlbnRhdGlvbkV4Y2VwdGlvbih0aGlzLCAyLCAiY2hhcmFjdGVyX2NvZGUiKTsKKwkgICAgaWYgKCEgYTEudW5pZnkoU3ltYm9sVGVybS5tYWtlU3ltYm9sKFN0cmluZy52YWx1ZU9mKChjaGFyKWkpKSwgZW5naW5lLnRyYWlsKSkKKwkJcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJfSBlbHNlIGlmIChhMS5pc1N5bWJvbCgpKSB7IC8vIGNoYXJfY29kZSgrQ2hhciwgP0NoYXJDb2RlKQorCSAgICBTdHJpbmcgcyA9ICgoU3ltYm9sVGVybSlhMSkubmFtZSgpOworCSAgICBpZiAocy5sZW5ndGgoKSAhPSAxKQorCQl0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMSwgImNoYXJhY3RlciIsIGExKTsKKwkgICAgaWYoISBhMi51bmlmeShuZXcgSW50ZWdlclRlcm0oKGludClzLmNoYXJBdCgwKSksIGVuZ2luZS50cmFpbCkpIAorCQlyZXR1cm4gZW5naW5lLmZhaWwoKTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKwl9CisJcmV0dXJuIGNvbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2Nsb3NlXzIuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9jbG9zZV8yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc2YzI0MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9jbG9zZV8yLmphdmEKQEAgLTAsMCArMSwxNDAgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0IGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworaW1wb3J0IGphdmEuaW8uKjsKKy8qKgorICogPGNvZGU+Y2xvc2UvMjwvY29kZT48YnI+CisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyovCitwdWJsaWMgY2xhc3MgUFJFRF9jbG9zZV8yIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFRlcm0gU1lNX0FMSUFTXzEgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woImFsaWFzIiwgMSk7CisgICAgcHVibGljIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9GT1JDRV8xID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJmb3JjZSIsIDEpOworICAgIHB1YmxpYyBzdGF0aWMgU3ltYm9sVGVybSBTWU1fVFJVRSAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgidHJ1ZSIpOworICAgIHB1YmxpYyBzdGF0aWMgU3ltYm9sVGVybSBTWU1fRkFMU0UgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiZmFsc2UiKTsKKyAgICBwdWJsaWMgVGVybSBhcmcxLCBhcmcyOworCisgICAgcHVibGljIFBSRURfY2xvc2VfMihUZXJtIGExLCBUZXJtIGEyLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYTE7CisgICAgICAgIGFyZzIgPSBhMjsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF9jbG9zZV8yKCl7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhcmdzWzBdOworICAgICAgICBhcmcyID0gYXJnc1sxXTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMjsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJjbG9zZSgiICsgYXJnMSArICIsIiArIGFyZzIgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisgICAgICAgIFRlcm0gYTEsIGEyOworICAgICAgICBhMSA9IGFyZzE7CisgICAgICAgIGEyID0gYXJnMjsKKworCWJvb2xlYW4gZm9yY2VGbGFnID0gZmFsc2U7CisJT2JqZWN0IHN0cmVhbSA9IG51bGw7CisKKwkvLyBjbG9zZSBvcHRpb25zCisJYTIgPSBhMi5kZXJlZmVyZW5jZSgpOworCVRlcm0gdG1wID0gYTI7CisJd2hpbGUgKCEgdG1wLmlzTmlsKCkpIHsKKwkgICAgaWYgKHRtcC5pc1ZhcmlhYmxlKCkpCisJCXRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAyKTsKKwkgICAgaWYgKCEgdG1wLmlzTGlzdCgpKQorCQl0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMiwgImxpc3QiLCBhMik7CisJICAgIFRlcm0gY2FyID0gKChMaXN0VGVybSkgdG1wKS5jYXIoKS5kZXJlZmVyZW5jZSgpOworCSAgICBpZiAoY2FyLmlzVmFyaWFibGUoKSkKKwkJdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDIpOworCSAgICBpZiAoY2FyLmlzU3RydWN0dXJlKCkpIHsKKwkJU3ltYm9sVGVybSBmdW5jdG9yID0gKChTdHJ1Y3R1cmVUZXJtKSBjYXIpLmZ1bmN0b3IoKTsKKwkJVGVybVtdIGFyZ3MgPSAoKFN0cnVjdHVyZVRlcm0pIGNhcikuYXJncygpOworCQlpZiAoZnVuY3Rvci5lcXVhbHMoU1lNX0ZPUkNFXzEpKSB7CisJCSAgICBUZXJtIGJvb2wgPSBhcmdzWzBdLmRlcmVmZXJlbmNlKCk7CisJCSAgICBpZiAoYm9vbC5lcXVhbHMoU1lNX1RSVUUpKQorCQkJZm9yY2VGbGFnID0gdHJ1ZTsKKwkJICAgIGVsc2UgaWYgKGJvb2wuZXF1YWxzKFNZTV9GQUxTRSkpCisJCQlmb3JjZUZsYWcgPSBmYWxzZTsKKwkJICAgIGVsc2UgCisJCQl0aHJvdyBuZXcgSWxsZWdhbERvbWFpbkV4Y2VwdGlvbih0aGlzLCAyLCAiY2xvc2Vfb3B0aW9uIiwgY2FyKTsKKwkJfSBlbHNlIHsKKwkJICAgIHRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDIsICJjbG9zZV9vcHRpb24iLCBjYXIpOworCQl9CisJICAgIH0gZWxzZSB7CisJCXRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDIsICJjbG9zZV9vcHRpb24iLCBjYXIpOworCSAgICB9CisJICAgIHRtcCA9ICgoTGlzdFRlcm0pIHRtcCkuY2RyKCkuZGVyZWZlcmVuY2UoKTsKKwl9CisJLy9zdHJlYW0KKwlhMSA9IGExLmRlcmVmZXJlbmNlKCk7CisJaWYgKGExLmlzVmFyaWFibGUoKSkgeworCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMSk7CisJfSBlbHNlIGlmIChhMS5pc1N5bWJvbCgpKSB7CisJICAgIGlmICghIGVuZ2luZS5nZXRTdHJlYW1NYW5hZ2VyKCkuY29udGFpbnNLZXkoYTEpKQorCQl0aHJvdyBuZXcgRXhpc3RlbmNlRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW0iLCBhMSwgIiIpOworCSAgICBzdHJlYW0gPSAoKEphdmFPYmplY3RUZXJtKSBlbmdpbmUuZ2V0U3RyZWFtTWFuYWdlcigpLmdldChhMSkpLm9iamVjdCgpOworCX0gZWxzZSBpZiAoYTEuaXNKYXZhT2JqZWN0KCkpIHsKKwkgICAgc3RyZWFtID0gKChKYXZhT2JqZWN0VGVybSkgYTEpLm9iamVjdCgpOworCX0gZWxzZSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW1fb3JfYWxpYXMiLCBhMSk7CisJfQorCWlmIChzdHJlYW0gaW5zdGFuY2VvZiBQdXNoYmFja1JlYWRlcikgeworCSAgICBQdXNoYmFja1JlYWRlciBpbiA9IChQdXNoYmFja1JlYWRlcikgc3RyZWFtOworCSAgICBpZiAoaW4uZXF1YWxzKGVuZ2luZS5nZXRVc2VySW5wdXQoKSkpCisJCXJldHVybiBjb250OworCSAgICBpZiAoaW4uZXF1YWxzKGVuZ2luZS5nZXRDdXJyZW50SW5wdXQoKSkpCisJCWVuZ2luZS5zZXRDdXJyZW50SW5wdXQoZW5naW5lLmdldFVzZXJJbnB1dCgpKTsKKwkgICAgdHJ5IHsKKwkJaW4uY2xvc2UoKTsKKwkgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQl0aHJvdyBuZXcgVGVybUV4Y2VwdGlvbihuZXcgSmF2YU9iamVjdFRlcm0oZSkpOworCSAgICB9CisJfSBlbHNlIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBQcmludFdyaXRlcikgeworCSAgICBQcmludFdyaXRlciBvdXQgPSAoUHJpbnRXcml0ZXIpIHN0cmVhbTsKKwkgICAgaWYgKG91dC5jaGVja0Vycm9yKCkpIHsKKwkJaWYgKCEgZm9yY2VGbGFnKQorCQkgICAgdGhyb3cgbmV3IFN5c3RlbUV4Y2VwdGlvbigib3V0cHV0IHN0cmVhbSBlcnJvciIpOworCSAgICB9CisJICAgIG91dC5mbHVzaCgpOworCSAgICBpZiAob3V0LmVxdWFscyhlbmdpbmUuZ2V0VXNlck91dHB1dCgpKSB8fCBvdXQuZXF1YWxzKGVuZ2luZS5nZXRVc2VyRXJyb3IoKSkpCisJCXJldHVybiBjb250OworCSAgICBpZiAob3V0LmVxdWFscyhlbmdpbmUuZ2V0Q3VycmVudE91dHB1dCgpKSkKKwkJZW5naW5lLnNldEN1cnJlbnRPdXRwdXQoZW5naW5lLmdldFVzZXJPdXRwdXQoKSk7CisJICAgIG91dC5jbG9zZSgpOworCX0gZWxzZSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW1fb3JfYWxpYXMiLCBhMSk7CisJfQorCS8vIGRlbGV0ZSBhc3NvY2lhdGVkIGVudHJpZXMgZnJvbSB0aGUgc3RyZWFtIG1hbmFnZXIKKwlIYXNodGFibGVPZlRlcm0gc3RyZWFtTWFuYWdlciA9IGVuZ2luZS5nZXRTdHJlYW1NYW5hZ2VyKCk7CisJaWYgKGExLmlzU3ltYm9sKCkpIHsKKwkgICAgc3RyZWFtTWFuYWdlci5yZW1vdmUoZW5naW5lLmdldFN0cmVhbU1hbmFnZXIoKS5nZXQoYTEpKTsKKwkgICAgc3RyZWFtTWFuYWdlci5yZW1vdmUoYTEpOworCX0gZWxzZSBpZiAoYTEuaXNKYXZhT2JqZWN0KCkpIHsKKwkgICAgVGVybSB0bXAyID0gc3RyZWFtTWFuYWdlci5nZXQoYTEpOworCSAgICB3aGlsZSAoISB0bXAyLmlzTmlsKCkpIHsKKwkJVGVybSBjYXIgPSAoKExpc3RUZXJtKSB0bXAyKS5jYXIoKS5kZXJlZmVyZW5jZSgpOworCQlpZiAoY2FyLmlzU3RydWN0dXJlKCkpIHsKKwkJICAgIFN5bWJvbFRlcm0gZnVuY3RvciA9ICgoU3RydWN0dXJlVGVybSkgY2FyKS5mdW5jdG9yKCk7CisJCSAgICBUZXJtW10gYXJncyA9ICgoU3RydWN0dXJlVGVybSkgY2FyKS5hcmdzKCk7CisJCSAgICBpZiAoZnVuY3Rvci5lcXVhbHMoU1lNX0FMSUFTXzEpKSB7CisJCQlUZXJtIGFsaWFzID0gYXJnc1swXS5kZXJlZmVyZW5jZSgpOworCQkJc3RyZWFtTWFuYWdlci5yZW1vdmUoYWxpYXMpOworCQkgICAgfQorCQl9CisJCXRtcDIgPSAoKExpc3RUZXJtKSB0bXAyKS5jZHIoKS5kZXJlZmVyZW5jZSgpOworCSAgICB9CisJICAgIHN0cmVhbU1hbmFnZXIucmVtb3ZlKGExKTsKKwl9IGVsc2UgeworCSAgICB0aHJvdyBuZXcgSWxsZWdhbERvbWFpbkV4Y2VwdGlvbih0aGlzLCAxLCAic3RyZWFtX29yX2FsaWFzIiwgYTEpOworCX0KKyAgICAgICAgcmV0dXJuIGNvbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2N1cnJlbnRfZW5naW5lXzEuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9jdXJyZW50X2VuZ2luZV8xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYxNTVlYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9jdXJyZW50X2VuZ2luZV8xLmphdmEKQEAgLTAsMCArMSwzNyBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQgIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworLyoqCisgKiA8Y29kZT5jdXJyZW50X2VuZ2luZS8xPC9jb2RlPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBQUkVEX2N1cnJlbnRfZW5naW5lXzEgZXh0ZW5kcyBQcmVkaWNhdGUgeworICAgICBUZXJtIGFyZzE7CisKKyAgICBwdWJsaWMgUFJFRF9jdXJyZW50X2VuZ2luZV8xKFRlcm0gYTEsIFByZWRpY2F0ZSBjb250KSB7CisJYXJnMSA9IGExOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorICAgIHB1YmxpYyBQUkVEX2N1cnJlbnRfZW5naW5lXzEoKSB7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KXsKKwlhcmcxID0gYXJnc1swXTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAxOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gImN1cnJlbnRfZW5naW5lKCIgKyBhcmcxICsgIikiOyB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKwlUZXJtIGExOworCWExID0gYXJnMTsKKworCWExID0gYTEuZGVyZWZlcmVuY2UoKTsKKwlpZiAoISBhMS51bmlmeShuZXcgSmF2YU9iamVjdFRlcm0oZW5naW5lKSwgZW5naW5lLnRyYWlsKSkKKwkgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJcmV0dXJuIGNvbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2N1cnJlbnRfaW5wdXRfMS5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2N1cnJlbnRfaW5wdXRfMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZTQ1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfY3VycmVudF9pbnB1dF8xLmphdmEKQEAgLTAsMCArMSw0MiBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQgIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworLyoqCisgKiA8Y29kZT5jdXJyZW50X2lucHV0LzE8L2NvZGU+PGJyPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBQUkVEX2N1cnJlbnRfaW5wdXRfMSBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgVGVybSBhcmcxOworCisgICAgcHVibGljIFBSRURfY3VycmVudF9pbnB1dF8xKFRlcm0gYTEsIFByZWRpY2F0ZSBjb250KSB7CisJYXJnMSA9IGExOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorICAgIHB1YmxpYyBQUkVEX2N1cnJlbnRfaW5wdXRfMSgpIHt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpeworCWFyZzEgPSBhcmdzWzBdOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDE7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiAiY3VycmVudF9pbnB1dCgiICsgYXJnMSArICIpIjsgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisJVGVybSBhMTsKKwlhMSA9IGFyZzE7CisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOworCWlmIChhMS5pc1ZhcmlhYmxlKCkpIHsKKwkgICAgKChWYXJpYWJsZVRlcm0pYTEpLmJpbmQobmV3IEphdmFPYmplY3RUZXJtKGVuZ2luZS5nZXRDdXJyZW50SW5wdXQoKSksIGVuZ2luZS50cmFpbCk7CisJfSBlbHNlIGlmIChhMS5pc0phdmFPYmplY3QoKSkgeworCSAgICBpZiAoISBhMS51bmlmeShuZXcgSmF2YU9iamVjdFRlcm0oZW5naW5lLmdldEN1cnJlbnRJbnB1dCgpKSwgZW5naW5lLnRyYWlsKSkgCisJCXJldHVybiBlbmdpbmUuZmFpbCgpOworCX0gZWxzZSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsMSwic3RyZWFtIixhMSk7CisJfQorCXJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9jdXJyZW50X291dHB1dF8xLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfY3VycmVudF9vdXRwdXRfMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZTI1NjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfY3VycmVudF9vdXRwdXRfMS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKKy8qKgorICogPGNvZGU+Y3VycmVudF9vdXRwdXQvMTwvY29kZT48YnI+CisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIFBSRURfY3VycmVudF9vdXRwdXRfMSBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgVGVybSBhcmcxOworCisgICAgcHVibGljIFBSRURfY3VycmVudF9vdXRwdXRfMShUZXJtIGExLCBQcmVkaWNhdGUgY29udCkgeworCWFyZzEgPSBhMTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKyAgICBwdWJsaWMgUFJFRF9jdXJyZW50X291dHB1dF8xKCkge30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCl7CisJYXJnMSA9IGFyZ3NbMF07CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMTsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuICJjdXJyZW50X291dHB1dCgiICsgYXJnMSArICIpIjsgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisJVGVybSBhMTsKKwlhMSA9IGFyZzE7CisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOworCWlmIChhMS5pc1ZhcmlhYmxlKCkpIHsKKwkgICAgKChWYXJpYWJsZVRlcm0pYTEpLmJpbmQobmV3IEphdmFPYmplY3RUZXJtKGVuZ2luZS5nZXRDdXJyZW50T3V0cHV0KCkpLCBlbmdpbmUudHJhaWwpOworCX0gZWxzZSBpZiAoYTEuaXNKYXZhT2JqZWN0KCkpIHsKKwkgICAgaWYgKCEgYTEudW5pZnkobmV3IEphdmFPYmplY3RUZXJtKGVuZ2luZS5nZXRDdXJyZW50T3V0cHV0KCkpLCBlbmdpbmUudHJhaWwpKSAKKwkJcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJfSBlbHNlIHsKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxEb21haW5FeGNlcHRpb24odGhpcywxLCJzdHJlYW0iLGExKTsKKwl9CisJcmV0dXJuIGNvbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2ZsdXNoX291dHB1dF8xLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfZmx1c2hfb3V0cHV0XzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjE5NTE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2ZsdXNoX291dHB1dF8xLmphdmEKQEAgLTAsMCArMSw1NSBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKy8qKgorICogPGNvZGU+Zmx1c2hfb3V0cHV0LzE8L2NvZGU+PGJyPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisqLworcHVibGljIGNsYXNzIFBSRURfZmx1c2hfb3V0cHV0XzEgZXh0ZW5kcyBQcmVkaWNhdGUgeworCisgICAgcHVibGljIFRlcm0gYXJnMTsKKworICAgIHB1YmxpYyBQUkVEX2ZsdXNoX291dHB1dF8xKFRlcm0gYTEsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhMTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF9mbHVzaF9vdXRwdXRfMSgpe30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYXJnc1swXTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMTsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJmbHVzaF9vdXRwdXQoIiArIGFyZzEgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisgICAgICAgIFRlcm0gYTE7CisgICAgICAgIGExID0gYXJnMTsKKwlPYmplY3Qgc3RyZWFtID0gbnVsbDsKKworCWExID0gYTEuZGVyZWZlcmVuY2UoKTsKKwlpZiAoYTEuaXNWYXJpYWJsZSgpKSB7CisJICAgIHRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAxKTsKKwl9IGVsc2UgaWYgKGExLmlzU3ltYm9sKCkpIHsKKwkgICAgaWYgKCEgZW5naW5lLmdldFN0cmVhbU1hbmFnZXIoKS5jb250YWluc0tleShhMSkpCisJCXRocm93IG5ldyBFeGlzdGVuY2VFeGNlcHRpb24odGhpcywgMSwgInN0cmVhbSIsIGExLCAiIik7CisJICAgIHN0cmVhbSA9ICgoSmF2YU9iamVjdFRlcm0pIGVuZ2luZS5nZXRTdHJlYW1NYW5hZ2VyKCkuZ2V0KGExKSkub2JqZWN0KCk7CisJfSBlbHNlIGlmIChhMS5pc0phdmFPYmplY3QoKSkgeworCSAgICBzdHJlYW0gPSAoKEphdmFPYmplY3RUZXJtKSBhMSkub2JqZWN0KCk7CisJfSBlbHNlIHsKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxEb21haW5FeGNlcHRpb24odGhpcywgMSwgInN0cmVhbV9vcl9hbGlhcyIsIGExKTsKKwl9CisJaWYgKCEgKHN0cmVhbSBpbnN0YW5jZW9mIFByaW50V3JpdGVyKSkKKwkgICAgdGhyb3cgbmV3IFBlcm1pc3Npb25FeGNlcHRpb24odGhpcywgIm91dHB1dCIsICJzdHJlYW0iLCBhMSwgIiIpOworCSgoUHJpbnRXcml0ZXIpc3RyZWFtKS5mbHVzaCgpOworICAgICAgICByZXR1cm4gY29udDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfZnVuY3Rvcl8zLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfZnVuY3Rvcl8zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmNjY5MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9mdW5jdG9yXzMuamF2YQpAQCAtMCwwICsxLDk3IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCAganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisvKioKKyAqIDxjb2RlPmZ1bmN0b3IvMzwvY29kZT48YnI+CisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIFBSRURfZnVuY3Rvcl8zIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fRE9UID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCIuIik7CisgICAgVGVybSBhcmcxLCBhcmcyLCBhcmczOworCisgICAgcHVibGljIFBSRURfZnVuY3Rvcl8zKFRlcm0gYTEsIFRlcm0gYTIsIFRlcm0gYTMsIFByZWRpY2F0ZSBjb250KSB7CisJYXJnMSA9IGExOyAKKwlhcmcyID0gYTI7IAorCWFyZzMgPSBhMzsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEX2Z1bmN0b3JfMygpIHt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpeworCWFyZzEgPSBhcmdzWzBdOworCWFyZzIgPSBhcmdzWzFdOworCWFyZzMgPSBhcmdzWzJdOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDM7IH0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gImZ1bmN0b3IoIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIiwiICsgYXJnMyArICIpIjsgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisJVGVybSBhMSwgYTIsIGEzOworCWExID0gYXJnMTsKKwlhMiA9IGFyZzI7CisJYTMgPSBhcmczOworCisJLy8gZnVuY3Rvcig/WCwrWSwrWikKKwlhMSA9IGExLmRlcmVmZXJlbmNlKCk7CisJaWYgKGExLmlzVmFyaWFibGUoKSkgeworCSAgICBhMiA9IGEyLmRlcmVmZXJlbmNlKCk7CisJICAgIGlmIChhMi5pc1ZhcmlhYmxlKCkpCisJCXRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAyKTsKKwkgICAgaWYgKCFhMi5pc1N5bWJvbCgpICYmICAhYTIuaXNOdW1iZXIoKSAmJiAhYTIuaXNKYXZhT2JqZWN0KCkgJiYgIWEyLmlzQ2xvc3VyZSgpKQorCQl0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMiwgImF0b21pYyIsIGEyKTsKKwkgICAgYTMgPSBhMy5kZXJlZmVyZW5jZSgpOworCSAgICBpZiAoYTMuaXNWYXJpYWJsZSgpKQorCQl0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMyk7CisJICAgIGlmICghIGEzLmlzSW50ZWdlcigpKQorCQl0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMywgImludGVnZXIiLCBhMyk7CisJICAgIGludCBuID0gKChJbnRlZ2VyVGVybSlhMykuaW50VmFsdWUoKTsKKwkgICAgaWYgKG4gPCAwKQorCQl0aHJvdyBuZXcgSWxsZWdhbERvbWFpbkV4Y2VwdGlvbih0aGlzLCAzLCAibm90X2xlc3NfdGhhbl96ZXJvIiwgYTMpOworCSAgICBpZiAobiA9PSAwKSB7CisJCWlmKCEgYTEudW5pZnkoYTIsIGVuZ2luZS50cmFpbCkpCisJCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKwkJcmV0dXJuIGNvbnQ7CisJICAgIH0KKwkgICAgaWYgKCEgYTIuaXNTeW1ib2woKSkKKwkJdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJhdG9tIiwgYTIpOworCSAgICBpZiAobiA9PSAyICAmJiAgYTIuZXF1YWxzKFNZTV9ET1QpKSB7CisJCVRlcm0gdCA9IG5ldyBMaXN0VGVybShuZXcgVmFyaWFibGVUZXJtKGVuZ2luZSksIG5ldyBWYXJpYWJsZVRlcm0oZW5naW5lKSk7CisJCWlmKCEgYTEudW5pZnkodCwgZW5naW5lLnRyYWlsKSkKKwkJICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOworCQlyZXR1cm4gY29udDsKKwkgICAgfQorCSAgICBUZXJtW10gYXJncyA9IG5ldyBUZXJtW25dOworCSAgICBmb3IoaW50IGk9MDsgaTxuOyBpKyspCisJCWFyZ3NbaV0gPSBuZXcgVmFyaWFibGVUZXJtKGVuZ2luZSk7CisJICAgIFN5bWJvbFRlcm0gc3ltID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCgoU3ltYm9sVGVybSlhMikubmFtZSgpLCBuKTsKKwkgICAgaWYoISBhMS51bmlmeShuZXcgU3RydWN0dXJlVGVybShzeW0sIGFyZ3MpLCBlbmdpbmUudHJhaWwpKQorCQlyZXR1cm4gZW5naW5lLmZhaWwoKTsKKwkgICAgcmV0dXJuIGNvbnQ7CisJfQorCS8vIGZ1bmN0b3IoK1gsP1ksP1opCisJVGVybSBmdW5jdG9yOworCUludGVnZXJUZXJtIGFyaXR5OworCWlmIChhMS5pc1N5bWJvbCgpIHx8IGExLmlzTnVtYmVyKCkgfHwgYTEuaXNKYXZhT2JqZWN0KCkgfHwgYTEuaXNDbG9zdXJlKCkpIHsKKwkgICAgZnVuY3RvciA9IGExOworCSAgICBhcml0eSAgID0gbmV3IEludGVnZXJUZXJtKDApOworCX0gZWxzZSBpZiAoYTEuaXNMaXN0KCkpIHsKKwkgICAgZnVuY3RvciA9IFNZTV9ET1Q7CisJICAgIGFyaXR5ICAgPSBuZXcgSW50ZWdlclRlcm0oMik7CisJfSBlbHNlIGlmIChhMS5pc1N0cnVjdHVyZSgpKSB7CisJICAgIGZ1bmN0b3IgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woKChTdHJ1Y3R1cmVUZXJtKWExKS5uYW1lKCkpOworCSAgICBhcml0eSAgID0gbmV3IEludGVnZXJUZXJtKCgoU3RydWN0dXJlVGVybSlhMSkuYXJpdHkoKSk7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJfQorCWlmKCEgYTIudW5pZnkoZnVuY3RvciwgZW5naW5lLnRyYWlsKSkgCisJICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOworCWlmKCEgYTMudW5pZnkoYXJpdHksIGVuZ2luZS50cmFpbCkpIAorCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKwlyZXR1cm4gY29udDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfZ2V0XzIuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9nZXRfMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYmVkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfZ2V0XzIuamF2YQpAQCAtMCwwICsxLDg1IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKK2ltcG9ydCBqYXZhLmlvLio7CisvKioKKyAqIDxjb2RlPmdldC8yPC9jb2RlPjxicj4KKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMAorKi8KK3B1YmxpYyBjbGFzcyBQUkVEX2dldF8yIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICBwdWJsaWMgc3RhdGljIEludGVnZXJUZXJtIElOVF9FT0YgPSBuZXcgSW50ZWdlclRlcm0oLTEpOworICAgIHB1YmxpYyBUZXJtIGFyZzEsIGFyZzI7CisKKyAgICBwdWJsaWMgUFJFRF9nZXRfMihUZXJtIGExLCBUZXJtIGEyLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYTE7CisgICAgICAgIGFyZzIgPSBhMjsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF9nZXRfMigpe30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYXJnc1swXTsKKyAgICAgICAgYXJnMiA9IGFyZ3NbMV07CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDI7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiZ2V0KCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIpIjsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKyAgICAgICAgVGVybSBhMSwgYTI7CisgICAgICAgIGExID0gYXJnMTsKKyAgICAgICAgYTIgPSBhcmcyOworCU9iamVjdCBzdHJlYW0gPSBudWxsOworCisJLy8gQ2hhcgorCWEyID0gYTIuZGVyZWZlcmVuY2UoKTsgCisJaWYgKCEgYTIuaXNWYXJpYWJsZSgpKSB7CisJICAgIGlmICghIGEyLmlzSW50ZWdlcigpKQorCQl0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMiwgImludGVnZXIiLCBhMik7CisJICAgIGludCBuID0gKChJbnRlZ2VyVGVybSlhMikuaW50VmFsdWUoKTsKKwkgICAgaWYgKG4gIT0gLTEgJiYgISBDaGFyYWN0ZXIuaXNEZWZpbmVkKG4pKQorCQl0aHJvdyBuZXcgUmVwcmVzZW50YXRpb25FeGNlcHRpb24odGhpcywgMiwgImluX2NoYXJhY3Rlcl9jb2RlIik7CisJfQorCS8vIFNfb3JfYQorCWExID0gYTEuZGVyZWZlcmVuY2UoKTsgCisJaWYgKGExLmlzVmFyaWFibGUoKSkgeworCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMSk7CisJfSBlbHNlIGlmIChhMS5pc1N5bWJvbCgpKSB7CisJICAgIGlmICghIGVuZ2luZS5nZXRTdHJlYW1NYW5hZ2VyKCkuY29udGFpbnNLZXkoYTEpKQorCQl0aHJvdyBuZXcgRXhpc3RlbmNlRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW0iLCBhMSwgIiIpOworCSAgICBzdHJlYW0gPSAoKEphdmFPYmplY3RUZXJtKSBlbmdpbmUuZ2V0U3RyZWFtTWFuYWdlcigpLmdldChhMSkpLm9iamVjdCgpOworCX0gZWxzZSBpZiAoYTEuaXNKYXZhT2JqZWN0KCkpIHsKKwkgICAgc3RyZWFtID0gKChKYXZhT2JqZWN0VGVybSkgYTEpLm9iamVjdCgpOworCX0gZWxzZSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW1fb3JfYWxpYXMiLCBhMSk7CisJfQorCWlmICghIChzdHJlYW0gaW5zdGFuY2VvZiBQdXNoYmFja1JlYWRlcikpCisJICAgIHRocm93IG5ldyBQZXJtaXNzaW9uRXhjZXB0aW9uKHRoaXMsICJpbnB1dCIsICJzdHJlYW0iLCBhMSwgIiIpOworCS8vIHJlYWQgYSBub24tYmxhbmsgc2luZ2xlIGNoYXJhY3RlcgorCXRyeSB7CisJICAgIFB1c2hiYWNrUmVhZGVyIGluID0gKFB1c2hiYWNrUmVhZGVyKSBzdHJlYW07CisJICAgIGludCBjID0gaW4ucmVhZCgpOworCSAgICB3aGlsZShDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKWMpKQorCQljID0gaW4ucmVhZCgpOworCSAgICBpZiAoYyA8IDApIHsgLy8gRU9GCisJCWlmICghIGEyLnVuaWZ5KElOVF9FT0YsIGVuZ2luZS50cmFpbCkpCisJCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKwkJcmV0dXJuIGNvbnQ7CisJICAgIH0gCisJICAgIGlmICghIENoYXJhY3Rlci5pc0RlZmluZWQoYykpCisJCXRocm93IG5ldyBSZXByZXNlbnRhdGlvbkV4Y2VwdGlvbih0aGlzLCAwLCAiY2hhcmFjdGVyIik7CisJICAgIGlmICghIGEyLnVuaWZ5KG5ldyBJbnRlZ2VyVGVybShjKSwgZW5naW5lLnRyYWlsKSkKKwkJcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJICAgIHJldHVybiBjb250OworCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkgICAgdGhyb3cgbmV3IFRlcm1FeGNlcHRpb24obmV3IEphdmFPYmplY3RUZXJtKGUpKTsKKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2dldF9ieXRlXzIuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9nZXRfYnl0ZV8yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhhZDJkNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9nZXRfYnl0ZV8yLmphdmEKQEAgLTAsMCArMSw4MyBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CitpbXBvcnQgamF2YS5pby4qOworLyoqCisgKiA8Y29kZT5nZXRfYnl0ZS8yPC9jb2RlPjxicj4KKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMQorICogQHNpbmNlIDEuMQorKi8KK3B1YmxpYyBjbGFzcyBQUkVEX2dldF9ieXRlXzIgZXh0ZW5kcyBQcmVkaWNhdGUgeworICAgIHB1YmxpYyBzdGF0aWMgSW50ZWdlclRlcm0gSU5UX0VPRiA9IG5ldyBJbnRlZ2VyVGVybSgtMSk7CisgICAgcHVibGljIFRlcm0gYXJnMSwgYXJnMjsKKworICAgIHB1YmxpYyBQUkVEX2dldF9ieXRlXzIoVGVybSBhMSwgVGVybSBhMiwgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGExOworICAgICAgICBhcmcyID0gYTI7CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfZ2V0X2J5dGVfMigpe30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYXJnc1swXTsKKyAgICAgICAgYXJnMiA9IGFyZ3NbMV07CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDI7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiZ2V0X2J5dGUoIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworICAgICAgICBUZXJtIGExLCBhMjsKKyAgICAgICAgYTEgPSBhcmcxOworICAgICAgICBhMiA9IGFyZzI7CisJT2JqZWN0IHN0cmVhbSA9IG51bGw7CisKKwkvLyBJbkJ5dGUKKwlhMiA9IGEyLmRlcmVmZXJlbmNlKCk7IAorCWlmICghIGEyLmlzVmFyaWFibGUoKSkgeworCSAgICBpZiAoISBhMi5pc0ludGVnZXIoKSkKKwkJdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJpbl9ieXRlIiwgYTIpOworCSAgICBpbnQgbiA9ICgoSW50ZWdlclRlcm0pYTIpLmludFZhbHVlKCk7CisJICAgIGlmIChuICE9IC0xICYmIChuIDwgMCB8fCBuID4gMjU1KSkKKwkJdGhyb3cgbmV3IFJlcHJlc2VudGF0aW9uRXhjZXB0aW9uKHRoaXMsIDIsICJpbl9ieXRlIik7CisJfQorCS8vIFNfb3JfYQorCWExID0gYTEuZGVyZWZlcmVuY2UoKTsgCisJaWYgKGExLmlzVmFyaWFibGUoKSkgeworCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMSk7CisJfSBlbHNlIGlmIChhMS5pc1N5bWJvbCgpKSB7CisJICAgIGlmICghIGVuZ2luZS5nZXRTdHJlYW1NYW5hZ2VyKCkuY29udGFpbnNLZXkoYTEpKQorCQl0aHJvdyBuZXcgRXhpc3RlbmNlRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW0iLCBhMSwgIiIpOworCSAgICBzdHJlYW0gPSAoKEphdmFPYmplY3RUZXJtKSBlbmdpbmUuZ2V0U3RyZWFtTWFuYWdlcigpLmdldChhMSkpLm9iamVjdCgpOworCX0gZWxzZSBpZiAoYTEuaXNKYXZhT2JqZWN0KCkpIHsKKwkgICAgc3RyZWFtID0gKChKYXZhT2JqZWN0VGVybSkgYTEpLm9iamVjdCgpOworCX0gZWxzZSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW1fb3JfYWxpYXMiLCBhMSk7CisJfQorCWlmICghIChzdHJlYW0gaW5zdGFuY2VvZiBQdXNoYmFja1JlYWRlcikpCisJICAgIHRocm93IG5ldyBQZXJtaXNzaW9uRXhjZXB0aW9uKHRoaXMsICJpbnB1dCIsICJzdHJlYW0iLCBhMSwgIiIpOworCS8vIHJlYWQgc2luZ2xlIGJ5dGUKKwl0cnkgeworCSAgICBpbnQgYyA9ICgoUHVzaGJhY2tSZWFkZXIpc3RyZWFtKS5yZWFkKCk7CisJICAgIGlmIChjIDwgMCkgeyAvLyBFT0YKKwkJaWYgKCEgYTIudW5pZnkoSU5UX0VPRiwgZW5naW5lLnRyYWlsKSkKKwkJICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOworCQlyZXR1cm4gY29udDsKKwkgICAgfSAKKwkgICAgaWYgKGMgPiAyNTUpCisJCXRocm93IG5ldyBSZXByZXNlbnRhdGlvbkV4Y2VwdGlvbih0aGlzLCAwLCAiYnl0ZSIpOworCSAgICBpZiAoISBhMi51bmlmeShuZXcgSW50ZWdlclRlcm0oYyksIGVuZ2luZS50cmFpbCkpCisJCXJldHVybiBlbmdpbmUuZmFpbCgpOworCSAgICByZXR1cm4gY29udDsKKwl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJICAgIHRocm93IG5ldyBUZXJtRXhjZXB0aW9uKG5ldyBKYXZhT2JqZWN0VGVybShlKSk7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9nZXRfY2hhcl8yLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfZ2V0X2NoYXJfMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmODk2OWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfZ2V0X2NoYXJfMi5qYXZhCkBAIC0wLDAgKzEsODUgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0IGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworaW1wb3J0IGphdmEuaW8uKjsKKy8qKgorICogPGNvZGU+Z2V0X2NoYXIvMjwvY29kZT48YnI+CisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyovCitwdWJsaWMgY2xhc3MgUFJFRF9nZXRfY2hhcl8yIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFRlcm0gU1lNX0VPRiA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiZW5kX29mX2ZpbGUiKTsKKyAgICBwdWJsaWMgVGVybSBhcmcxLCBhcmcyOworCisgICAgcHVibGljIFBSRURfZ2V0X2NoYXJfMihUZXJtIGExLCBUZXJtIGEyLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYTE7CisgICAgICAgIGFyZzIgPSBhMjsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF9nZXRfY2hhcl8yKCl7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhcmdzWzBdOworICAgICAgICBhcmcyID0gYXJnc1sxXTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMjsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJnZXRfY2hhcigiICsgYXJnMSArICIsIiArIGFyZzIgKyAiKSI7CisgICAgfQorCisgICAgYm9vbGVhbiBpbkNoYXJhY3RlcihUZXJtIHQpIHsKKwlpZiAoISB0LmlzU3ltYm9sKCkpCisJICAgIHJldHVybiBmYWxzZTsKKwlpZiAodC5lcXVhbHMoU1lNX0VPRikpCisJICAgIHJldHVybiB0cnVlOworCXJldHVybiAoKFN5bWJvbFRlcm0pdCkubmFtZSgpLmxlbmd0aCgpID09IDE7CisgICAgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisgICAgICAgIFRlcm0gYTEsIGEyOworICAgICAgICBhMSA9IGFyZzE7CisgICAgICAgIGEyID0gYXJnMjsKKwlPYmplY3Qgc3RyZWFtID0gbnVsbDsKKworCS8vIENoYXIKKwlhMiA9IGEyLmRlcmVmZXJlbmNlKCk7IAorCWlmICghIGEyLmlzVmFyaWFibGUoKSAmJiAhIGluQ2hhcmFjdGVyKGEyKSkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJpbl9jaGFyYWN0ZXIiLCBhMik7CisJLy8gU19vcl9hCisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOyAKKwlpZiAoYTEuaXNWYXJpYWJsZSgpKSB7CisJICAgIHRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAxKTsKKwl9IGVsc2UgaWYgKGExLmlzU3ltYm9sKCkpIHsKKwkgICAgaWYgKCEgZW5naW5lLmdldFN0cmVhbU1hbmFnZXIoKS5jb250YWluc0tleShhMSkpCisJCXRocm93IG5ldyBFeGlzdGVuY2VFeGNlcHRpb24odGhpcywgMSwgInN0cmVhbSIsIGExLCAiIik7CisJICAgIHN0cmVhbSA9ICgoSmF2YU9iamVjdFRlcm0pIGVuZ2luZS5nZXRTdHJlYW1NYW5hZ2VyKCkuZ2V0KGExKSkub2JqZWN0KCk7CisJfSBlbHNlIGlmIChhMS5pc0phdmFPYmplY3QoKSkgeworCSAgICBzdHJlYW0gPSAoKEphdmFPYmplY3RUZXJtKSBhMSkub2JqZWN0KCk7CisJfSBlbHNlIHsKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxEb21haW5FeGNlcHRpb24odGhpcywgMSwgInN0cmVhbV9vcl9hbGlhcyIsIGExKTsKKwl9CisJaWYgKCEgKHN0cmVhbSBpbnN0YW5jZW9mIFB1c2hiYWNrUmVhZGVyKSkKKwkgICAgdGhyb3cgbmV3IFBlcm1pc3Npb25FeGNlcHRpb24odGhpcywgImlucHV0IiwgInN0cmVhbSIsIGExLCAiIik7CisJLy8gcmVhZCBzaW5nbGUgY2hhcmFjdGVyCisJdHJ5IHsKKwkgICAgaW50IGMgPSAoKFB1c2hiYWNrUmVhZGVyKXN0cmVhbSkucmVhZCgpOworCSAgICBpZiAoYyA8IDApIHsgLy8gRU9GCisJCWlmICghIGEyLnVuaWZ5KFNZTV9FT0YsIGVuZ2luZS50cmFpbCkpCisJCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKwkJcmV0dXJuIGNvbnQ7CisJICAgIH0gCisJICAgIGlmICghIENoYXJhY3Rlci5pc0RlZmluZWQoYykpCisJCXRocm93IG5ldyBSZXByZXNlbnRhdGlvbkV4Y2VwdGlvbih0aGlzLCAwLCAiY2hhcmFjdGVyIik7CisJICAgIGlmICghIGEyLnVuaWZ5KFN5bWJvbFRlcm0ubWFrZVN5bWJvbChTdHJpbmcudmFsdWVPZigoY2hhciljKSksIGVuZ2luZS50cmFpbCkpCisJCXJldHVybiBlbmdpbmUuZmFpbCgpOworCSAgICByZXR1cm4gY29udDsKKwl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJICAgIHRocm93IG5ldyBUZXJtRXhjZXB0aW9uKG5ldyBKYXZhT2JqZWN0VGVybShlKSk7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9nZXRfY29kZV8yLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfZ2V0X2NvZGVfMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMzEwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfZ2V0X2NvZGVfMi5qYXZhCkBAIC0wLDAgKzEsODIgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0IGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworaW1wb3J0IGphdmEuaW8uKjsKKy8qKgorICogPGNvZGU+Z2V0X2NvZGUvMjwvY29kZT48YnI+CisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyovCitwdWJsaWMgY2xhc3MgUFJFRF9nZXRfY29kZV8yIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICBwdWJsaWMgc3RhdGljIEludGVnZXJUZXJtIElOVF9FT0YgPSBuZXcgSW50ZWdlclRlcm0oLTEpOworICAgIHB1YmxpYyBUZXJtIGFyZzEsIGFyZzI7CisKKyAgICBwdWJsaWMgUFJFRF9nZXRfY29kZV8yKFRlcm0gYTEsIFRlcm0gYTIsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhMTsKKyAgICAgICAgYXJnMiA9IGEyOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEX2dldF9jb2RlXzIoKXt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGFyZ3NbMF07CisgICAgICAgIGFyZzIgPSBhcmdzWzFdOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAyOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gImdldF9jb2RlKCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIpIjsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKyAgICAgICAgVGVybSBhMSwgYTI7CisgICAgICAgIGExID0gYXJnMTsKKyAgICAgICAgYTIgPSBhcmcyOworCU9iamVjdCBzdHJlYW0gPSBudWxsOworCisJLy8gQ2hhcgorCWEyID0gYTIuZGVyZWZlcmVuY2UoKTsgCisJaWYgKCEgYTIuaXNWYXJpYWJsZSgpKSB7CisJICAgIGlmICghIGEyLmlzSW50ZWdlcigpKQorCQl0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMiwgImludGVnZXIiLCBhMik7CisJICAgIGludCBuID0gKChJbnRlZ2VyVGVybSlhMikuaW50VmFsdWUoKTsKKwkgICAgaWYgKG4gIT0gLTEgJiYgISBDaGFyYWN0ZXIuaXNEZWZpbmVkKG4pKQorCQl0aHJvdyBuZXcgUmVwcmVzZW50YXRpb25FeGNlcHRpb24odGhpcywgMiwgImluX2NoYXJhY3Rlcl9jb2RlIik7CisJfQorCS8vIFNfb3JfYQorCWExID0gYTEuZGVyZWZlcmVuY2UoKTsgCisJaWYgKGExLmlzVmFyaWFibGUoKSkgeworCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMSk7CisJfSBlbHNlIGlmIChhMS5pc1N5bWJvbCgpKSB7CisJICAgIGlmICghIGVuZ2luZS5nZXRTdHJlYW1NYW5hZ2VyKCkuY29udGFpbnNLZXkoYTEpKQorCQl0aHJvdyBuZXcgRXhpc3RlbmNlRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW0iLCBhMSwgIiIpOworCSAgICBzdHJlYW0gPSAoKEphdmFPYmplY3RUZXJtKSBlbmdpbmUuZ2V0U3RyZWFtTWFuYWdlcigpLmdldChhMSkpLm9iamVjdCgpOworCX0gZWxzZSBpZiAoYTEuaXNKYXZhT2JqZWN0KCkpIHsKKwkgICAgc3RyZWFtID0gKChKYXZhT2JqZWN0VGVybSkgYTEpLm9iamVjdCgpOworCX0gZWxzZSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW1fb3JfYWxpYXMiLCBhMSk7CisJfQorCWlmICghIChzdHJlYW0gaW5zdGFuY2VvZiBQdXNoYmFja1JlYWRlcikpCisJICAgIHRocm93IG5ldyBQZXJtaXNzaW9uRXhjZXB0aW9uKHRoaXMsICJpbnB1dCIsICJzdHJlYW0iLCBhMSwgIiIpOworCS8vIHJlYWQgc2luZ2xlIGNoYXJhY3RlcgorCXRyeSB7CisJICAgIGludCBjID0gKChQdXNoYmFja1JlYWRlcilzdHJlYW0pLnJlYWQoKTsKKwkgICAgaWYgKGMgPCAwKSB7IC8vIEVPRgorCQlpZiAoISBhMi51bmlmeShJTlRfRU9GLCBlbmdpbmUudHJhaWwpKQorCQkgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJCXJldHVybiBjb250OworCSAgICB9IAorCSAgICBpZiAoISBDaGFyYWN0ZXIuaXNEZWZpbmVkKGMpKQorCQl0aHJvdyBuZXcgUmVwcmVzZW50YXRpb25FeGNlcHRpb24odGhpcywgMCwgImNoYXJhY3RlciIpOworCSAgICBpZiAoISBhMi51bmlmeShuZXcgSW50ZWdlclRlcm0oYyksIGVuZ2luZS50cmFpbCkpCisJCXJldHVybiBlbmdpbmUuZmFpbCgpOworCSAgICByZXR1cm4gY29udDsKKwl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJICAgIHRocm93IG5ldyBUZXJtRXhjZXB0aW9uKG5ldyBKYXZhT2JqZWN0VGVybShlKSk7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9oYWx0XzEuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9oYWx0XzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODhmNWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2hhbHRfMS5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0IGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworLyoqCisgKiA8Y29kZT5oYWx0LzE8L2NvZGU+PGJyPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisqLworcHVibGljIGNsYXNzIFBSRURfaGFsdF8xIGV4dGVuZHMgUHJlZGljYXRlIHsKKworICAgIHB1YmxpYyBUZXJtIGFyZzE7CisKKyAgICBwdWJsaWMgUFJFRF9oYWx0XzEoVGVybSBhMSwgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGExOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEX2hhbHRfMSgpe30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYXJnc1swXTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMTsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJoYWx0KCIgKyBhcmcxICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworICAgICAgICBUZXJtIGExOworICAgICAgICBhMSA9IGFyZzE7CisKKwlhMSA9IGExLmRlcmVmZXJlbmNlKCk7CisJaWYgKGExLmlzVmFyaWFibGUoKSkKKwkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDEpOworCWlmICghIGExLmlzSW50ZWdlcigpKQorCSAgICB0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMSwgImludGVnZXIiLCBhMSk7CisJZW5naW5lLmV4Y2VwdGlvblJhaXNlZCA9ICgoSW50ZWdlclRlcm0pYTEpLmludFZhbHVlKCk7CisgICAgICAgIHJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9oYXNoX2NsZWFyXzEuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9oYXNoX2NsZWFyXzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGIyNDk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2hhc2hfY2xlYXJfMS5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0IGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisvKioKKyAqIDxjb2RlPmhhc2hfY2xlYXIvMTwvY29kZT48YnI+CisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyovCitwdWJsaWMgY2xhc3MgUFJFRF9oYXNoX2NsZWFyXzEgZXh0ZW5kcyBQcmVkaWNhdGUgeworCisgICAgcHVibGljIFRlcm0gYXJnMTsKKworICAgIHB1YmxpYyBQUkVEX2hhc2hfY2xlYXJfMShUZXJtIGExLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYTE7CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfaGFzaF9jbGVhcl8xKCl7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhcmdzWzBdOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAxOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gImhhc2hfY2xlYXIoIiArIGFyZzEgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisgICAgICAgIFRlcm0gYTE7CisgICAgICAgIGExID0gYXJnMTsKKworCU9iamVjdCBoYXNoID0gbnVsbDsKKworCWExID0gYTEuZGVyZWZlcmVuY2UoKTsKKwlpZiAoYTEuaXNWYXJpYWJsZSgpKSB7CisJICAgIHRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAxKTsKKwl9IGVsc2UgaWYgKGExLmlzU3ltYm9sKCkpIHsKKwkgICAgaWYgKCEgZW5naW5lLmdldEhhc2hNYW5hZ2VyKCkuY29udGFpbnNLZXkoYTEpKQorCQl0aHJvdyBuZXcgRXhpc3RlbmNlRXhjZXB0aW9uKHRoaXMsIDEsICJoYXNoIiwgYTEsICIiKTsKKwkgICAgaGFzaCA9ICgoSmF2YU9iamVjdFRlcm0pIGVuZ2luZS5nZXRIYXNoTWFuYWdlcigpLmdldChhMSkpLm9iamVjdCgpOworCX0gZWxzZSBpZiAoYTEuaXNKYXZhT2JqZWN0KCkpIHsKKwkgICAgaGFzaCA9ICgoSmF2YU9iamVjdFRlcm0pIGExKS5vYmplY3QoKTsKKwl9IGVsc2UgeworCSAgICB0aHJvdyBuZXcgSWxsZWdhbERvbWFpbkV4Y2VwdGlvbih0aGlzLCAxLCAiaGFzaF9vcl9hbGlhcyIsIGExKTsKKwl9CisJaWYgKCEgKGhhc2ggaW5zdGFuY2VvZiBIYXNodGFibGVPZlRlcm0pKQorCSAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24odGhpcyArICI6IEhhc2ggaXMgbm90IEhhc2h0YWJsZU9mVGVybSIpOworCSgoSGFzaHRhYmxlT2ZUZXJtKSBoYXNoKS5jbGVhcigpOworICAgICAgICByZXR1cm4gY29udDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfaGFzaF9jb250YWluc19rZXlfMi5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2hhc2hfY29udGFpbnNfa2V5XzIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjA2MGMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2hhc2hfY29udGFpbnNfa2V5XzIuamF2YQpAQCAtMCwwICsxLDYwIEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworLyoqCisgICA8Y29kZT5oYXNoX2NvbnRhaW5zX2tleS8yPC9jb2RlPjxicj4KKyAgIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICAgQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAgIEB2ZXJzaW9uIDEuMAorKi8KK3B1YmxpYyBjbGFzcyBQUkVEX2hhc2hfY29udGFpbnNfa2V5XzIgZXh0ZW5kcyBQcmVkaWNhdGUgeworCisgICAgcHVibGljIFRlcm0gYXJnMSwgYXJnMjsKKworICAgIHB1YmxpYyBQUkVEX2hhc2hfY29udGFpbnNfa2V5XzIoVGVybSBhMSwgVGVybSBhMiwgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGExOworICAgICAgICBhcmcyID0gYTI7CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfaGFzaF9jb250YWluc19rZXlfMigpe30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYXJnc1swXTsKKyAgICAgICAgYXJnMiA9IGFyZ3NbMV07CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDI7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiaGFzaF9jb250YWluc19rZXkoIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworICAgICAgICBUZXJtIGExLCBhMjsKKyAgICAgICAgYTEgPSBhcmcxOworICAgICAgICBhMiA9IGFyZzI7CisKKwlPYmplY3QgaGFzaCA9IG51bGw7CisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOworCWlmIChhMS5pc1ZhcmlhYmxlKCkpIHsKKwkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDEpOworCX0gZWxzZSBpZiAoYTEuaXNTeW1ib2woKSkgeworCSAgICBpZiAoISBlbmdpbmUuZ2V0SGFzaE1hbmFnZXIoKS5jb250YWluc0tleShhMSkpCisJCXRocm93IG5ldyBFeGlzdGVuY2VFeGNlcHRpb24odGhpcywgMSwgImhhc2giLCBhMSwgIiIpOworCSAgICBoYXNoID0gKChKYXZhT2JqZWN0VGVybSkgZW5naW5lLmdldEhhc2hNYW5hZ2VyKCkuZ2V0KGExKSkub2JqZWN0KCk7CisJfSBlbHNlIGlmIChhMS5pc0phdmFPYmplY3QoKSkgeworCSAgICBoYXNoID0gKChKYXZhT2JqZWN0VGVybSkgYTEpLm9iamVjdCgpOworCX0gZWxzZSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDEsICJoYXNoX29yX2FsaWFzIiwgYTEpOworCX0KKwlpZiAoISAoaGFzaCBpbnN0YW5jZW9mIEhhc2h0YWJsZU9mVGVybSkpCisJICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbih0aGlzICsgIjogSGFzaCBpcyBub3QgSGFzaHRhYmxlT2ZUZXJtIik7CisJYTIgPSBhMi5kZXJlZmVyZW5jZSgpOworCWlmICghICgoSGFzaHRhYmxlT2ZUZXJtKSBoYXNoKS5jb250YWluc0tleShhMikpCisJICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOworICAgICAgICByZXR1cm4gY29udDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfaGFzaF9nZXRfMy5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2hhc2hfZ2V0XzMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjU3OTM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2hhc2hfZ2V0XzMuamF2YQpAQCAtMCwwICsxLDY3IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworLyoqCisgICA8Y29kZT5oYXNoX2dldC8zPC9jb2RlPjxicj4KKyAgIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICAgQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAgIEB2ZXJzaW9uIDEuMAorKi8KK3B1YmxpYyBjbGFzcyBQUkVEX2hhc2hfZ2V0XzMgZXh0ZW5kcyBQcmVkaWNhdGUgeworICAgIHB1YmxpYyBzdGF0aWMgU3ltYm9sVGVybSBTWU1fTklMID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJbXSIpOworICAgIHB1YmxpYyBUZXJtIGFyZzEsIGFyZzIsIGFyZzM7CisKKyAgICBwdWJsaWMgUFJFRF9oYXNoX2dldF8zKFRlcm0gYTEsIFRlcm0gYTIsIFRlcm0gYTMsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhMTsKKyAgICAgICAgYXJnMiA9IGEyOworICAgICAgICBhcmczID0gYTM7CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfaGFzaF9nZXRfMygpe30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYXJnc1swXTsKKyAgICAgICAgYXJnMiA9IGFyZ3NbMV07CisgICAgICAgIGFyZzMgPSBhcmdzWzJdOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAzOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gImhhc2hfZ2V0KCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIsIiArIGFyZzMgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisgICAgICAgIFRlcm0gYTEsIGEyLCBhMzsKKyAgICAgICAgYTEgPSBhcmcxOworICAgICAgICBhMiA9IGFyZzI7CisgICAgICAgIGEzID0gYXJnMzsKKworCU9iamVjdCBoYXNoID0gbnVsbDsKKworCWExID0gYTEuZGVyZWZlcmVuY2UoKTsKKwlpZiAoYTEuaXNWYXJpYWJsZSgpKSB7CisJICAgIHRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAxKTsKKwl9IGVsc2UgaWYgKGExLmlzU3ltYm9sKCkpIHsKKwkgICAgaWYgKCEgZW5naW5lLmdldEhhc2hNYW5hZ2VyKCkuY29udGFpbnNLZXkoYTEpKQorCQl0aHJvdyBuZXcgRXhpc3RlbmNlRXhjZXB0aW9uKHRoaXMsIDEsICJoYXNoIiwgYTEsICIiKTsKKwkgICAgaGFzaCA9ICgoSmF2YU9iamVjdFRlcm0pIGVuZ2luZS5nZXRIYXNoTWFuYWdlcigpLmdldChhMSkpLm9iamVjdCgpOworCX0gZWxzZSBpZiAoYTEuaXNKYXZhT2JqZWN0KCkpIHsKKwkgICAgaGFzaCA9ICgoSmF2YU9iamVjdFRlcm0pIGExKS5vYmplY3QoKTsKKwl9IGVsc2UgeworCSAgICB0aHJvdyBuZXcgSWxsZWdhbERvbWFpbkV4Y2VwdGlvbih0aGlzLCAxLCAiaGFzaF9vcl9hbGlhcyIsIGExKTsKKwl9CisJaWYgKCEgKGhhc2ggaW5zdGFuY2VvZiBIYXNodGFibGVPZlRlcm0pKQorCSAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24odGhpcyArICI6IEhhc2ggaXMgbm90IEhhc2h0YWJsZU9mVGVybSIpOworCWEyID0gYTIuZGVyZWZlcmVuY2UoKTsKKwlUZXJtIGVsZW0gPSAoKEhhc2h0YWJsZU9mVGVybSkgaGFzaCkuZ2V0KGEyKTsKKwlpZiAoZWxlbSA9PSBudWxsKQorCSAgICBlbGVtID0gU1lNX05JTDsKKwlpZiAoISBhMy51bmlmeShlbGVtLCBlbmdpbmUudHJhaWwpKQorCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKyAgICAgICAgcmV0dXJuIGNvbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2hhc2hfaXNfZW1wdHlfMS5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2hhc2hfaXNfZW1wdHlfMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NmQ1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfaGFzaF9pc19lbXB0eV8xLmphdmEKQEAgLTAsMCArMSw1NyBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKy8qKgorICAgPGNvZGU+aGFzaF9pc19lbXB0eS8xPC9jb2RlPjxicj4KKyAgIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICAgQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAgIEB2ZXJzaW9uIDEuMAorKi8KK3B1YmxpYyBjbGFzcyBQUkVEX2hhc2hfaXNfZW1wdHlfMSBleHRlbmRzIFByZWRpY2F0ZSB7CisKKyAgICBwdWJsaWMgVGVybSBhcmcxOworCisgICAgcHVibGljIFBSRURfaGFzaF9pc19lbXB0eV8xKFRlcm0gYTEsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhMTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF9oYXNoX2lzX2VtcHR5XzEoKXt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGFyZ3NbMF07CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDE7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiaGFzaF9pc19lbXB0eSgiICsgYXJnMSArICIpIjsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKyAgICAgICAgVGVybSBhMTsKKyAgICAgICAgYTEgPSBhcmcxOworCisJT2JqZWN0IGhhc2ggPSBudWxsOworCisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOworCWlmIChhMS5pc1ZhcmlhYmxlKCkpIHsKKwkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDEpOworCX0gZWxzZSBpZiAoYTEuaXNTeW1ib2woKSkgeworCSAgICBpZiAoISBlbmdpbmUuZ2V0SGFzaE1hbmFnZXIoKS5jb250YWluc0tleShhMSkpCisJCXRocm93IG5ldyBFeGlzdGVuY2VFeGNlcHRpb24odGhpcywgMSwgImhhc2giLCBhMSwgIiIpOworCSAgICBoYXNoID0gKChKYXZhT2JqZWN0VGVybSkgZW5naW5lLmdldEhhc2hNYW5hZ2VyKCkuZ2V0KGExKSkub2JqZWN0KCk7CisJfSBlbHNlIGlmIChhMS5pc0phdmFPYmplY3QoKSkgeworCSAgICBoYXNoID0gKChKYXZhT2JqZWN0VGVybSkgYTEpLm9iamVjdCgpOworCX0gZWxzZSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDEsICJoYXNoX29yX2FsaWFzIiwgYTEpOworCX0KKwlpZiAoISAoaGFzaCBpbnN0YW5jZW9mIEhhc2h0YWJsZU9mVGVybSkpCisJICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbih0aGlzICsgIjogSGFzaCBpcyBub3QgSGFzaHRhYmxlT2ZUZXJtIik7CisJaWYgKCEgKChIYXNodGFibGVPZlRlcm0pIGhhc2gpLmlzRW1wdHkoKSkKKwkgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisgICAgICAgIHJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9oYXNoX2tleXNfMi5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2hhc2hfa2V5c18yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVlNjE4OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9oYXNoX2tleXNfMi5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0IGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworLyoqCisgICA8Y29kZT5oYXNoX2tleXMvMjwvY29kZT48YnI+CisgICBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAgIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgICBAdmVyc2lvbiAxLjAKKyovCitwdWJsaWMgY2xhc3MgUFJFRF9oYXNoX2tleXNfMiBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgcHVibGljIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9OSUwgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woIltdIik7CisgICAgcHVibGljIFRlcm0gYXJnMSwgYXJnMjsKKworICAgIHB1YmxpYyBQUkVEX2hhc2hfa2V5c18yKFRlcm0gYTEsIFRlcm0gYTIsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhMTsKKyAgICAgICAgYXJnMiA9IGEyOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEX2hhc2hfa2V5c18yKCl7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhcmdzWzBdOworICAgICAgICBhcmcyID0gYXJnc1sxXTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMjsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJoYXNoX2tleXMoIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworICAgICAgICBUZXJtIGExLCBhMjsKKyAgICAgICAgYTEgPSBhcmcxOworICAgICAgICBhMiA9IGFyZzI7CisKKwlPYmplY3QgaGFzaCA9IG51bGw7CisKKwlhMSA9IGExLmRlcmVmZXJlbmNlKCk7CisJaWYgKGExLmlzVmFyaWFibGUoKSkgeworCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMSk7CisJfSBlbHNlIGlmIChhMS5pc1N5bWJvbCgpKSB7CisJICAgIGlmICghIGVuZ2luZS5nZXRIYXNoTWFuYWdlcigpLmNvbnRhaW5zS2V5KGExKSkKKwkJdGhyb3cgbmV3IEV4aXN0ZW5jZUV4Y2VwdGlvbih0aGlzLCAxLCAiaGFzaCIsIGExLCAiIik7CisJICAgIGhhc2ggPSAoKEphdmFPYmplY3RUZXJtKSBlbmdpbmUuZ2V0SGFzaE1hbmFnZXIoKS5nZXQoYTEpKS5vYmplY3QoKTsKKwl9IGVsc2UgaWYgKGExLmlzSmF2YU9iamVjdCgpKSB7CisJICAgIGhhc2ggPSAoKEphdmFPYmplY3RUZXJtKSBhMSkub2JqZWN0KCk7CisJfSBlbHNlIHsKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxEb21haW5FeGNlcHRpb24odGhpcywgMSwgImhhc2hfb3JfYWxpYXMiLCBhMSk7CisJfQorCWlmICghIChoYXNoIGluc3RhbmNlb2YgSGFzaHRhYmxlT2ZUZXJtKSkKKwkgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKHRoaXMgKyAiOiBIYXNoIGlzIG5vdCBIYXNodGFibGVPZlRlcm0iKTsKKwlUZXJtIGtleXMgPSBTWU1fTklMOworCWZvciAoRW51bWVyYXRpb248VGVybT4gZSA9ICgoSGFzaHRhYmxlT2ZUZXJtKSBoYXNoKS5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KQorCSAgICBrZXlzID0gbmV3IExpc3RUZXJtKGUubmV4dEVsZW1lbnQoKSwga2V5cyk7CisJaWYgKCEgYTIudW5pZnkoa2V5cywgZW5naW5lLnRyYWlsKSkKKwkgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisgICAgICAgIHJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9oYXNoX3B1dF8zLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfaGFzaF9wdXRfMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4Nzk3NDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfaGFzaF9wdXRfMy5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0IGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisvKioKKyAgIDxjb2RlPmhhc2hfcHV0LzM8L2NvZGU+PGJyPgorICAgQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgICBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICAgQHZlcnNpb24gMS4wCisqLworcHVibGljIGNsYXNzIFBSRURfaGFzaF9wdXRfMyBleHRlbmRzIFByZWRpY2F0ZSB7CisKKyAgICBwdWJsaWMgVGVybSBhcmcxLCBhcmcyLCBhcmczOworCisgICAgcHVibGljIFBSRURfaGFzaF9wdXRfMyhUZXJtIGExLCBUZXJtIGEyLCBUZXJtIGEzLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYTE7CisgICAgICAgIGFyZzIgPSBhMjsKKyAgICAgICAgYXJnMyA9IGEzOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEX2hhc2hfcHV0XzMoKXt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGFyZ3NbMF07CisgICAgICAgIGFyZzIgPSBhcmdzWzFdOworICAgICAgICBhcmczID0gYXJnc1syXTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMzsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJoYXNoX3B1dCgiICsgYXJnMSArICIsIiArIGFyZzIgKyAiLCIgKyBhcmczICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworICAgICAgICBUZXJtIGExLCBhMiwgYTM7CisgICAgICAgIGExID0gYXJnMTsKKyAgICAgICAgYTIgPSBhcmcyOworICAgICAgICBhMyA9IGFyZzM7CisKKwlPYmplY3QgaGFzaCA9IG51bGw7CisKKwlhMSA9IGExLmRlcmVmZXJlbmNlKCk7CisJaWYgKGExLmlzVmFyaWFibGUoKSkgeworCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMSk7CisJfSBlbHNlIGlmIChhMS5pc1N5bWJvbCgpKSB7CisJICAgIGlmICghIGVuZ2luZS5nZXRIYXNoTWFuYWdlcigpLmNvbnRhaW5zS2V5KGExKSkKKwkJdGhyb3cgbmV3IEV4aXN0ZW5jZUV4Y2VwdGlvbih0aGlzLCAxLCAiaGFzaCIsIGExLCAiIik7CisJICAgIGhhc2ggPSAoKEphdmFPYmplY3RUZXJtKSBlbmdpbmUuZ2V0SGFzaE1hbmFnZXIoKS5nZXQoYTEpKS5vYmplY3QoKTsKKwl9IGVsc2UgaWYgKGExLmlzSmF2YU9iamVjdCgpKSB7CisJICAgIGhhc2ggPSAoKEphdmFPYmplY3RUZXJtKSBhMSkub2JqZWN0KCk7CisJfSBlbHNlIHsKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxEb21haW5FeGNlcHRpb24odGhpcywgMSwgImhhc2hfb3JfYWxpYXMiLCBhMSk7CisJfQorCWlmICghIChoYXNoIGluc3RhbmNlb2YgSGFzaHRhYmxlT2ZUZXJtKSkKKwkgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKHRoaXMgKyAiOiBIYXNoIGlzIG5vdCBIYXNodGFibGVPZlRlcm0iKTsKKwlhMiA9IGEyLmRlcmVmZXJlbmNlKCk7CisJYTMgPSBhMy5kZXJlZmVyZW5jZSgpOworCSgoSGFzaHRhYmxlT2ZUZXJtKSBoYXNoKS5wdXQoYTIsIGEzKTsKKyAgICAgICAgcmV0dXJuIGNvbnQ7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9oYXNoX3JlbW92ZV8yLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfaGFzaF9yZW1vdmVfMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMzAyNzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfaGFzaF9yZW1vdmVfMi5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0IGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisvKioKKyAgIDxjb2RlPmhhc2hfcmVtb3ZlLzI8L2NvZGU+PGJyPgorICAgQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgICBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICAgQHZlcnNpb24gMS4wCisqLworcHVibGljIGNsYXNzIFBSRURfaGFzaF9yZW1vdmVfMiBleHRlbmRzIFByZWRpY2F0ZSB7CisKKyAgICBwdWJsaWMgVGVybSBhcmcxLCBhcmcyOworCisgICAgcHVibGljIFBSRURfaGFzaF9yZW1vdmVfMihUZXJtIGExLCBUZXJtIGEyLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYTE7CisgICAgICAgIGFyZzIgPSBhMjsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF9oYXNoX3JlbW92ZV8yKCl7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhcmdzWzBdOworICAgICAgICBhcmcyID0gYXJnc1sxXTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMjsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJoYXNoX3JlbW92ZSgiICsgYXJnMSArICIsIiArIGFyZzIgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisgICAgICAgIFRlcm0gYTEsIGEyOworICAgICAgICBhMSA9IGFyZzE7CisgICAgICAgIGEyID0gYXJnMjsKKworCU9iamVjdCBoYXNoID0gbnVsbDsKKworCWExID0gYTEuZGVyZWZlcmVuY2UoKTsKKwlpZiAoYTEuaXNWYXJpYWJsZSgpKSB7CisJICAgIHRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAxKTsKKwl9IGVsc2UgaWYgKGExLmlzU3ltYm9sKCkpIHsKKwkgICAgaWYgKCEgZW5naW5lLmdldEhhc2hNYW5hZ2VyKCkuY29udGFpbnNLZXkoYTEpKQorCQl0aHJvdyBuZXcgRXhpc3RlbmNlRXhjZXB0aW9uKHRoaXMsIDEsICJoYXNoIiwgYTEsICIiKTsKKwkgICAgaGFzaCA9ICgoSmF2YU9iamVjdFRlcm0pIGVuZ2luZS5nZXRIYXNoTWFuYWdlcigpLmdldChhMSkpLm9iamVjdCgpOworCX0gZWxzZSBpZiAoYTEuaXNKYXZhT2JqZWN0KCkpIHsKKwkgICAgaGFzaCA9ICgoSmF2YU9iamVjdFRlcm0pIGExKS5vYmplY3QoKTsKKwl9IGVsc2UgeworCSAgICB0aHJvdyBuZXcgSWxsZWdhbERvbWFpbkV4Y2VwdGlvbih0aGlzLCAxLCAiaGFzaF9vcl9hbGlhcyIsIGExKTsKKwl9CisJaWYgKCEgKGhhc2ggaW5zdGFuY2VvZiBIYXNodGFibGVPZlRlcm0pKQorCSAgICB0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24odGhpcyArICI6IEhhc2ggaXMgbm90IEhhc2h0YWJsZU9mVGVybSIpOworCWEyID0gYTIuZGVyZWZlcmVuY2UoKTsKKwkoKEhhc2h0YWJsZU9mVGVybSkgaGFzaCkucmVtb3ZlKGEyKTsKKyAgICAgICAgcmV0dXJuIGNvbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2hhc2hfc2l6ZV8yLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfaGFzaF9zaXplXzIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGQxNGVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2hhc2hfc2l6ZV8yLmphdmEKQEAgLTAsMCArMSw2MyBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKy8qKgorICAgPGNvZGU+aGFzaF9zaXplLzI8L2NvZGU+PGJyPgorICAgQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgICBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICAgQHZlcnNpb24gMS4wCisqLworcHVibGljIGNsYXNzIFBSRURfaGFzaF9zaXplXzIgZXh0ZW5kcyBQcmVkaWNhdGUgeworCisgICAgcHVibGljIFRlcm0gYXJnMSwgYXJnMjsKKworICAgIHB1YmxpYyBQUkVEX2hhc2hfc2l6ZV8yKFRlcm0gYTEsIFRlcm0gYTIsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhMTsKKyAgICAgICAgYXJnMiA9IGEyOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEX2hhc2hfc2l6ZV8yKCl7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhcmdzWzBdOworICAgICAgICBhcmcyID0gYXJnc1sxXTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMjsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJoYXNoX3NpemUoIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworICAgICAgICBUZXJtIGExLCBhMjsKKyAgICAgICAgYTEgPSBhcmcxOworICAgICAgICBhMiA9IGFyZzI7CisKKwlPYmplY3QgaGFzaCA9IG51bGw7CisKKwlhMSA9IGExLmRlcmVmZXJlbmNlKCk7CisJaWYgKGExLmlzVmFyaWFibGUoKSkgeworCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMSk7CisJfSBlbHNlIGlmIChhMS5pc1N5bWJvbCgpKSB7CisJICAgIGlmICghIGVuZ2luZS5nZXRIYXNoTWFuYWdlcigpLmNvbnRhaW5zS2V5KGExKSkKKwkJdGhyb3cgbmV3IEV4aXN0ZW5jZUV4Y2VwdGlvbih0aGlzLCAxLCAiaGFzaCIsIGExLCAiIik7CisJICAgIGhhc2ggPSAoKEphdmFPYmplY3RUZXJtKSBlbmdpbmUuZ2V0SGFzaE1hbmFnZXIoKS5nZXQoYTEpKS5vYmplY3QoKTsKKwl9IGVsc2UgaWYgKGExLmlzSmF2YU9iamVjdCgpKSB7CisJICAgIGhhc2ggPSAoKEphdmFPYmplY3RUZXJtKSBhMSkub2JqZWN0KCk7CisJfSBlbHNlIHsKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxEb21haW5FeGNlcHRpb24odGhpcywgMSwgImhhc2hfb3JfYWxpYXMiLCBhMSk7CisJfQorCWlmICghIChoYXNoIGluc3RhbmNlb2YgSGFzaHRhYmxlT2ZUZXJtKSkKKwkgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKHRoaXMgKyAiOiBIYXNoIGlzIG5vdCBIYXNodGFibGVPZlRlcm0iKTsKKwlhMiA9IGEyLmRlcmVmZXJlbmNlKCk7CisJaWYgKCEgYTIuaXNWYXJpYWJsZSgpICYmICEgYTIuaXNJbnRlZ2VyKCkpCisJICAgIHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAxLCAiaW50ZWdlciIsIGEyKTsKKwlpZiAoISBhMi51bmlmeShuZXcgSW50ZWdlclRlcm0oKChIYXNodGFibGVPZlRlcm0paGFzaCkuc2l6ZSgpKSwgZW5naW5lLnRyYWlsKSkKKwkgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisgICAgICAgIHJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9qYXZhX2NvbnN0cnVjdG9yMF8yLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfamF2YV9jb25zdHJ1Y3RvcjBfMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhM2M1MDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfamF2YV9jb25zdHJ1Y3RvcjBfMi5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCAganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKKy8qKgorICogPGNvZGU+amF2YV9jb25zdHJ1Y3RvcjAvMjwvY29kZT4KKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMQorICovCitwdWJsaWMgY2xhc3MgUFJFRF9qYXZhX2NvbnN0cnVjdG9yMF8yIGV4dGVuZHMgSmF2YVByZWRpY2F0ZSB7CisgICAgVGVybSBhcmcxLCBhcmcyOworCisgICAgcHVibGljIFBSRURfamF2YV9jb25zdHJ1Y3RvcjBfMihUZXJtIGExLCBUZXJtIGEyLCBQcmVkaWNhdGUgY29udCkgeworCWFyZzEgPSBhMTsKKwlhcmcyID0gYTI7CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisgICAgcHVibGljIFBSRURfamF2YV9jb25zdHJ1Y3RvcjBfMigpIHt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpeworCWFyZzEgPSBhcmdzWzBdOworCWFyZzIgPSBhcmdzWzFdOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDI7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiAiamF2YV9jb25zdHJ1Y3RvcjAoIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIikiOyB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKwlUZXJtIGExLCBhMjsKKwlhMSA9IGFyZzE7CisJYTIgPSBhcmcyOworCisJQ2xhc3MgY2xhenogPSBudWxsOworCU9iamVjdCBpbnN0YW5jZSA9IG51bGw7CisJaW50IGFyaXR5OworCUNvbnN0cnVjdG9yW10gY29uc3RycyA9IG51bGw7CisJVGVybVtdIHBBcmdzID0gbnVsbDsKKwlPYmplY3RbXSBqQXJncyA9IG51bGw7CisJQ29uc3RydWN0b3IgYyA9IG51bGw7CisKKwl0cnkgeworCSAgICAvLyAybmQuIGFyZ3VtZW50ICh1bmJvdW5kIHZhcmlhYmxlKQorCSAgICBhMiA9IGEyLmRlcmVmZXJlbmNlKCk7CisJICAgIGlmICghIGEyLmlzVmFyaWFibGUoKSkKKwkJdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJ2YXJpYWJsZSIsIGEyKTsKKwkgICAgLy8gMXN0LiBhcmd1bWVudCAoYXRvbSBvciBjYWxsYWJsZSB0ZXJtKQorCSAgICBhMSA9IGExLmRlcmVmZXJlbmNlKCk7CisJICAgIGlmIChhMS5pc1ZhcmlhYmxlKCkpCisJCXRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAxKTsKKwkgICAgaWYgKCFhMS5pc1N5bWJvbCgpICYmICFhMS5pc1N0cnVjdHVyZSgpKQorCQl0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMSwgImNhbGxhYmxlIiwgYTEpOworCSAgICBpZiAoYTEuaXNTeW1ib2woKSkgeyAvLyBObyBhcmd1bWVudCBjb25zdHJ1Y3RvcgorCQljbGF6eiA9IENsYXNzLmZvck5hbWUoKChTeW1ib2xUZXJtKWExKS5uYW1lKCkpOworCQlpbnN0YW5jZSA9IGNsYXp6Lm5ld0luc3RhbmNlKCk7CisJCWlmICghIGEyLnVuaWZ5KHRvUHJvbG9nVGVybShpbnN0YW5jZSksIGVuZ2luZS50cmFpbCkpCisJCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKwkJcmV0dXJuIGNvbnQ7CisJICAgIH0gCisJICAgIC8vIFBhcmFtZXRlcml6ZWQgY29uc3RydWN0b3IKKwkgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKCgoU3RydWN0dXJlVGVybSlhMSkubmFtZSgpKTsKKwkgICAgYXJpdHkgID0gKChTdHJ1Y3R1cmVUZXJtKWExKS5hcml0eSgpOworCSAgICBjb25zdHJzID0gY2xhenouZ2V0Q29uc3RydWN0b3JzKCk7CisJICAgIGlmIChjb25zdHJzLmxlbmd0aCA9PSAwKQorCQl0aHJvdyBuZXcgRXhpc3RlbmNlRXhjZXB0aW9uKHRoaXMsIDEsICJjb25zdHJ1Y3RvciIsIGExLCAiIik7CisJICAgIHBBcmdzICA9ICgoU3RydWN0dXJlVGVybSlhMSkuYXJncygpOworCSAgICBqQXJncyAgPSBuZXcgT2JqZWN0W2FyaXR5XTsKKwkgICAgZm9yIChpbnQgaT0wOyBpPGFyaXR5OyBpKyspIHsKKwkJcEFyZ3NbaV0gPSBwQXJnc1tpXS5kZXJlZmVyZW5jZSgpOworCQlpZiAoISBwQXJnc1tpXS5pc0phdmFPYmplY3QoKSkKKwkJICAgIHBBcmdzW2ldID0gbmV3IEphdmFPYmplY3RUZXJtKHBBcmdzW2ldKTsKKwkJakFyZ3NbaV0gPSBwQXJnc1tpXS50b0phdmEoKTsKKwkgICAgfQorCSAgICBmb3IgKGludCBpPTA7IGk8Y29uc3Rycy5sZW5ndGg7IGkrKykgeworCQlpZiAoY2hlY2tQYXJhbWV0ZXJUeXBlcyhjb25zdHJzW2ldLmdldFBhcmFtZXRlclR5cGVzKCksIHBBcmdzKSkgeworCQkgICAgdHJ5IHsKKwkJCWMgPSBjb25zdHJzW2ldOyAKKwkJCS8vYy5zZXRBY2Nlc3NpYmxlKHRydWUpOworCQkJaW5zdGFuY2UgPSBjLm5ld0luc3RhbmNlKGpBcmdzKTsKKwkJCWJyZWFrOyAgICAvLyBTdWNjZWVkcyB0byBjcmVhdGUgbmV3IGluc3RhbmNlCisJCSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJYyA9IG51bGw7IC8vIEJhY2sgdG8gbG9vcAorCQkgICAgfQorCQl9CisJICAgIH0KKwkgICAgaWYgKGMgPT0gbnVsbCkKKwkJdGhyb3cgbmV3IEV4aXN0ZW5jZUV4Y2VwdGlvbih0aGlzLCAxLCAiY29uc3RydWN0b3IiLCBhMSwgIiIpOworCSAgICBpZiAoISBhMi51bmlmeSh0b1Byb2xvZ1Rlcm0oaW5zdGFuY2UpLCBlbmdpbmUudHJhaWwpKSAKKwkJcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJICAgIHJldHVybiBjb250OworCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeyAgICAvLyBDbGFzcy5mb3JOYW1lKC4uKQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAxLCBlKTsKKwl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsgICAgLy8gQ2xhc3MuZm9yTmFtZSguLikgb3IgQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoKQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAxLCBlKTsKKwl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsgICAgLy8gQ2xhc3MuZm9yTmFtZSguLikgb3IgQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoKQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAxLCBlKTsKKwl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7ICAgICAgICAgLy8gQ2xhc3MuZ2V0Q29uc3RydWN0b3JzKCkKKwkgICAgdGhyb3cgbmV3IEphdmFFeGNlcHRpb24odGhpcywgMSwgZSk7CisJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsgIC8vIENvbnN0cnVjdG9yLm5ld0luc3RhbmNlKCkKKwkgICAgdGhyb3cgbmV3IEphdmFFeGNlcHRpb24odGhpcywgMSwgZSk7CisJfQorICAgIH0KKworICAgIHByaXZhdGUgVGVybSB0b1Byb2xvZ1Rlcm0oT2JqZWN0IG9iaikgeworCWlmIChUZXJtLmluc3RhbmNlT2ZUZXJtKG9iaikpCisJICAgIHJldHVybiAoVGVybSlvYmo7CisJZWxzZSAKKwkgICAgcmV0dXJuIG5ldyBKYXZhT2JqZWN0VGVybShvYmopOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9qYXZhX2NvbnZlcnNpb25fMi5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2phdmFfY29udmVyc2lvbl8yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyNzUwYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9qYXZhX2NvbnZlcnNpb25fMi5qYXZhCkBAIC0wLDAgKzEsODAgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0IGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisvKioKKyAqIDxjb2RlPmphdmFfY29udmVyc2lvbi8yPC9jb2RlPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4xCisgKi8KK3B1YmxpYyBjbGFzcyBQUkVEX2phdmFfY29udmVyc2lvbl8yIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICBUZXJtIGFyZzEsIGFyZzI7CisKKyAgICBwdWJsaWMgUFJFRF9qYXZhX2NvbnZlcnNpb25fMihUZXJtIGExLCBUZXJtIGEyLCBQcmVkaWNhdGUgY29udCkgeworCWFyZzEgPSBhMTsKKwlhcmcyID0gYTI7CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisgICAgcHVibGljIFBSRURfamF2YV9jb252ZXJzaW9uXzIoKSB7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KXsKKwlhcmcxID0gYXJnc1swXTsKKwlhcmcyID0gYXJnc1sxXTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAyOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gImphdmFfY29udmVyc2lvbigiICsgYXJnMSArICIsIiArIGFyZzIgKyAiKSI7IH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworCVRlcm0gYTEsIGEyOworCWExID0gYXJnMTsKKwlhMiA9IGFyZzI7CisKKwlhMSA9IGExLmRlcmVmZXJlbmNlKCk7CisJYTIgPSBhMi5kZXJlZmVyZW5jZSgpOworCWlmIChhMS5pc1ZhcmlhYmxlKCkpIHsgLy8gYTEgPSB2YXIKKwkgICAgaWYgKGEyLmlzSmF2YU9iamVjdCgpKSB7IC8vIGExID0gdmFyIC9cIGEyID0gamF2YQorCQkoKFZhcmlhYmxlVGVybSlhMSkuYmluZChpbnZlcnNlQ29udmVyc2lvbigoKEphdmFPYmplY3RUZXJtKWEyKS5vYmplY3QoKSksIGVuZ2luZS50cmFpbCk7CisJICAgIH0gZWxzZSB7IC8vIGExID0gdmFyIC9cIGEyID0gbm9uamF2YQorCQkoKFZhcmlhYmxlVGVybSlhMSkuYmluZChhMiwgZW5naW5lLnRyYWlsKTsKKwkgICAgfQorCX0gZWxzZSBpZiAoISBhMi5pc1ZhcmlhYmxlKCkpIHsgLy8gYTEgPSBub252YXIgL1wgYTIgPSBub252YXIKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJ2YXJpYWJsZSIsIGEyKTsKKwl9IGVsc2UgeyAvLyBhMSA9IG5vbnZhciAvXCBhMiA9IHZhcgorCSAgICAvLyAoYTEgPSBqYXZhIFwvICBhMSA9IHN0ciBcLyBhMSA9IGNsbykgL1wgYTIgPSB2YXIKKwkgICAgaWYgKGExLmlzSmF2YU9iamVjdCgpIHx8IGExLmlzU3RydWN0dXJlKCkgfHwgYTEuaXNDbG9zdXJlKCkpIHsKKwkJKChWYXJpYWJsZVRlcm0pYTIpLmJpbmQoYTEsIGVuZ2luZS50cmFpbCk7CisJICAgIH0gZWxzZSB7IC8vIGExICE9IGphdmEgL1wgYTEgIT0gc3RyIC9cIGExICE9IGNsbyAvXCBhMiA9IHZhcgorCQkoKFZhcmlhYmxlVGVybSlhMikuYmluZChuZXcgSmF2YU9iamVjdFRlcm0oYTEudG9KYXZhKCkpLCBlbmdpbmUudHJhaWwpOworCSAgICB9CisJfQorCXJldHVybiBjb250OworICAgIH0KKworICAgIHByb3RlY3RlZCBUZXJtIGludmVyc2VDb252ZXJzaW9uKE9iamVjdCBvKSB7CisJaWYgKG8gPT0gbnVsbCkgeworCSAgICB0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbih0aGlzLCAyLCAidW5kZWZpbmVkIik7CisJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQnl0ZSAgICB8fCAKKwkJICAgbyBpbnN0YW5jZW9mIFNob3J0ICAgfHwKKwkJICAgbyBpbnN0YW5jZW9mIEludGVnZXIgfHwKKwkJICAgbyBpbnN0YW5jZW9mIExvbmcpIHsKKwkgICAgcmV0dXJuIG5ldyBJbnRlZ2VyVGVybSgoKE51bWJlcilvKS5pbnRWYWx1ZSgpKTsKKwl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGbG9hdCB8fCAKKwkJICAgbyBpbnN0YW5jZW9mIERvdWJsZSkgeworCSAgICByZXR1cm4gbmV3IERvdWJsZVRlcm0oKChOdW1iZXIpbykuZG91YmxlVmFsdWUoKSk7CisJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSB7CisJICAgIHJldHVybiBTeW1ib2xUZXJtLm1ha2VTeW1ib2woKFN0cmluZykgbyk7CisJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgVmVjdG9yKSB7CisJICAgIFZlY3RvciB2ID0gKFZlY3RvcikgbzsKKwkgICAgVGVybSB0ID0gUHJvbG9nLk5pbDsKKwkgICAgZm9yKGludCBpPSB2LnNpemUoKTsgaT4wOyBpLS0pIHsKKwkJdCA9IG5ldyBMaXN0VGVybShpbnZlcnNlQ29udmVyc2lvbih2LmVsZW1lbnRBdChpLTEpKSwgdCk7CisJICAgIH0KKwkgICAgcmV0dXJuIHQ7CisJfQorCXJldHVybiBuZXcgSmF2YU9iamVjdFRlcm0obyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2phdmFfZGVjbGFyZWRfY29uc3RydWN0b3IwXzIuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9qYXZhX2RlY2xhcmVkX2NvbnN0cnVjdG9yMF8yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI1YzQwOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9qYXZhX2RlY2xhcmVkX2NvbnN0cnVjdG9yMF8yLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOworLyoqCisgKiA8Y29kZT5qYXZhX2RlY2xhcmVkX2NvbnN0cnVjdG9yMC8yPC9jb2RlPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4xCisgKi8KK3B1YmxpYyBjbGFzcyBQUkVEX2phdmFfZGVjbGFyZWRfY29uc3RydWN0b3IwXzIgZXh0ZW5kcyBKYXZhUHJlZGljYXRlIHsKKyAgICBUZXJtIGFyZzEsIGFyZzI7CisKKyAgICBwdWJsaWMgUFJFRF9qYXZhX2RlY2xhcmVkX2NvbnN0cnVjdG9yMF8yKFRlcm0gYTEsIFRlcm0gYTIsIFByZWRpY2F0ZSBjb250KSB7CisJYXJnMSA9IGExOworCWFyZzIgPSBhMjsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKyAgICBwdWJsaWMgUFJFRF9qYXZhX2RlY2xhcmVkX2NvbnN0cnVjdG9yMF8yKCkge30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCl7CisJYXJnMSA9IGFyZ3NbMF07CisJYXJnMiA9IGFyZ3NbMV07CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMjsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuICJqYXZhX2RlY2xhcmVkX2NvbnN0cnVjdG9yMCgiICsgYXJnMSArICIsIiArIGFyZzIgKyAiKSI7IH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworCVRlcm0gYTEsIGEyOworCWExID0gYXJnMTsKKwlhMiA9IGFyZzI7CisKKwlDbGFzcyBjbGF6eiA9IG51bGw7CisJT2JqZWN0IGluc3RhbmNlID0gbnVsbDsKKwlpbnQgYXJpdHk7CisJQ29uc3RydWN0b3JbXSBjb25zdHJzID0gbnVsbDsKKwlUZXJtW10gcEFyZ3MgPSBudWxsOworCU9iamVjdFtdIGpBcmdzID0gbnVsbDsKKwlDb25zdHJ1Y3RvciBjID0gbnVsbDsKKworCS8vIDJuZC4gYXJndW1lbnQgKHVuYm91bmQgdmFyaWFibGUpCisJYTIgPSBhMi5kZXJlZmVyZW5jZSgpOworCWlmICghIGEyLmlzVmFyaWFibGUoKSkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJ2YXJpYWJsZSIsIGEyKTsKKwkvLyAxc3QuIGFyZ3VtZW50IChhdG9tIG9yIGNhbGxhYmxlIHRlcm0pCisJdHJ5IHsKKwkgICAgYTEgPSBhMS5kZXJlZmVyZW5jZSgpOworCSAgICBpZiAoYTEuaXNWYXJpYWJsZSgpKQorCQl0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMSk7CisJICAgIGlmICghYTEuaXNTeW1ib2woKSAmJiAhYTEuaXNTdHJ1Y3R1cmUoKSkKKwkJdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDEsICJjYWxsYWJsZSIsIGExKTsKKwkgICAgaWYgKGExLmlzU3ltYm9sKCkpIHsgLy8gTm8gYXJndW1lbnQgY29uc3RydWN0b3IKKwkJY2xhenogPSBDbGFzcy5mb3JOYW1lKCgoU3ltYm9sVGVybSlhMSkubmFtZSgpKTsKKwkJYyA9IGNsYXp6LmdldERlY2xhcmVkQ29uc3RydWN0b3IoKTsKKwkJaWYgKGMgPT0gbnVsbCkKKwkJICAgIHRocm93IG5ldyBFeGlzdGVuY2VFeGNlcHRpb24odGhpcywgMSwgImNvbnN0cnVjdG9yIiwgYTEsICIiKTsKKwkJYy5zZXRBY2Nlc3NpYmxlKHRydWUpOworCQlpbnN0YW5jZSA9IGMubmV3SW5zdGFuY2UoKTsKKwkJaWYgKCEgYTIudW5pZnkodG9Qcm9sb2dUZXJtKGluc3RhbmNlKSwgZW5naW5lLnRyYWlsKSkKKwkJICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOworCQlyZXR1cm4gY29udDsKKwkgICAgfSAKKwkgICAgLy8gUGFyYW1ldGVyaXplZCBjb25zdHJ1Y3RvcgorCSAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoKChTdHJ1Y3R1cmVUZXJtKWExKS5uYW1lKCkpOworCSAgICBhcml0eSAgPSAoKFN0cnVjdHVyZVRlcm0pYTEpLmFyaXR5KCk7CisJICAgIGNvbnN0cnMgPSBjbGF6ei5nZXREZWNsYXJlZENvbnN0cnVjdG9ycygpOworCSAgICBpZiAoY29uc3Rycy5sZW5ndGggPT0gMCkKKwkJdGhyb3cgbmV3IEV4aXN0ZW5jZUV4Y2VwdGlvbih0aGlzLCAxLCAiY29uc3RydWN0b3IiLCBhMSwgIiIpOworCSAgICBwQXJncyAgPSAoKFN0cnVjdHVyZVRlcm0pYTEpLmFyZ3MoKTsKKwkgICAgakFyZ3MgID0gbmV3IE9iamVjdFthcml0eV07CisJICAgIGZvciAoaW50IGk9MDsgaTxhcml0eTsgaSsrKSB7CisJCXBBcmdzW2ldID0gcEFyZ3NbaV0uZGVyZWZlcmVuY2UoKTsKKwkJaWYgKCEgcEFyZ3NbaV0uaXNKYXZhT2JqZWN0KCkpCisJCSAgICBwQXJnc1tpXSA9IG5ldyBKYXZhT2JqZWN0VGVybShwQXJnc1tpXSk7CisJCWpBcmdzW2ldID0gcEFyZ3NbaV0udG9KYXZhKCk7CisJICAgIH0KKwkgICAgZm9yIChpbnQgaT0wOyBpPGNvbnN0cnMubGVuZ3RoOyBpKyspIHsKKwkJaWYgKGNoZWNrUGFyYW1ldGVyVHlwZXMoY29uc3Ryc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpLCBwQXJncykpIHsKKwkJICAgIHRyeSB7CisJCQljID0gY29uc3Ryc1tpXTsgCisJCQljLnNldEFjY2Vzc2libGUodHJ1ZSk7CisJCQlpbnN0YW5jZSA9IGMubmV3SW5zdGFuY2UoakFyZ3MpOworCQkJYnJlYWs7ICAgIC8vIFN1Y2NlZWRzIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2UKKwkJICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQljID0gbnVsbDsgLy8gQmFjayB0byBsb29wCisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgICBpZiAoYyA9PSBudWxsKQorCQl0aHJvdyBuZXcgRXhpc3RlbmNlRXhjZXB0aW9uKHRoaXMsIDEsICJjb25zdHJ1Y3RvciIsIGExLCAiIik7CisJICAgIGlmICghIGEyLnVuaWZ5KHRvUHJvbG9nVGVybShpbnN0YW5jZSksIGVuZ2luZS50cmFpbCkpCisJCXJldHVybiBlbmdpbmUuZmFpbCgpOworCSAgICByZXR1cm4gY29udDsKKwl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsgICAgLy8gQ2xhc3MuZm9yTmFtZSguLikKKwkgICAgdGhyb3cgbmV3IEphdmFFeGNlcHRpb24odGhpcywgMSwgZSk7CisJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7ICAgIC8vIENsYXNzLmZvck5hbWUoLi4pIG9yIENvbnN0cnVjdG9yLm5ld0luc3RhbmNlKCkKKwkgICAgdGhyb3cgbmV3IEphdmFFeGNlcHRpb24odGhpcywgMSwgZSk7CisJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7ICAgIC8vIENsYXNzLmZvck5hbWUoLi4pIG9yIENvbnN0cnVjdG9yLm5ld0luc3RhbmNlKCkKKwkgICAgdGhyb3cgbmV3IEphdmFFeGNlcHRpb24odGhpcywgMSwgZSk7CisJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsgICAgIC8vIENsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IoKQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAxLCBlKTsKKwl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7ICAgICAgICAgLy8gQ2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAxLCBlKTsKKwl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeyAgLy8gQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoKQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAxLCBlKTsKKwl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsgLy8gQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoKQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAxLCBlKTsKKwl9CisgICAgfQorCisgICAgcHJpdmF0ZSBUZXJtIHRvUHJvbG9nVGVybShPYmplY3Qgb2JqKSB7CisJaWYgKFRlcm0uaW5zdGFuY2VPZlRlcm0ob2JqKSkKKwkgICAgcmV0dXJuIChUZXJtKW9iajsKKwllbHNlIAorCSAgICByZXR1cm4gbmV3IEphdmFPYmplY3RUZXJtKG9iaik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2phdmFfZGVjbGFyZWRfbWV0aG9kMF8zLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfamF2YV9kZWNsYXJlZF9tZXRob2QwXzMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTg0OTM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2phdmFfZGVjbGFyZWRfbWV0aG9kMF8zLmphdmEKQEAgLTAsMCArMSwxMzYgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOworLyoqCisgKiA8Y29kZT5qYXZhX2RlY2xhcmVkX21ldGhvZDAvMzwvY29kZT4KKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMQorICovCitwdWJsaWMgY2xhc3MgUFJFRF9qYXZhX2RlY2xhcmVkX21ldGhvZDBfMyBleHRlbmRzIEphdmFQcmVkaWNhdGUgeworICAgIFRlcm0gYXJnMSwgYXJnMiwgYXJnMzsKKworICAgIHB1YmxpYyBQUkVEX2phdmFfZGVjbGFyZWRfbWV0aG9kMF8zKCkge30KKyAgICBwdWJsaWMgUFJFRF9qYXZhX2RlY2xhcmVkX21ldGhvZDBfMyhUZXJtIGExLCBUZXJtIGEyLCBUZXJtIGEzLCBQcmVkaWNhdGUgY29udCkgeworCWFyZzEgPSBhMTsKKwlhcmcyID0gYTI7CisJYXJnMyA9IGEzOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KXsKKwlhcmcxID0gYXJnc1swXTsKKwlhcmcyID0gYXJnc1sxXTsKKwlhcmczID0gYXJnc1syXTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAzOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCXJldHVybiAiamF2YV9kZWNsYXJlZF9tZXRob2QwKCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIsIiArIGFyZzMgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisJVGVybSBhMSwgYTIsIGEzOworCWExID0gYXJnMTsKKwlhMiA9IGFyZzI7CisJYTMgPSBhcmczOworCisJQ2xhc3MgY2xhenogPSBudWxsOworCU9iamVjdCBpbnN0YW5jZSA9IG51bGw7CisJTWV0aG9kW10gbWV0aG9kcyA9IG51bGw7CisJTWV0aG9kIG0gPSBudWxsOworCU9iamVjdCB2YWx1ZSA9IG51bGw7CisJaW50IGFyaXR5OworCVRlcm1bXSBwQXJncyA9IG51bGw7CisJT2JqZWN0W10gakFyZ3MgPSBudWxsOworCVN0cmluZyBtZXRob2ROYW1lID0gbnVsbDsKKworCS8vIDNyZC4gYXJndW1lbnQgKHVuYm91bmQgdmFyaWFibGUpCisJYTMgPSBhMy5kZXJlZmVyZW5jZSgpOworCWlmICghIGEzLmlzVmFyaWFibGUoKSkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDMsICJ2YXJpYWJsZSIsIGEzKTsKKwl0cnkgeworCSAgICAvLyAxc3QuIGFyZ3VtZW50IChhdG9tIG9yIGphdmEgdGVybSkKKwkgICAgYTEgPSBhMS5kZXJlZmVyZW5jZSgpOworCSAgICBpZiAoYTEuaXNWYXJpYWJsZSgpKSB7CisJCXRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAxKTsKKwkgICAgfSBlbHNlIGlmIChhMS5pc1N5bWJvbCgpKXsgICAgICAvLyBjbGFzcworCQljbGF6eiA9IENsYXNzLmZvck5hbWUoKChTeW1ib2xUZXJtKWExKS5uYW1lKCkpOworCSAgICB9IGVsc2UgaWYgKGExLmlzSmF2YU9iamVjdCgpKSB7IC8vIGluc3RhbmNlCisJCWluc3RhbmNlID0gKChKYXZhT2JqZWN0VGVybSlhMSkub2JqZWN0KCk7CisJCWNsYXp6ID0gKChKYXZhT2JqZWN0VGVybSlhMSkuZ2V0Q2xhenooKTsKKwkgICAgfSBlbHNlIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDEsICJhdG9tX29yX2phdmEiLCBhMSk7CisJICAgIH0KKwkgICAgLy8gMm5kLiBhcmd1bWVudCAoYXRvbSBvciBjYWxsYWJsZSB0ZXJtKQorCSAgICBhMiA9IGEyLmRlcmVmZXJlbmNlKCk7CisJICAgIGlmIChhMi5pc1ZhcmlhYmxlKCkpIHsKKwkJdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDIpOworCSAgICB9IGVsc2UgaWYgKGEyLmlzU3ltYm9sKCkpIHsgICAgLy8gTm8gYXJndW1lbnQgbWV0aG9kCisJCW0gPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZCgoKFN5bWJvbFRlcm0pYTIpLm5hbWUoKSk7CisJCW0uc2V0QWNjZXNzaWJsZSh0cnVlKTsKKwkJdmFsdWUgPSBtLmludm9rZShpbnN0YW5jZSk7CisJICAgIH0gZWxzZSBpZiAoYTIuaXNTdHJ1Y3R1cmUoKSkgeyAvLyBQYXJhbWV0ZXJpemVkIG1ldGhvZAorCQltZXRob2ROYW1lID0gKChTdHJ1Y3R1cmVUZXJtKWEyKS5uYW1lKCk7CisJCWFyaXR5ICAgICAgPSAoKFN0cnVjdHVyZVRlcm0pYTIpLmFyaXR5KCk7CisJCW1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKKwkJaWYgKG1ldGhvZHMubGVuZ3RoID09IDApCisJCSAgICB0aHJvdyBuZXcgRXhpc3RlbmNlRXhjZXB0aW9uKHRoaXMsIDIsICJtZXRob2QiLCBhMiwgIiIpOworCQlwQXJncyA9ICgoU3RydWN0dXJlVGVybSlhMikuYXJncygpOworCQlqQXJncyA9IG5ldyBPYmplY3RbYXJpdHldOworCQlmb3IgKGludCBpPTA7IGk8YXJpdHk7IGkrKykgeworCQkgICAgcEFyZ3NbaV0gPSBwQXJnc1tpXS5kZXJlZmVyZW5jZSgpOworCQkgICAgaWYgKCEgcEFyZ3NbaV0uaXNKYXZhT2JqZWN0KCkpCisJCQlwQXJnc1tpXSA9IG5ldyBKYXZhT2JqZWN0VGVybShwQXJnc1tpXSk7CisJCSAgICBqQXJnc1tpXSA9IHBBcmdzW2ldLnRvSmF2YSgpOworCQl9CisJCWZvciAoaW50IGk9MDsgaTxtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisJCSAgICBpZiAobWV0aG9kc1tpXS5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpIAorCQkJJiYgIGNoZWNrUGFyYW1ldGVyVHlwZXMobWV0aG9kc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpLCBwQXJncykpIHsKKwkJCXRyeSB7CisJCQkgICAgbSA9IG1ldGhvZHNbaV07CisJCQkgICAgbS5zZXRBY2Nlc3NpYmxlKHRydWUpOworCQkJICAgIHZhbHVlID0gbS5pbnZva2UoaW5zdGFuY2UsIGpBcmdzKTsgCisJCQkgICAgYnJlYWs7ICAgICAvLyBTdWNjZWVkcyB0byBpbnZva2UgdGhlIG1ldGhvZAorCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCSAgICBtID0gbnVsbDsgIC8vIEJhY2sgdG8gbG9vcAorCQkJfQorCQkgICAgfQorCQl9CisJCWlmIChtID09IG51bGwpCisJCSAgICB0aHJvdyBuZXcgRXhpc3RlbmNlRXhjZXB0aW9uKHRoaXMsIDIsICJtZXRob2QiLCBhMiwgIiIpOworCSAgICB9IGVsc2UgeworCQl0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMiwgImNhbGxhYmxlIiwgYTIpOworCSAgICB9CisJICAgIGlmICh2YWx1ZSA9PSBudWxsKQorCQlyZXR1cm4gY29udDsKKwkgICAgaWYgKCEgYTMudW5pZnkodG9Qcm9sb2dUZXJtKHZhbHVlKSwgZW5naW5lLnRyYWlsKSkKKwkJcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJICAgIHJldHVybiBjb250OyAKKwl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsgICAgLy8gQ2xhc3MuZm9yTmFtZQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAxLCBlKTsKKwl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeyAgICAgLy8gQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QKKwkgICAgdGhyb3cgbmV3IEphdmFFeGNlcHRpb24odGhpcywgMiwgZSk7CisJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeyAgICAgICAgIC8vIENsYXNzLmdldERlY2xhcmVkTWV0aG9kcworCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAyLCBlKTsKKwl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsgICAgLy8gTWV0aG9kLmludm9rZQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAyLCBlKTsKKwl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeyAgLy8gTWV0aG9kLmludm9rZQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAyLCBlKTsKKwl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsgLy8gTWV0aG9kLmludm9rZQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAyLCBlKTsKKwl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7ICAgICAgLy8gTWV0aG9kLmludm9rZQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAyLCBlKTsKKwl9CisgICAgfQorCisgICAgcHJpdmF0ZSBUZXJtIHRvUHJvbG9nVGVybShPYmplY3Qgb2JqKSB7CisJaWYgKFRlcm0uaW5zdGFuY2VPZlRlcm0ob2JqKSkKKwkgICAgcmV0dXJuIChUZXJtKW9iajsKKwllbHNlIAorCSAgICByZXR1cm4gbmV3IEphdmFPYmplY3RUZXJtKG9iaik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2phdmFfZ2V0X2RlY2xhcmVkX2ZpZWxkMF8zLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfamF2YV9nZXRfZGVjbGFyZWRfZmllbGQwXzMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGFhODMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2phdmFfZ2V0X2RlY2xhcmVkX2ZpZWxkMF8zLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOworLyoqCisgKiA8Y29kZT5qYXZhX2dldF9kZWNsYXJlZF9maWVsZDAvMzwvY29kZT4KKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMQorICovCitwdWJsaWMgY2xhc3MgUFJFRF9qYXZhX2dldF9kZWNsYXJlZF9maWVsZDBfMyBleHRlbmRzIEphdmFQcmVkaWNhdGUgeworICAgIFRlcm0gYXJnMSwgYXJnMiwgYXJnMzsKKworICAgIHB1YmxpYyBQUkVEX2phdmFfZ2V0X2RlY2xhcmVkX2ZpZWxkMF8zKFRlcm0gYTEsIFRlcm0gYTIsIFRlcm0gYTMsIFByZWRpY2F0ZSBjb250KSB7CisJYXJnMSA9IGExOworCWFyZzIgPSBhMjsKKwlhcmczID0gYTM7CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisgICAgcHVibGljIFBSRURfamF2YV9nZXRfZGVjbGFyZWRfZmllbGQwXzMoKSB7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KXsKKwlhcmcxID0gYXJnc1swXTsKKwlhcmcyID0gYXJnc1sxXTsKKwlhcmczID0gYXJnc1syXTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAzOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCXJldHVybiAiamF2YV9nZXRfZGVjbGFyZWRfZmllbGQwKCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIsIiArIGFyZzMgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisJVGVybSBhMSwgYTIsIGEzOworCWExID0gYXJnMTsKKwlhMiA9IGFyZzI7CisJYTMgPSBhcmczOworCisJQ2xhc3MgIGNsYXp6ID0gbnVsbDsKKwlPYmplY3QgaW5zdGFuY2UgPSBudWxsOworCUZpZWxkICBmaWVsZCA9IG51bGw7CisJT2JqZWN0IHZhbHVlID0gbnVsbDsKKworCS8vIDNyZC4gYXJndW1lbnQgKHVuYm91bmQgdmFyaWFibGUpCisJYTMgPSBhMy5kZXJlZmVyZW5jZSgpOworCWlmICghIGEzLmlzVmFyaWFibGUoKSkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDMsICJ2YXJpYWJsZSIsIGEzKTsKKwl0cnkgeworCSAgICAvLyAxc3QuIGFyZ3VtZW50IChhdG9tIG9yIGphdmEgdGVybSkKKwkgICAgYTEgPSBhMS5kZXJlZmVyZW5jZSgpOworCSAgICBpZiAoYTEuaXNWYXJpYWJsZSgpKSB7CQorCQl0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMSk7CisJICAgIH0gZWxzZSBpZiAoYTEuaXNTeW1ib2woKSl7ICAgICAgLy8gY2xhc3MKKwkJY2xhenogPSBDbGFzcy5mb3JOYW1lKCgoU3ltYm9sVGVybSlhMSkubmFtZSgpKTsKKwkgICAgfSBlbHNlIGlmIChhMS5pc0phdmFPYmplY3QoKSkgeyAvLyBpbnN0YW5jZQorCQlpbnN0YW5jZSA9ICgoSmF2YU9iamVjdFRlcm0pYTEpLm9iamVjdCgpOworCQljbGF6eiA9ICgoSmF2YU9iamVjdFRlcm0pYTEpLmdldENsYXp6KCk7CisJICAgIH0gZWxzZSB7CisJCXRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAxLCAiYXRvbV9vcl9qYXZhIiwgYTEpOworCSAgICB9CisJICAgIC8vIDJuZC4gYXJndW1lbnQgKGF0b20pCisJICAgIGEyID0gYTIuZGVyZWZlcmVuY2UoKTsKKwkgICAgaWYgKGEyLmlzVmFyaWFibGUoKSkgeworCQl0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMik7CisJICAgIH0gZWxzZSBpZiAoISBhMi5pc1N5bWJvbCgpKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAyLCAiYXRvbSIsIGEyKTsKKwkgICAgfQorCSAgICBmaWVsZCA9IGNsYXp6LmdldERlY2xhcmVkRmllbGQoKChTeW1ib2xUZXJtKWEyKS5uYW1lKCkpOworCSAgICBmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworCSAgICB2YWx1ZSA9IGZpZWxkLmdldChpbnN0YW5jZSk7CisJICAgIC8vIDNyZC4gYXJndW1lbnQKKwkgICAgaWYgKHZhbHVlID09IG51bGwpCisJCXJldHVybiBjb250OworCSAgICBpZiAoISBhMy51bmlmeSh0b1Byb2xvZ1Rlcm0odmFsdWUpLCBlbmdpbmUudHJhaWwpKSAKKwkJcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJICAgIHJldHVybiBjb250OyAKKwl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsgICAgLy8gQ2xhc3MuZm9yTmFtZQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAxLCBlKTsKKwl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7ICAgICAgLy8gQ2xhc3MuZ2V0RmllbGQoLi4pCisJICAgIHRocm93IG5ldyBKYXZhRXhjZXB0aW9uKHRoaXMsIDIsIGUpOworCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsgICAgICAgICAvLyBDbGFzcy5nZXRGaWVsZCguLikKKwkgICAgdGhyb3cgbmV3IEphdmFFeGNlcHRpb24odGhpcywgMiwgZSk7CisJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeyAgICAgIC8vIENsYXNzLmdldEZpZWxkKC4uKQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAyLCBlKTsKKwl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsgICAgLy8gRmllbGQuZ2V0KC4uKQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAyLCBlKTsKKwl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeyAgLy8gRmllbGQuZ2V0KC4uKQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAyLCBlKTsKKwl9CisgICAgfQorCisgICAgcHJpdmF0ZSBUZXJtIHRvUHJvbG9nVGVybShPYmplY3Qgb2JqKSB7CisJaWYgKFRlcm0uaW5zdGFuY2VPZlRlcm0ob2JqKSkKKwkgICAgcmV0dXJuIChUZXJtKW9iajsKKwllbHNlIAorCSAgICByZXR1cm4gbmV3IEphdmFPYmplY3RUZXJtKG9iaik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2phdmFfZ2V0X2ZpZWxkMF8zLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfamF2YV9nZXRfZmllbGQwXzMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTQ5ZTdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2phdmFfZ2V0X2ZpZWxkMF8zLmphdmEKQEAgLTAsMCArMSw5OSBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQgIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CisvKioKKyAqIDxjb2RlPmphdmFfZ2V0X2ZpZWxkMC8zPC9jb2RlPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4xCisgKi8KK3B1YmxpYyBjbGFzcyBQUkVEX2phdmFfZ2V0X2ZpZWxkMF8zIGV4dGVuZHMgSmF2YVByZWRpY2F0ZSB7CisgICAgVGVybSBhcmcxLCBhcmcyLCBhcmczOworCisgICAgcHVibGljIFBSRURfamF2YV9nZXRfZmllbGQwXzMoVGVybSBhMSwgVGVybSBhMiwgVGVybSBhMywgUHJlZGljYXRlIGNvbnQpIHsKKwlhcmcxID0gYTE7CisJYXJnMiA9IGEyOworCWFyZzMgPSBhMzsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKyAgICBwdWJsaWMgUFJFRF9qYXZhX2dldF9maWVsZDBfMygpIHt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpeworCWFyZzEgPSBhcmdzWzBdOworCWFyZzIgPSBhcmdzWzFdOworCWFyZzMgPSBhcmdzWzJdOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDM7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJcmV0dXJuICJqYXZhX2dldF9maWVsZDAoIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIiwiICsgYXJnMyArICIpIjsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKwlUZXJtIGExLCBhMiwgYTM7CisJYTEgPSBhcmcxOworCWEyID0gYXJnMjsKKwlhMyA9IGFyZzM7CisKKwlDbGFzcyAgY2xhenogPSBudWxsOworCU9iamVjdCBpbnN0YW5jZSA9IG51bGw7CisJRmllbGQgIGZpZWxkID0gbnVsbDsKKwlPYmplY3QgdmFsdWUgPSBudWxsOworCisJLy8gM3JkLiBhcmd1bWVudCAodW5ib3VuZCB2YXJpYWJsZSkKKwlhMyA9IGEzLmRlcmVmZXJlbmNlKCk7CisJaWYgKCEgYTMuaXNWYXJpYWJsZSgpKQorCSAgICB0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMywgInZhcmlhYmxlIiwgYTMpOworCXRyeSB7CisJICAgIC8vIDFzdC4gYXJndW1lbnQgKGF0b20gb3IgamF2YSB0ZXJtKQorCSAgICBhMSA9IGExLmRlcmVmZXJlbmNlKCk7CisJICAgIGlmIChhMS5pc1ZhcmlhYmxlKCkpIHsJCisJCXRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAxKTsKKwkgICAgfSBlbHNlIGlmIChhMS5pc1N5bWJvbCgpKXsgICAgICAvLyBjbGFzcworCQljbGF6eiA9IENsYXNzLmZvck5hbWUoKChTeW1ib2xUZXJtKWExKS5uYW1lKCkpOworCSAgICB9IGVsc2UgaWYgKGExLmlzSmF2YU9iamVjdCgpKSB7IC8vIGluc3RhbmNlCisJCWluc3RhbmNlID0gKChKYXZhT2JqZWN0VGVybSlhMSkub2JqZWN0KCk7CisJCWNsYXp6ID0gKChKYXZhT2JqZWN0VGVybSlhMSkuZ2V0Q2xhenooKTsKKwkgICAgfSBlbHNlIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDEsICJhdG9tX29yX2phdmEiLCBhMSk7CisJICAgIH0KKwkgICAgLy8gMm5kLiBhcmd1bWVudCAoYXRvbSkKKwkgICAgYTIgPSBhMi5kZXJlZmVyZW5jZSgpOworCSAgICBpZiAoYTIuaXNWYXJpYWJsZSgpKSB7CisJCXRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAyKTsKKwkgICAgfSBlbHNlIGlmICghIGEyLmlzU3ltYm9sKCkpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJhdG9tIiwgYTIpOworCSAgICB9CisJICAgIGZpZWxkID0gY2xhenouZ2V0RmllbGQoKChTeW1ib2xUZXJtKWEyKS5uYW1lKCkpOworCSAgICB2YWx1ZSA9IGZpZWxkLmdldChpbnN0YW5jZSk7CisJICAgIC8vIDNyZC4gYXJndW1lbnQKKwkgICAgaWYgKHZhbHVlID09IG51bGwpCisJCXJldHVybiBjb250OworCSAgICBpZiAoISBhMy51bmlmeSh0b1Byb2xvZ1Rlcm0odmFsdWUpLCBlbmdpbmUudHJhaWwpKSAKKwkJcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJICAgIHJldHVybiBjb250OyAKKwl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsgICAgLy8gQ2xhc3MuZm9yTmFtZQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAxLCBlKTsKKwl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7ICAgICAgLy8gQ2xhc3MuZ2V0RmllbGQoLi4pCisJICAgIHRocm93IG5ldyBKYXZhRXhjZXB0aW9uKHRoaXMsIDIsIGUpOworCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsgICAgICAgICAvLyBDbGFzcy5nZXRGaWVsZCguLikKKwkgICAgdGhyb3cgbmV3IEphdmFFeGNlcHRpb24odGhpcywgMiwgZSk7CisJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeyAgICAgIC8vIENsYXNzLmdldEZpZWxkKC4uKQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAyLCBlKTsKKwl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsgICAgLy8gRmllbGQuZ2V0KC4uKQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAyLCBlKTsKKwl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeyAgLy8gRmllbGQuZ2V0KC4uKQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAyLCBlKTsKKwl9CisgICAgfQorCisgICAgcHJpdmF0ZSBUZXJtIHRvUHJvbG9nVGVybShPYmplY3Qgb2JqKSB7CisJaWYgKFRlcm0uaW5zdGFuY2VPZlRlcm0ob2JqKSkKKwkgICAgcmV0dXJuIChUZXJtKW9iajsKKwllbHNlIAorCSAgICByZXR1cm4gbmV3IEphdmFPYmplY3RUZXJtKG9iaik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2phdmFfbWV0aG9kMF8zLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfamF2YV9tZXRob2QwXzMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJiYzA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2phdmFfbWV0aG9kMF8zLmphdmEKQEAgLTAsMCArMSwxMzQgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOworLyoqCisgKiA8Y29kZT5qYXZhX21ldGhvZDAvMzwvY29kZT4KKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMQorICovCitwdWJsaWMgY2xhc3MgUFJFRF9qYXZhX21ldGhvZDBfMyBleHRlbmRzIEphdmFQcmVkaWNhdGUgeworICAgIFRlcm0gYXJnMSwgYXJnMiwgYXJnMzsKKworICAgIHB1YmxpYyBQUkVEX2phdmFfbWV0aG9kMF8zKCkge30KKyAgICBwdWJsaWMgUFJFRF9qYXZhX21ldGhvZDBfMyhUZXJtIGExLCBUZXJtIGEyLCBUZXJtIGEzLCBQcmVkaWNhdGUgY29udCkgeworCWFyZzEgPSBhMTsKKwlhcmcyID0gYTI7CisJYXJnMyA9IGEzOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KXsKKwlhcmcxID0gYXJnc1swXTsKKwlhcmcyID0gYXJnc1sxXTsKKwlhcmczID0gYXJnc1syXTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAzOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gImphdmFfbWV0aG9kMCgiICsgYXJnMSArICIsIiArIGFyZzIgKyAiLCIgKyBhcmczICsgIikiOyB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKwlUZXJtIGExLCBhMiwgYTM7CisJYTEgPSBhcmcxOworCWEyID0gYXJnMjsKKwlhMyA9IGFyZzM7CisKKwlDbGFzcyBjbGF6eiA9IG51bGw7CisJT2JqZWN0IGluc3RhbmNlID0gbnVsbDsKKwlNZXRob2RbXSBtZXRob2RzID0gbnVsbDsKKwlNZXRob2QgbSA9IG51bGw7CisJT2JqZWN0IHZhbHVlID0gbnVsbDsKKwlpbnQgYXJpdHk7CisJVGVybVtdIHBBcmdzID0gbnVsbDsKKwlPYmplY3RbXSBqQXJncyA9IG51bGw7CisJU3RyaW5nIG1ldGhvZE5hbWUgPSBudWxsOworCisJLy8gM3JkLiBhcmd1bWVudCAodW5ib3VuZCB2YXJpYWJsZSkKKwlhMyA9IGEzLmRlcmVmZXJlbmNlKCk7CisJaWYgKCEgYTMuaXNWYXJpYWJsZSgpKQorCSAgICB0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMywgInZhcmlhYmxlIiwgYTMpOworCXRyeSB7CisJICAgIC8vIDFzdC4gYXJndW1lbnQgKGF0b20gb3IgamF2YSB0ZXJtKQorCSAgICBhMSA9IGExLmRlcmVmZXJlbmNlKCk7CisJICAgIGlmIChhMS5pc1ZhcmlhYmxlKCkpIHsKKwkJdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDEpOworCSAgICB9IGVsc2UgaWYgKGExLmlzU3ltYm9sKCkpeyAgICAgIC8vIGNsYXNzCisJCWNsYXp6ID0gQ2xhc3MuZm9yTmFtZSgoKFN5bWJvbFRlcm0pYTEpLm5hbWUoKSk7CisJICAgIH0gZWxzZSBpZiAoYTEuaXNKYXZhT2JqZWN0KCkpIHsgLy8gaW5zdGFuY2UKKwkJaW5zdGFuY2UgPSAoKEphdmFPYmplY3RUZXJtKWExKS5vYmplY3QoKTsKKwkJY2xhenogPSAoKEphdmFPYmplY3RUZXJtKWExKS5nZXRDbGF6eigpOworCSAgICB9IGVsc2UgeworCQl0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMSwgImF0b21fb3JfamF2YSIsIGExKTsKKwkgICAgfQorCSAgICAvLyAybmQuIGFyZ3VtZW50IChhdG9tIG9yIGNhbGxhYmxlIHRlcm0pCisJICAgIGEyID0gYTIuZGVyZWZlcmVuY2UoKTsKKwkgICAgaWYgKGEyLmlzVmFyaWFibGUoKSkgeworCQl0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMik7CisJICAgIH0gZWxzZSBpZiAoYTIuaXNTeW1ib2woKSkgeyAgICAvLyBObyBhcmd1bWVudCBtZXRob2QKKwkJbSA9IGNsYXp6LmdldE1ldGhvZCgoKFN5bWJvbFRlcm0pYTIpLm5hbWUoKSk7CisJCS8vbS5zZXRBY2Nlc3NpYmxlKHRydWUpOworCQl2YWx1ZSA9IG0uaW52b2tlKGluc3RhbmNlKTsKKwkgICAgfSBlbHNlIGlmIChhMi5pc1N0cnVjdHVyZSgpKSB7IC8vIFBhcmFtZXRlcml6ZWQgbWV0aG9kCisJCW1ldGhvZE5hbWUgPSAoKFN0cnVjdHVyZVRlcm0pYTIpLm5hbWUoKTsKKwkJYXJpdHkgICAgICA9ICgoU3RydWN0dXJlVGVybSlhMikuYXJpdHkoKTsKKwkJbWV0aG9kcyA9IGNsYXp6LmdldE1ldGhvZHMoKTsKKwkJaWYgKG1ldGhvZHMubGVuZ3RoID09IDApCisJCSAgICB0aHJvdyBuZXcgRXhpc3RlbmNlRXhjZXB0aW9uKHRoaXMsIDIsICJtZXRob2QiLCBhMiwgIiIpOworCQlwQXJncyA9ICgoU3RydWN0dXJlVGVybSlhMikuYXJncygpOworCQlqQXJncyA9IG5ldyBPYmplY3RbYXJpdHldOworCQlmb3IgKGludCBpPTA7IGk8YXJpdHk7IGkrKykgeworCQkgICAgcEFyZ3NbaV0gPSBwQXJnc1tpXS5kZXJlZmVyZW5jZSgpOworCQkgICAgaWYgKCEgcEFyZ3NbaV0uaXNKYXZhT2JqZWN0KCkpCisJCQlwQXJnc1tpXSA9IG5ldyBKYXZhT2JqZWN0VGVybShwQXJnc1tpXSk7CisJCSAgICBqQXJnc1tpXSA9IHBBcmdzW2ldLnRvSmF2YSgpOworCQl9CisJCWZvciAoaW50IGk9MDsgaTxtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisJCSAgICBpZiAobWV0aG9kc1tpXS5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpIAorCQkJJiYgIGNoZWNrUGFyYW1ldGVyVHlwZXMobWV0aG9kc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpLCBwQXJncykpIHsKKwkJCXRyeSB7CisJCQkgICAgbSA9IG1ldGhvZHNbaV07CisJCQkgICAgLy9tLnNldEFjY2Vzc2libGUodHJ1ZSk7CisJCQkgICAgdmFsdWUgPSBtLmludm9rZShpbnN0YW5jZSwgakFyZ3MpOyAKKwkJCSAgICBicmVhazsgICAgIC8vIFN1Y2NlZWRzIHRvIGludm9rZSB0aGUgbWV0aG9kCisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJICAgIG0gPSBudWxsOyAgLy8gQmFjayB0byBsb29wCisJCQl9CisJCSAgICB9CisJCX0KKwkJaWYgKG0gPT0gbnVsbCkKKwkJICAgIHRocm93IG5ldyBFeGlzdGVuY2VFeGNlcHRpb24odGhpcywgMiwgIm1ldGhvZCIsIGEyLCAiIik7CisJICAgIH0gZWxzZSB7CisJCXRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAyLCAiY2FsbGFibGUiLCBhMik7CisJICAgIH0KKwkgICAgaWYgKHZhbHVlID09IG51bGwpCisJCXJldHVybiBjb250OworCSAgICBpZiAoISBhMy51bmlmeSh0b1Byb2xvZ1Rlcm0odmFsdWUpLCBlbmdpbmUudHJhaWwpKQorCQlyZXR1cm4gZW5naW5lLmZhaWwoKTsKKwkgICAgcmV0dXJuIGNvbnQ7IAorCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeyAgICAvLyBDbGFzcy5mb3JOYW1lCisJICAgIHRocm93IG5ldyBKYXZhRXhjZXB0aW9uKHRoaXMsIDEsIGUpOworCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7ICAgICAvLyBDbGFzcy5nZXREZWNsYXJlZE1ldGhvZAorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAyLCBlKTsKKwl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7ICAgICAgICAgLy8gQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzCisJICAgIHRocm93IG5ldyBKYXZhRXhjZXB0aW9uKHRoaXMsIDIsIGUpOworCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeyAgICAvLyBNZXRob2QuaW52b2tlCisJICAgIHRocm93IG5ldyBKYXZhRXhjZXB0aW9uKHRoaXMsIDIsIGUpOworCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7ICAvLyBNZXRob2QuaW52b2tlCisJICAgIHRocm93IG5ldyBKYXZhRXhjZXB0aW9uKHRoaXMsIDIsIGUpOworCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeyAvLyBNZXRob2QuaW52b2tlCisJICAgIHRocm93IG5ldyBKYXZhRXhjZXB0aW9uKHRoaXMsIDIsIGUpOworCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsgICAgICAvLyBNZXRob2QuaW52b2tlCisJICAgIHRocm93IG5ldyBKYXZhRXhjZXB0aW9uKHRoaXMsIDIsIGUpOworCX0KKyAgICB9CisKKyAgICBwcml2YXRlIFRlcm0gdG9Qcm9sb2dUZXJtKE9iamVjdCBvYmopIHsKKwlpZiAoVGVybS5pbnN0YW5jZU9mVGVybShvYmopKQorCSAgICByZXR1cm4gKFRlcm0pb2JqOworCWVsc2UgCisJICAgIHJldHVybiBuZXcgSmF2YU9iamVjdFRlcm0ob2JqKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfamF2YV9zZXRfZGVjbGFyZWRfZmllbGQwXzMuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9qYXZhX3NldF9kZWNsYXJlZF9maWVsZDBfMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZWE4Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfamF2YV9zZXRfZGVjbGFyZWRfZmllbGQwXzMuamF2YQpAQCAtMCwwICsxLDkyIEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCAganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKKy8qKgorICogPGNvZGU+amF2YV9zZXRfZGVjbGFyZWRfZmllbGQwLzM8L2NvZGU+CisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjEKKyAqLworcHVibGljIGNsYXNzIFBSRURfamF2YV9zZXRfZGVjbGFyZWRfZmllbGQwXzMgZXh0ZW5kcyBKYXZhUHJlZGljYXRlIHsKKyAgICBUZXJtIGFyZzEsIGFyZzIsIGFyZzM7CisKKyAgICBwdWJsaWMgUFJFRF9qYXZhX3NldF9kZWNsYXJlZF9maWVsZDBfMyhUZXJtIGExLCBUZXJtIGEyLCBUZXJtIGEzLCBQcmVkaWNhdGUgY29udCkgeworCWFyZzEgPSBhMTsKKwlhcmcyID0gYTI7CisJYXJnMyA9IGEzOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorICAgIHB1YmxpYyBQUkVEX2phdmFfc2V0X2RlY2xhcmVkX2ZpZWxkMF8zKCkge30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCl7CisJYXJnMSA9IGFyZ3NbMF07CisJYXJnMiA9IGFyZ3NbMV07CisJYXJnMyA9IGFyZ3NbMl07CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMzsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlyZXR1cm4gImphdmFfc2V0X2RlY2xhcmVkX2ZpZWxkMCgiICsgYXJnMSArICIsIiArIGFyZzIgKyAiLCIgKyBhcmczICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworCVRlcm0gYTEsIGEyLCBhMzsKKwlhMSA9IGFyZzE7CisJYTIgPSBhcmcyOworCWEzID0gYXJnMzsKKworCUNsYXNzICBjbGF6eiA9IG51bGw7CisJT2JqZWN0IGluc3RhbmNlID0gbnVsbDsKKwlGaWVsZCAgZmllbGQgPSBudWxsOworCU9iamVjdCB2YWx1ZSA9IG51bGw7CisKKwl0cnkgeworCSAgICAvLyAxc3QuIGFyZ3VtZW50IChhdG9tIG9yIGphdmEgdGVybSkKKwkgICAgYTEgPSBhMS5kZXJlZmVyZW5jZSgpOworCSAgICBpZiAoYTEuaXNWYXJpYWJsZSgpKSB7CQorCQl0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMSk7CisJICAgIH0gZWxzZSBpZiAoYTEuaXNTeW1ib2woKSl7ICAgICAgLy8gY2xhc3MKKwkJY2xhenogPSBDbGFzcy5mb3JOYW1lKCgoU3ltYm9sVGVybSlhMSkubmFtZSgpKTsKKwkgICAgfSBlbHNlIGlmIChhMS5pc0phdmFPYmplY3QoKSkgeyAvLyBpbnN0YW5jZQorCQlpbnN0YW5jZSA9ICgoSmF2YU9iamVjdFRlcm0pYTEpLm9iamVjdCgpOworCQljbGF6eiA9ICgoSmF2YU9iamVjdFRlcm0pYTEpLmdldENsYXp6KCk7CisJICAgIH0gZWxzZSB7CisJCXRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAxLCAiYXRvbV9vcl9qYXZhIiwgYTEpOworCSAgICB9CisJICAgIC8vIDJuZC4gYXJndW1lbnQgKGF0b20pCisJICAgIGEyID0gYTIuZGVyZWZlcmVuY2UoKTsKKwkgICAgaWYgKGEyLmlzVmFyaWFibGUoKSkgeworCQl0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMik7CisJICAgIH0gZWxzZSBpZiAoISBhMi5pc1N5bWJvbCgpKSB7CisJCXRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAyLCAiYXRvbSIsIGEyKTsKKwkgICAgfQorCSAgICBmaWVsZCA9IGNsYXp6LmdldERlY2xhcmVkRmllbGQoKChTeW1ib2xUZXJtKWEyKS5uYW1lKCkpOworCSAgICAvLyAzcmQuIGFyZ3VtZW50ICh0ZXJtKQorCSAgICBhMyA9IGEzLmRlcmVmZXJlbmNlKCk7CisJICAgIGlmIChhMy5pc0phdmFPYmplY3QoKSkKKwkJdmFsdWUgPSBhMy50b0phdmEoKTsKKwkgICAgZWxzZQorCQl2YWx1ZSA9IGEzOworCSAgICBmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworCSAgICBmaWVsZC5zZXQoaW5zdGFuY2UsIHZhbHVlKTsKKwkgICAgcmV0dXJuIGNvbnQ7IAorCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeyAgICAvLyBDbGFzcy5mb3JOYW1lCisJICAgIHRocm93IG5ldyBKYXZhRXhjZXB0aW9uKHRoaXMsIDEsIGUpOworCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsgICAgICAvLyBDbGFzcy5nZXRGaWVsZCguLikKKwkgICAgdGhyb3cgbmV3IEphdmFFeGNlcHRpb24odGhpcywgMiwgZSk7CisJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeyAgICAgICAgIC8vIENsYXNzLmdldEZpZWxkKC4uKQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAyLCBlKTsKKwl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7ICAgICAgLy8gQ2xhc3MuZ2V0RmllbGQoLi4pCisJICAgIHRocm93IG5ldyBKYXZhRXhjZXB0aW9uKHRoaXMsIDIsIGUpOworCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeyAgICAvLyBGaWVsZC5nZXQoLi4pCisJICAgIHRocm93IG5ldyBKYXZhRXhjZXB0aW9uKHRoaXMsIDIsIGUpOworCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7ICAvLyBGaWVsZC5nZXQoLi4pCisJICAgIHRocm93IG5ldyBKYXZhRXhjZXB0aW9uKHRoaXMsIDIsIGUpOworCX0KKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2phdmFfc2V0X2ZpZWxkMF8zLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfamF2YV9zZXRfZmllbGQwXzMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njk3NmUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX2phdmFfc2V0X2ZpZWxkMF8zLmphdmEKQEAgLTAsMCArMSw5MSBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQgIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CisvKioKKyAqIDxjb2RlPmphdmFfc2V0X2ZpZWxkMC8zPC9jb2RlPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4xCisgKi8KK3B1YmxpYyBjbGFzcyBQUkVEX2phdmFfc2V0X2ZpZWxkMF8zIGV4dGVuZHMgSmF2YVByZWRpY2F0ZSB7CisgICAgVGVybSBhcmcxLCBhcmcyLCBhcmczOworCisgICAgcHVibGljIFBSRURfamF2YV9zZXRfZmllbGQwXzMoVGVybSBhMSwgVGVybSBhMiwgVGVybSBhMywgUHJlZGljYXRlIGNvbnQpIHsKKwlhcmcxID0gYTE7CisJYXJnMiA9IGEyOworCWFyZzMgPSBhMzsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKyAgICBwdWJsaWMgUFJFRF9qYXZhX3NldF9maWVsZDBfMygpIHt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpeworCWFyZzEgPSBhcmdzWzBdOworCWFyZzIgPSBhcmdzWzFdOworCWFyZzMgPSBhcmdzWzJdOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDM7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJcmV0dXJuICJqYXZhX3NldF9maWVsZDAoIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIiwiICsgYXJnMyArICIpIjsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKwlUZXJtIGExLCBhMiwgYTM7CisJYTEgPSBhcmcxOworCWEyID0gYXJnMjsKKwlhMyA9IGFyZzM7CisKKwlDbGFzcyAgY2xhenogPSBudWxsOworCU9iamVjdCBpbnN0YW5jZSA9IG51bGw7CisJRmllbGQgIGZpZWxkID0gbnVsbDsKKwlPYmplY3QgdmFsdWUgPSBudWxsOworCisJdHJ5IHsKKwkgICAgLy8gMXN0LiBhcmd1bWVudCAoYXRvbSBvciBqYXZhIHRlcm0pCisJICAgIGExID0gYTEuZGVyZWZlcmVuY2UoKTsKKwkgICAgaWYgKGExLmlzVmFyaWFibGUoKSkgewkKKwkJdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDEpOworCSAgICB9IGVsc2UgaWYgKGExLmlzU3ltYm9sKCkpeyAgICAgIC8vIGNsYXNzCisJCWNsYXp6ID0gQ2xhc3MuZm9yTmFtZSgoKFN5bWJvbFRlcm0pYTEpLm5hbWUoKSk7CisJICAgIH0gZWxzZSBpZiAoYTEuaXNKYXZhT2JqZWN0KCkpIHsgLy8gaW5zdGFuY2UKKwkJaW5zdGFuY2UgPSAoKEphdmFPYmplY3RUZXJtKWExKS5vYmplY3QoKTsKKwkJY2xhenogPSAoKEphdmFPYmplY3RUZXJtKWExKS5nZXRDbGF6eigpOworCSAgICB9IGVsc2UgeworCQl0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMSwgImF0b21fb3JfamF2YSIsIGExKTsKKwkgICAgfQorCSAgICAvLyAybmQuIGFyZ3VtZW50IChhdG9tKQorCSAgICBhMiA9IGEyLmRlcmVmZXJlbmNlKCk7CisJICAgIGlmIChhMi5pc1ZhcmlhYmxlKCkpIHsKKwkJdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDIpOworCSAgICB9IGVsc2UgaWYgKCEgYTIuaXNTeW1ib2woKSkgeworCQl0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMiwgImF0b20iLCBhMik7CisJICAgIH0KKwkgICAgZmllbGQgPSBjbGF6ei5nZXRGaWVsZCgoKFN5bWJvbFRlcm0pYTIpLm5hbWUoKSk7CisJICAgIC8vIDNyZC4gYXJndW1lbnQgKHRlcm0pCisJICAgIGEzID0gYTMuZGVyZWZlcmVuY2UoKTsKKwkgICAgaWYgKGEzLmlzSmF2YU9iamVjdCgpKQorCQl2YWx1ZSA9IGEzLnRvSmF2YSgpOworCSAgICBlbHNlCisJCXZhbHVlID0gYTM7CisJICAgIGZpZWxkLnNldChpbnN0YW5jZSwgdmFsdWUpOworCSAgICByZXR1cm4gY29udDsgCisJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7ICAgIC8vIENsYXNzLmZvck5hbWUKKwkgICAgdGhyb3cgbmV3IEphdmFFeGNlcHRpb24odGhpcywgMSwgZSk7CisJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgeyAgICAgIC8vIENsYXNzLmdldEZpZWxkKC4uKQorCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAyLCBlKTsKKwl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7ICAgICAgICAgLy8gQ2xhc3MuZ2V0RmllbGQoLi4pCisJICAgIHRocm93IG5ldyBKYXZhRXhjZXB0aW9uKHRoaXMsIDIsIGUpOworCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsgICAgICAvLyBDbGFzcy5nZXRGaWVsZCguLikKKwkgICAgdGhyb3cgbmV3IEphdmFFeGNlcHRpb24odGhpcywgMiwgZSk7CisJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7ICAgIC8vIEZpZWxkLmdldCguLikKKwkgICAgdGhyb3cgbmV3IEphdmFFeGNlcHRpb24odGhpcywgMiwgZSk7CisJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsgIC8vIEZpZWxkLmdldCguLikKKwkgICAgdGhyb3cgbmV3IEphdmFFeGNlcHRpb24odGhpcywgMiwgZSk7CisJfQorICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfa2V5c29ydF8yLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfa2V5c29ydF8yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY5ZGJmMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9rZXlzb3J0XzIuamF2YQpAQCAtMCwwICsxLDkyIEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworLyoqCisgKiA8Y29kZT5rZXlzb3J0LzI8L2NvZGU+PGJyPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4xCisgKi8KK3B1YmxpYyBjbGFzcyBQUkVEX2tleXNvcnRfMiBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gU1lNX0hZUEhFTl8yID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCItIiwgMik7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gTmlsID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJbXSIpOworICAgIFRlcm0gYXJnMSwgYXJnMjsKKworICAgIHB1YmxpYyBQUkVEX2tleXNvcnRfMihUZXJtIGExLCBUZXJtIGEyLCBQcmVkaWNhdGUgY29udCkgeworCWFyZzEgPSBhMTsKKwlhcmcyID0gYTI7CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF9rZXlzb3J0XzIoKSB7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KXsKKwlhcmcxID0gYXJnc1swXTsKKwlhcmcyID0gYXJnc1sxXTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAyIDsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuICJrZXlzb3J0KCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIpIjsgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisJVGVybSBhMSwgYTI7CisJYTEgPSBhcmcxOworCWEyID0gYXJnMjsKKwlpbnQgbGVuOworCVRlcm0gdG1wLCB0bXAyOworCVRlcm1bXSBsaXN0OworCisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOworCWlmIChhMS5pc1ZhcmlhYmxlKCkpIHsKKwkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDEpOworCX0gZWxzZSBpZiAoYTEuZXF1YWxzKE5pbCkpIHsKKwkgICAgaWYgKCEgYTIudW5pZnkoTmlsLCBlbmdpbmUudHJhaWwpKQorCQlyZXR1cm4gZW5naW5lLmZhaWwoKTsKKwkgICAgcmV0dXJuIGNvbnQ7CisJfSBlbHNlIGlmICghIGExLmlzTGlzdCgpKSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAxLCAibGlzdCIsIGExKTsKKwl9CisJbGVuID0gKChMaXN0VGVybSlhMSkubGVuZ3RoKCk7CisJbGlzdCA9IG5ldyBUZXJtW2xlbl07CisJdG1wID0gYTE7CisJZm9yIChpbnQgaT0wOyBpPGxlbjsgaSsrKSB7CisJICAgIGlmICghIHRtcC5pc0xpc3QoKSkKKwkJdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDEsICJsaXN0IiwgYTEpOworCSAgICBsaXN0W2ldID0gKChMaXN0VGVybSl0bXApLmNhcigpLmRlcmVmZXJlbmNlKCk7CisJICAgIGlmIChsaXN0W2ldLmlzVmFyaWFibGUoKSkKKwkJdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDEpOworCSAgICBpZiAoISBsaXN0W2ldLmlzU3RydWN0dXJlKCkpCisJCXRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAxLCAia2V5X3ZhbHVlX3BhaXIiLCBhMSk7CisJICAgIGlmICghICgoU3RydWN0dXJlVGVybSkgbGlzdFtpXSkuZnVuY3RvcigpLmVxdWFscyhTWU1fSFlQSEVOXzIpKQorCQl0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMSwgImtleV92YWx1ZV9wYWlyIiwgYTEpOworCSAgICB0bXAgPSAoKExpc3RUZXJtKXRtcCkuY2RyKCkuZGVyZWZlcmVuY2UoKTsKKwl9CisJaWYgKCEgdG1wLmVxdWFscyhOaWwpKQorCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMSk7CisJdHJ5IHsKKwkgICAgQXJyYXlzLnNvcnQobGlzdCwgbmV3IEtleVNvcnRDb21wYXJhdG9yKCkpOworCX0gY2F0Y2ggKEJ1aWx0aW5FeGNlcHRpb24gZSkgeworCSAgICBlLmdvYWwgPSB0aGlzOyBlLmFyZ05vID0gMTsgdGhyb3cgZTsKKwl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZTEpIHsKKwkgICAgdGhyb3cgbmV3IEphdmFFeGNlcHRpb24odGhpcywgMSwgZTEpOworCX0KKwl0bXAgPSBOaWw7CisJZm9yIChpbnQgaT1saXN0Lmxlbmd0aC0xOyBpPj0wOyBpLS0pIHsKKwkgICAgdG1wID0gbmV3IExpc3RUZXJtKGxpc3RbaV0sIHRtcCk7CisJfQorCWlmKCEgYTIudW5pZnkodG1wLCBlbmdpbmUudHJhaWwpKSAKKwkgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJcmV0dXJuIGNvbnQ7CisgICAgfQorfQorCitjbGFzcyBLZXlTb3J0Q29tcGFyYXRvciBpbXBsZW1lbnRzIGphdmEudXRpbC5Db21wYXJhdG9yPFRlcm0+IHsKKyAgICBwdWJsaWMgaW50IGNvbXBhcmUoVGVybSB0MSwgVGVybSB0MikgeworCVRlcm0gYXJnMSA9ICgoU3RydWN0dXJlVGVybSl0MSkuYXJncygpWzBdLmRlcmVmZXJlbmNlKCk7CisJVGVybSBhcmcyID0gKChTdHJ1Y3R1cmVUZXJtKXQyKS5hcmdzKClbMF0uZGVyZWZlcmVuY2UoKTsKKwlyZXR1cm4gYXJnMS5jb21wYXJlVG8oYXJnMik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX25ld19oYXNoXzIuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9uZXdfaGFzaF8yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2MDg5OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9uZXdfaGFzaF8yLmphdmEKQEAgLTAsMCArMSw4NiBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisvKioKKyAgIDxjb2RlPm5ld19oYXNoLzI8L2NvZGU+PGJyPgorICAgQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgICBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICAgQHZlcnNpb24gMS4wCisqLworcHVibGljIGNsYXNzIFBSRURfbmV3X2hhc2hfMiBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgcHVibGljIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9OSUwgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJbXSIpOworICAgIHB1YmxpYyBzdGF0aWMgU3ltYm9sVGVybSBTWU1fQUxJQVNfMSA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiYWxpYXMiLCAxKTsKKyAgICBwdWJsaWMgVGVybSBhcmcxLCBhcmcyOworCisgICAgcHVibGljIFBSRURfbmV3X2hhc2hfMihUZXJtIGExLCBUZXJtIGEyLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYTE7CisgICAgICAgIGFyZzIgPSBhMjsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF9uZXdfaGFzaF8yKCl7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhcmdzWzBdOworICAgICAgICBhcmcyID0gYXJnc1sxXTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMjsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJuZXdfaGFzaCgiICsgYXJnMSArICIsIiArIGFyZzIgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisgICAgICAgIFRlcm0gYTEsIGEyOworICAgICAgICBhMSA9IGFyZzE7CisgICAgICAgIGEyID0gYXJnMjsKKworCWExID0gYTEuZGVyZWZlcmVuY2UoKTsKKwlpZiAoISBhMS5pc1ZhcmlhYmxlKCkpCisJICAgIHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAxLCAidmFyaWFibGUiLCBhMSk7CisJVGVybSBuZXdIYXNoID0gbmV3IEphdmFPYmplY3RUZXJtKG5ldyBIYXNodGFibGVPZlRlcm0oKSk7CisJYTIgPSBhMi5kZXJlZmVyZW5jZSgpOworCWlmIChhMi5pc05pbCgpKSB7CisJICAgIGlmICghIGExLnVuaWZ5KG5ld0hhc2gsIGVuZ2luZS50cmFpbCkpCisJCXJldHVybiBlbmdpbmUuZmFpbCgpOworCSAgICByZXR1cm4gY29udDsKKwl9IGVsc2UgaWYgKCEgYTIuaXNMaXN0KCkpIHsKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJsaXN0IiwgYTIpOworCX0KKwkvLyBhMiBpcyBsaXN0CisJVGVybSB0bXAgPSBhMjsKKwl3aGlsZSAoISB0bXAuaXNOaWwoKSkgeworCSAgICBpZiAodG1wLmlzVmFyaWFibGUoKSkKKwkJdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDIpOworCSAgICBpZiAoISB0bXAuaXNMaXN0KCkpCisJCXRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAyLCAibGlzdCIsIGEyKTsKKwkgICAgVGVybSBjYXIgPSAoKExpc3RUZXJtKSB0bXApLmNhcigpLmRlcmVmZXJlbmNlKCk7CisJICAgIGlmIChjYXIuaXNWYXJpYWJsZSgpKQorCQl0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMik7CisJICAgIGlmIChjYXIuaXNTdHJ1Y3R1cmUoKSkgeworCQlTeW1ib2xUZXJtIGZ1bmN0b3IgPSAoKFN0cnVjdHVyZVRlcm0pIGNhcikuZnVuY3RvcigpOworCQlUZXJtW10gYXJncyA9ICgoU3RydWN0dXJlVGVybSkgY2FyKS5hcmdzKCk7CisJCWlmIChmdW5jdG9yLmVxdWFscyhTWU1fQUxJQVNfMSkpIHsKKwkJICAgIFRlcm0gYWxpYXMgPSBhcmdzWzBdLmRlcmVmZXJlbmNlKCk7CisJCSAgICBpZiAoISBhbGlhcy5pc1N5bWJvbCgpKQorCQkJdGhyb3cgbmV3IElsbGVnYWxEb21haW5FeGNlcHRpb24odGhpcywgMiwgImhhc2hfb3B0aW9uIiwgY2FyKTsKKwkJICAgIGVsc2UgeworCQkJaWYgKGVuZ2luZS5nZXRIYXNoTWFuYWdlcigpLmNvbnRhaW5zS2V5KGFsaWFzKSkKKwkJCSAgICB0aHJvdyBuZXcgUGVybWlzc2lvbkV4Y2VwdGlvbih0aGlzLCAibmV3IiwgImhhc2giLCBjYXIsICIiKTsKKwkJCWVuZ2luZS5nZXRIYXNoTWFuYWdlcigpLnB1dChhbGlhcywgbmV3SGFzaCk7CisJCSAgICB9CisJCX0gZWxzZSB7CisJCSAgICB0aHJvdyBuZXcgSWxsZWdhbERvbWFpbkV4Y2VwdGlvbih0aGlzLCAyLCAiaGFzaF9vcHRpb24iLCBjYXIpOworCQl9CisJICAgIH0gZWxzZSB7CisJCXRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDIsICJoYXNoX29wdGlvbiIsIGNhcik7CisJICAgIH0KKwkgICAgdG1wID0gKChMaXN0VGVybSkgdG1wKS5jZHIoKS5kZXJlZmVyZW5jZSgpOworCX0KKwlpZiAoISBhMS51bmlmeShuZXdIYXNoLCBlbmdpbmUudHJhaWwpKQorCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKyAgICAgICAgcmV0dXJuIGNvbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX25sXzAuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9ubF8wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyNmZjNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9ubF8wLmphdmEKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQgIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworLyoqCisgKiA8Y29kZT5ubC8wPC9jb2RlPjxicj4KKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgUFJFRF9ubF8wIGV4dGVuZHMgUHJlZGljYXRlIHsKKworICAgIHB1YmxpYyBQUkVEX25sXzAoUHJlZGljYXRlIGNvbnQpIHsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKyAgICBwdWJsaWMgUFJFRF9ubF8wKCkge30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCl7CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMDsgfQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiAibmwiOyB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKwllbmdpbmUuZ2V0Q3VycmVudE91dHB1dCgpLnByaW50bG4oKTsKKwlyZXR1cm4gY29udDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfbnVtYmVyX2NoYXJzXzIuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9udW1iZXJfY2hhcnNfMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOGNhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfbnVtYmVyX2NoYXJzXzIuamF2YQpAQCAtMCwwICsxLDg3IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCAganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisvKioKKyAqIDxjb2RlPm51bWJlcl9jaGFycy8yPC9jb2RlPjxicj4KKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgUFJFRF9udW1iZXJfY2hhcnNfMiBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gTmlsID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJbXSIpOworICAgIFRlcm0gYXJnMSwgYXJnMjsKKworICAgIHB1YmxpYyBQUkVEX251bWJlcl9jaGFyc18yKFRlcm0gYTEsIFRlcm0gYTIsIFByZWRpY2F0ZSBjb250KSB7CisJYXJnMSA9IGExOworCWFyZzIgPSBhMjsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEX251bWJlcl9jaGFyc18yKCkge30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCl7CisJYXJnMSA9IGFyZ3NbMF07CisJYXJnMiA9IGFyZ3NbMV07CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMiA7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiAibnVtYmVyX2NoYXJzKCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIpIjsgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisJVGVybSBhMSwgYTI7CisJYTEgPSBhcmcxOworCWEyID0gYXJnMjsKKworCWExID0gYTEuZGVyZWZlcmVuY2UoKTsKKwlhMiA9IGEyLmRlcmVmZXJlbmNlKCk7CisJaWYgKGEyLmlzTmlsKCkpCisJICAgIHRocm93IG5ldyBTeW50YXhFeGNlcHRpb24odGhpcywgMiwgImNoYXJhY3Rlcl9jb2RlX2xpc3QiLCBhMiwgIiIpOworCWlmIChhMS5pc1ZhcmlhYmxlKCkpIHsgLy8gbnVtYmVyX2NoYXJzKC1OdW1iZXIsICtDaGFyTGlzdCkKKwkgICAgaWYgKGEyLmlzVmFyaWFibGUoKSkgeworCQl0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMik7CisJICAgIH0gZWxzZSBpZiAoISBhMi5pc0xpc3QoKSkgeworCQl0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMiwgImxpc3QiLCBhMik7CisJICAgIH0KKwkgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCSAgICBUZXJtIHggPSBhMjsKKwkgICAgd2hpbGUoISB4LmlzTmlsKCkpIHsKKwkJaWYgKHguaXNWYXJpYWJsZSgpKQorCQkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDIpOworCQlpZiAoISB4LmlzTGlzdCgpKQorCQkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJsaXN0IiwgYTIpOworCQlUZXJtIGNhciA9ICgoTGlzdFRlcm0peCkuY2FyKCkuZGVyZWZlcmVuY2UoKTsKKwkJaWYgKGNhci5pc1ZhcmlhYmxlKCkpCisJCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMik7CisJCWlmICghIGNhci5pc1N5bWJvbCgpIHx8ICgoU3ltYm9sVGVybSljYXIpLm5hbWUoKS5sZW5ndGgoKSAhPSAxKQorCQkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJjaGFyYWN0ZXIiLCBhMik7CisJCXNiLmFwcGVuZCgoKFN5bWJvbFRlcm0pY2FyKS5uYW1lKCkpOworCQl4ID0gKChMaXN0VGVybSl4KS5jZHIoKS5kZXJlZmVyZW5jZSgpOworCSAgICB9CisJICAgIHRyeSB7CisJCWlmICghIGExLnVuaWZ5KG5ldyBJbnRlZ2VyVGVybShJbnRlZ2VyLnBhcnNlSW50KHNiLnRvU3RyaW5nKCkpKSwgZW5naW5lLnRyYWlsKSkKKwkJICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOworCQlyZXR1cm4gY29udDsKKwkgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHt9CisJICAgIHRyeSB7CisJCWlmKCEgYTEudW5pZnkobmV3IERvdWJsZVRlcm0oRG91YmxlLnBhcnNlRG91YmxlKHNiLnRvU3RyaW5nKCkpKSwgZW5naW5lLnRyYWlsKSkKKwkJICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOworCQlyZXR1cm4gY29udDsKKwkgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJdGhyb3cgbmV3IFN5bnRheEV4Y2VwdGlvbih0aGlzLCAyLCAiY2hhcmFjdGVyX2NvZGVfbGlzdCIsIGEyLCAiIik7CisJICAgIH0KKwl9IGVsc2UgaWYgKGExLmlzTnVtYmVyKCkpIHsgLy8gbnVtYmVyX2NoYXJzKCtOdW1iZXIsID9DaGFyTGlzdCkKKwkgICAgU3RyaW5nIHMgPSBhMS50b1N0cmluZygpOworCSAgICBUZXJtIHkgPSBOaWw7CisJICAgIGZvciAoaW50IGk9cy5sZW5ndGgoKTsgaT4wOyBpLS0pIHsKKwkJeSA9IG5ldyBMaXN0VGVybShTeW1ib2xUZXJtLm1ha2VTeW1ib2wocy5zdWJzdHJpbmcoaS0xLGkpKSwgeSk7CisJICAgIH0KKwkgICAgaWYgKCEgYTIudW5pZnkoeSwgZW5naW5lLnRyYWlsKSApIAorCQlyZXR1cm4gZW5naW5lLmZhaWwoKTsKKwkgICAgcmV0dXJuIGNvbnQ7CisJfSBlbHNlIHsKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDEsICJudW1iZXIiLCBhMSk7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9udW1iZXJfY29kZXNfMi5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX251bWJlcl9jb2Rlc18yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRmOTI4YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9udW1iZXJfY29kZXNfMi5qYXZhCkBAIC0wLDAgKzEsODYgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKKy8qKgorICogPGNvZGU+bnVtYmVyX2NvZGVzLzI8L2NvZGU+PGJyPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4xCisgKi8KK3B1YmxpYyBjbGFzcyBQUkVEX251bWJlcl9jb2Rlc18yIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBOaWwgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woIltdIik7CisgICAgVGVybSBhcmcxLCBhcmcyOworCisgICAgcHVibGljIFBSRURfbnVtYmVyX2NvZGVzXzIoVGVybSBhMSwgVGVybSBhMiwgUHJlZGljYXRlIGNvbnQpIHsKKwlhcmcxID0gYTE7CisJYXJnMiA9IGEyOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfbnVtYmVyX2NvZGVzXzIoKSB7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KXsKKwlhcmcxID0gYXJnc1swXTsKKwlhcmcyID0gYXJnc1sxXTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAyIDsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuICJudW1iZXJfY29kZXMoIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIikiOyB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKwlUZXJtIGExLCBhMjsKKwlhMSA9IGFyZzE7CisJYTIgPSBhcmcyOworCisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOworCWEyID0gYTIuZGVyZWZlcmVuY2UoKTsKKwlpZiAoYTIuaXNOaWwoKSkKKwkgICAgdGhyb3cgbmV3IFN5bnRheEV4Y2VwdGlvbih0aGlzLCAyLCAiY2hhcmFjdGVyX2NvZGVfbGlzdCIsIGEyLCAiIik7CisJaWYgKGExLmlzVmFyaWFibGUoKSkgeyAvLyBudW1iZXJfY29kZXMoLU51bWJlciwgK0NoYXJDb2RlTGlzdCkKKwkgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCSAgICBUZXJtIHggPSBhMjsKKwkgICAgd2hpbGUoISB4LmlzTmlsKCkpIHsKKwkJaWYgKHguaXNWYXJpYWJsZSgpKQorCQkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDIpOworCQlpZiAoISB4LmlzTGlzdCgpKQorCQkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJsaXN0IiwgYTIpOworCQlUZXJtIGNhciA9ICgoTGlzdFRlcm0peCkuY2FyKCkuZGVyZWZlcmVuY2UoKTsKKwkJaWYgKGNhci5pc1ZhcmlhYmxlKCkpCisJCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMik7CisJCWlmICghIGNhci5pc0ludGVnZXIoKSkgCisJCSAgICB0aHJvdyBuZXcgUmVwcmVzZW50YXRpb25FeGNlcHRpb24odGhpcywgMiwgImNoYXJhY3Rlcl9jb2RlIik7CisJCS8vIGNhciBpcyBhbiBpbnRlZ2VyCisJCWludCBpID0gKChJbnRlZ2VyVGVybSljYXIpLmludFZhbHVlKCk7CisJCWlmICghIENoYXJhY3Rlci5pc0RlZmluZWQoKGNoYXIpaSkpCisJCSAgICB0aHJvdyBuZXcgUmVwcmVzZW50YXRpb25FeGNlcHRpb24odGhpcywgMiwgImNoYXJhY3Rlcl9jb2RlIik7CisJCXNiLmFwcGVuZCgoY2hhcilpKTsKKwkJeCA9ICgoTGlzdFRlcm0peCkuY2RyKCkuZGVyZWZlcmVuY2UoKTsKKwkgICAgfQorCSAgICB0cnkgeworCQlpZiAoISBhMS51bmlmeShuZXcgSW50ZWdlclRlcm0oSW50ZWdlci5wYXJzZUludChzYi50b1N0cmluZygpKSksIGVuZ2luZS50cmFpbCkpCisJCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKwkJcmV0dXJuIGNvbnQ7CisJICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7fQorCSAgICB0cnkgeworCQlpZighIGExLnVuaWZ5KG5ldyBEb3VibGVUZXJtKERvdWJsZS5wYXJzZURvdWJsZShzYi50b1N0cmluZygpKSksIGVuZ2luZS50cmFpbCkpCisJCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKwkJcmV0dXJuIGNvbnQ7CisJICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCXRocm93IG5ldyBTeW50YXhFeGNlcHRpb24odGhpcywgMiwgImNoYXJhY3Rlcl9jb2RlX2xpc3QiLCBhMiwgIiIpOworCSAgICB9CisJfSBlbHNlIGlmIChhMS5pc051bWJlcigpKSB7IC8vIG51bWJlcl9jb2RlcygrTnVtYmVyLCA/Q2hhckNvZGVMaXN0KQorCSAgICBjaGFyW10gY2hhcnMgPSBhMS50b1N0cmluZygpLnRvQ2hhckFycmF5KCk7CisJICAgIFRlcm0geSA9IE5pbDsKKwkgICAgZm9yIChpbnQgaT1jaGFycy5sZW5ndGg7IGk+MDsgaS0tKSB7CisJCXkgPSBuZXcgTGlzdFRlcm0obmV3IEludGVnZXJUZXJtKChpbnQpY2hhcnNbaS0xXSksIHkpOworCSAgICB9CisJICAgIGlmICghIGEyLnVuaWZ5KHksIGVuZ2luZS50cmFpbCkgKSAKKwkJcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJICAgIHJldHVybiBjb250OworCX0gZWxzZSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAxLCAibnVtYmVyIiwgYTEpOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfb3Blbl80LmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfb3Blbl80LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI2ZWVhZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9vcGVuXzQuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CitpbXBvcnQgamF2YS5pby4qOworLyoqCisgICA8Y29kZT5vcGVuLzQ8L2NvZGU+PGJyPgorICAgQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgICBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICAgQHZlcnNpb24gMS4wCisqLworcHVibGljIGNsYXNzIFBSRURfb3Blbl80IGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFRlcm0gU1lNX05JTCAgICAgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJbXSIpOworICAgIHB1YmxpYyBzdGF0aWMgU3ltYm9sVGVybSBTWU1fVEVYVCAgICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woInRleHQiKTsKKyAgICAvLyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFRlcm0gU1lNX0JJTkFSWSAgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJiaW5hcnkiKTsKKyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFRlcm0gU1lNX1JFQUQgICAgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJyZWFkIik7CisgICAgcHVibGljIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9XUklURSAgICAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgid3JpdGUiKTsKKyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFRlcm0gU1lNX0FQUEVORCAgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJhcHBlbmQiKTsKKyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFRlcm0gU1lNX0lOUFVUICAgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJpbnB1dCIpOworICAgIHB1YmxpYyBzdGF0aWMgU3ltYm9sVGVybSBTWU1fT1VUUFVUICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woIm91dHB1dCIpOworICAgIHB1YmxpYyBzdGF0aWMgU3ltYm9sVGVybSBTWU1fQUxJQVNfMSAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woImFsaWFzIiwgMSk7CisgICAgcHVibGljIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9NT0RFXzEgICAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgibW9kZSIsIDEpOworICAgIHB1YmxpYyBzdGF0aWMgU3ltYm9sVGVybSBTWU1fVFlQRV8xICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woInR5cGUiLCAxKTsKKyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFRlcm0gU1lNX0ZJTEVfTkFNRV8xID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJmaWxlX25hbWUiLCAxKTsKKworICAgIHB1YmxpYyBUZXJtIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQ7CisKKyAgICBwdWJsaWMgUFJFRF9vcGVuXzQoVGVybSBhMSwgVGVybSBhMiwgVGVybSBhMywgVGVybSBhNCwgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGExOworICAgICAgICBhcmcyID0gYTI7CisgICAgICAgIGFyZzMgPSBhMzsKKyAgICAgICAgYXJnNCA9IGE0OworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEX29wZW5fNCgpe30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYXJnc1swXTsKKyAgICAgICAgYXJnMiA9IGFyZ3NbMV07CisgICAgICAgIGFyZzMgPSBhcmdzWzJdOworICAgICAgICBhcmc0ID0gYXJnc1szXTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gNDsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJvcGVuKCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIsIiArIGFyZzMgKyAiLCIgKyBhcmc0ICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworCUZpbGUgZmlsZTsKKwlUZXJtIGFsaWFzID0gbnVsbDsKKwlUZXJtIG9wdHMgPSBTWU1fTklMOworCUphdmFPYmplY3RUZXJtIHN0cmVhbU9iamVjdDsKKyAgICAgICAgVGVybSBhMSwgYTIsIGEzLCBhNDsKKyAgICAgICAgYTEgPSBhcmcxOworICAgICAgICBhMiA9IGFyZzI7CisgICAgICAgIGEzID0gYXJnMzsKKyAgICAgICAgYTQgPSBhcmc0OworCisJLy8gc3RyZWFtCisJYTMgPSBhMy5kZXJlZmVyZW5jZSgpOworCWlmICghIGEzLmlzVmFyaWFibGUoKSkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDMsICJ2YXJpYWJsZSIsIGEzKTsKKwkvLyBzb3VyY2Vfc2luaworCWExID0gYTEuZGVyZWZlcmVuY2UoKTsKKwlpZiAoYTEuaXNWYXJpYWJsZSgpKQorCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMSk7CisJaWYgKCEgYTEuaXNTeW1ib2woKSkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxEb21haW5FeGNlcHRpb24odGhpcywgMSwgInNvdXJjZV9zaW5rIiwgYTEpOworCWZpbGUgPSBuZXcgRmlsZSgoKFN5bWJvbFRlcm0pIGExKS5uYW1lKCkpOworCS8vIGlvX21vZGUKKwlhMiA9IGEyLmRlcmVmZXJlbmNlKCk7CisJaWYgKGEyLmlzVmFyaWFibGUoKSkKKwkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDIpOworCWlmICghIGEyLmlzU3ltYm9sKCkpIAorCSAgICB0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24odGhpcywgMiwgImF0b20iLCBhMik7CisJdHJ5IHsKKwkgICAgaWYgKGEyLmVxdWFscyhTWU1fUkVBRCkpIHsKKwkJaWYgKCEgZmlsZS5leGlzdHMoKSkKKwkJICAgIHRocm93IG5ldyBFeGlzdGVuY2VFeGNlcHRpb24odGhpcywgMSwgInNvdXJjZV9zaW5rIiwgYTEsICIiKTsKKwkJUHVzaGJhY2tSZWFkZXIgaW4gPSAKKwkJICAgIG5ldyBQdXNoYmFja1JlYWRlcihuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZSkpLCBlbmdpbmUuUFVTSEJBQ0tfU0laRSk7CisJCXN0cmVhbU9iamVjdCA9IG5ldyBKYXZhT2JqZWN0VGVybShpbik7CisJCW9wdHMgPSBuZXcgTGlzdFRlcm0oU1lNX0lOUFVULCBvcHRzKTsKKwkgICAgfSBlbHNlIGlmIChhMi5lcXVhbHMoU1lNX1dSSVRFKSkgeworCQlQcmludFdyaXRlciBvdXQgPSAKKwkJICAgIG5ldyBQcmludFdyaXRlcihuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZmlsZSwgZmFsc2UpKSk7CisJCXN0cmVhbU9iamVjdCA9IG5ldyBKYXZhT2JqZWN0VGVybShvdXQpOworCQlvcHRzID0gbmV3IExpc3RUZXJtKFNZTV9PVVRQVVQsIG9wdHMpOworCSAgICB9IGVsc2UgaWYgKGEyLmVxdWFscyhTWU1fQVBQRU5EKSkgeworCQlQcmludFdyaXRlciBvdXQgPSAKKwkJICAgIG5ldyBQcmludFdyaXRlcihuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZmlsZSwgdHJ1ZSkpKTsKKwkJc3RyZWFtT2JqZWN0ID0gbmV3IEphdmFPYmplY3RUZXJtKG91dCk7CisJCW9wdHMgPSBuZXcgTGlzdFRlcm0oU1lNX09VVFBVVCwgb3B0cyk7CisJICAgIH0gZWxzZSB7CisJCXRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDIsICJpb19tb2RlIiwgYTIpOworCSAgICB9CisJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCSAgICB0aHJvdyBuZXcgUGVybWlzc2lvbkV4Y2VwdGlvbih0aGlzLCAib3BlbiIsICJzb3VyY2Vfc2luayIsIGExLCAiIik7CisJfQorCWlmIChlbmdpbmUuZ2V0U3RyZWFtTWFuYWdlcigpLmNvbnRhaW5zS2V5KHN0cmVhbU9iamVjdCkpCisJICAgIHRocm93IG5ldyBJbnRlcm5hbEV4Y2VwdGlvbigic3RyZWFtIG9iamVjdCBpcyBkdXBsaWNhdGVkIik7CisJLy8gc3RyZWFtX29wdGlvbnMKKwlhNCA9IGE0LmRlcmVmZXJlbmNlKCk7CisJVGVybSB0bXAgPSBhNDsKKwl3aGlsZSAoISB0bXAuaXNOaWwoKSkgeworCSAgICBpZiAodG1wLmlzVmFyaWFibGUoKSkKKwkJdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDQpOworCSAgICBpZiAoISB0bXAuaXNMaXN0KCkpCisJCXRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCA0LCAibGlzdCIsIGE0KTsKKwkgICAgVGVybSBjYXIgPSAoKExpc3RUZXJtKSB0bXApLmNhcigpLmRlcmVmZXJlbmNlKCk7CisJICAgIGlmIChjYXIuaXNWYXJpYWJsZSgpKQorCQl0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgNCk7CisJICAgIGlmIChjYXIuaXNTdHJ1Y3R1cmUoKSkgeworCQlTeW1ib2xUZXJtIGZ1bmN0b3IgPSAoKFN0cnVjdHVyZVRlcm0pIGNhcikuZnVuY3RvcigpOworCQlUZXJtW10gYXJncyA9ICgoU3RydWN0dXJlVGVybSkgY2FyKS5hcmdzKCk7CisJCWlmIChmdW5jdG9yLmVxdWFscyhTWU1fQUxJQVNfMSkpIHsKKwkJICAgIGFsaWFzID0gYXJnc1swXS5kZXJlZmVyZW5jZSgpOworCQkgICAgaWYgKCEgYWxpYXMuaXNTeW1ib2woKSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDQsICJzdHJlYW1fb3B0aW9uIiwgY2FyKTsKKwkJICAgIGlmIChlbmdpbmUuZ2V0U3RyZWFtTWFuYWdlcigpLmNvbnRhaW5zS2V5KGFsaWFzKSkKKwkJCXRocm93IG5ldyBQZXJtaXNzaW9uRXhjZXB0aW9uKHRoaXMsICJvcGVuIiwgInNvdXJjZV9zaW5rIiwgY2FyLCAiIik7CisJCX0gZWxzZSB7CisJCSAgICB0aHJvdyBuZXcgSWxsZWdhbERvbWFpbkV4Y2VwdGlvbih0aGlzLCA0LCAic3RyZWFtX29wdGlvbiIsIGNhcik7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxEb21haW5FeGNlcHRpb24odGhpcywgNCwgInN0cmVhbV9vcHRpb24iLCBjYXIpOworCSAgICB9CisJICAgIHRtcCA9ICgoTGlzdFRlcm0pIHRtcCkuY2RyKCkuZGVyZWZlcmVuY2UoKTsKKwl9CisJVGVybVtdIGFyZ3MxID0ge1NZTV9URVhUfTsKKwlUZXJtW10gYXJnczIgPSB7YTJ9OworCVRlcm1bXSBhcmdzMyA9IHtTeW1ib2xUZXJtLm1ha2VTeW1ib2woZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSl9OworCW9wdHMgPSBuZXcgTGlzdFRlcm0obmV3IFN0cnVjdHVyZVRlcm0oU1lNX1RZUEVfMSwgYXJnczEpLCBvcHRzKTsKKwlvcHRzID0gbmV3IExpc3RUZXJtKG5ldyBTdHJ1Y3R1cmVUZXJtKFNZTV9NT0RFXzEsIGFyZ3MyKSwgb3B0cyk7CisJb3B0cyA9IG5ldyBMaXN0VGVybShuZXcgU3RydWN0dXJlVGVybShTWU1fRklMRV9OQU1FXzEsIGFyZ3MzKSwgb3B0cyk7CisJaWYgKGFsaWFzICE9IG51bGwpIHsKKwkgICAgZW5naW5lLmdldFN0cmVhbU1hbmFnZXIoKS5wdXQoYWxpYXMsIHN0cmVhbU9iamVjdCk7CisJICAgIFRlcm1bXSBhcyA9IHthbGlhc307CisJICAgIG9wdHMgPSBuZXcgTGlzdFRlcm0obmV3IFN0cnVjdHVyZVRlcm0oU1lNX0FMSUFTXzEsIGFzKSwgb3B0cyk7CisJfQorCSgoVmFyaWFibGVUZXJtKWEzKS5iaW5kKHN0cmVhbU9iamVjdCwgZW5naW5lLnRyYWlsKTsKKwllbmdpbmUuZ2V0U3RyZWFtTWFuYWdlcigpLnB1dChzdHJlYW1PYmplY3QsIG9wdHMpOworICAgICAgICByZXR1cm4gY29udDsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfcGVla19ieXRlXzIuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9wZWVrX2J5dGVfMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZDljMTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfcGVla19ieXRlXzIuamF2YQpAQCAtMCwwICsxLDg0IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKK2ltcG9ydCBqYXZhLmlvLio7CisvKioKKyAgIDxjb2RlPnBlZWtfYnl0ZS8yPC9jb2RlPjxicj4KKyAgIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICAgQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAgIEB2ZXJzaW9uIDEuMQorICAgQHNpbmNlIDEuMQorKi8KK3B1YmxpYyBjbGFzcyBQUkVEX3BlZWtfYnl0ZV8yIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICBwdWJsaWMgc3RhdGljIEludGVnZXJUZXJtIElOVF9FT0YgPSBuZXcgSW50ZWdlclRlcm0oLTEpOworICAgIHB1YmxpYyBUZXJtIGFyZzEsIGFyZzI7CisKKyAgICBwdWJsaWMgUFJFRF9wZWVrX2J5dGVfMihUZXJtIGExLCBUZXJtIGEyLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYTE7CisgICAgICAgIGFyZzIgPSBhMjsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF9wZWVrX2J5dGVfMigpe30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYXJnc1swXTsKKyAgICAgICAgYXJnMiA9IGFyZ3NbMV07CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDI7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAicGVla19ieXRlKCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIpIjsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKyAgICAgICAgVGVybSBhMSwgYTI7CisgICAgICAgIGExID0gYXJnMTsKKyAgICAgICAgYTIgPSBhcmcyOworCU9iamVjdCBzdHJlYW0gPSBudWxsOworCisJLy8gSW5CeXRlCisJYTIgPSBhMi5kZXJlZmVyZW5jZSgpOyAKKwlpZiAoISBhMi5pc1ZhcmlhYmxlKCkpIHsKKwkgICAgaWYgKCEgYTIuaXNJbnRlZ2VyKCkpCisJCXRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAyLCAiaW5fYnl0ZSIsIGEyKTsKKwkgICAgaW50IG4gPSAoKEludGVnZXJUZXJtKWEyKS5pbnRWYWx1ZSgpOworCSAgICBpZiAobiAhPSAtMSAmJiAobiA8IDAgfHwgbiA+IDI1NSkpCisJCXRocm93IG5ldyBSZXByZXNlbnRhdGlvbkV4Y2VwdGlvbih0aGlzLCAyLCAiaW5fYnl0ZSIpOworCX0KKwkvLyBTX29yX2EKKwlhMSA9IGExLmRlcmVmZXJlbmNlKCk7IAorCWlmIChhMS5pc1ZhcmlhYmxlKCkpIHsKKwkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDEpOworCX0gZWxzZSBpZiAoYTEuaXNTeW1ib2woKSkgeworCSAgICBpZiAoISBlbmdpbmUuZ2V0U3RyZWFtTWFuYWdlcigpLmNvbnRhaW5zS2V5KGExKSkKKwkJdGhyb3cgbmV3IEV4aXN0ZW5jZUV4Y2VwdGlvbih0aGlzLCAxLCAic3RyZWFtIiwgYTEsICIiKTsKKwkgICAgc3RyZWFtID0gKChKYXZhT2JqZWN0VGVybSkgZW5naW5lLmdldFN0cmVhbU1hbmFnZXIoKS5nZXQoYTEpKS5vYmplY3QoKTsKKwl9IGVsc2UgaWYgKGExLmlzSmF2YU9iamVjdCgpKSB7CisJICAgIHN0cmVhbSA9ICgoSmF2YU9iamVjdFRlcm0pIGExKS5vYmplY3QoKTsKKwl9IGVsc2UgeworCSAgICB0aHJvdyBuZXcgSWxsZWdhbERvbWFpbkV4Y2VwdGlvbih0aGlzLCAxLCAic3RyZWFtX29yX2FsaWFzIiwgYTEpOworCX0KKwlpZiAoISAoc3RyZWFtIGluc3RhbmNlb2YgUHVzaGJhY2tSZWFkZXIpKQorCSAgICB0aHJvdyBuZXcgUGVybWlzc2lvbkV4Y2VwdGlvbih0aGlzLCAiaW5wdXQiLCAic3RyZWFtIiwgYTEsICIiKTsKKwkvLyByZWFkIHNpbmdsZSBieXRlCisJdHJ5IHsKKwkgICAgaW50IGMgPSAoKFB1c2hiYWNrUmVhZGVyKXN0cmVhbSkucmVhZCgpOworCSAgICBpZiAoYyA8IDApIHsgLy8gRU9GCisJCWlmICghIGEyLnVuaWZ5KElOVF9FT0YsIGVuZ2luZS50cmFpbCkpCisJCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKwkJcmV0dXJuIGNvbnQ7CisJICAgIH0gCisJICAgIGlmIChjID4gMjU1KQorCQl0aHJvdyBuZXcgUmVwcmVzZW50YXRpb25FeGNlcHRpb24odGhpcywgMCwgImJ5dGUiKTsKKwkgICAgKChQdXNoYmFja1JlYWRlcilzdHJlYW0pLnVucmVhZChjKTsKKwkgICAgaWYgKCEgYTIudW5pZnkobmV3IEludGVnZXJUZXJtKGMpLCBlbmdpbmUudHJhaWwpKQorCQlyZXR1cm4gZW5naW5lLmZhaWwoKTsKKwkgICAgcmV0dXJuIGNvbnQ7CisJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCSAgICB0aHJvdyBuZXcgVGVybUV4Y2VwdGlvbihuZXcgSmF2YU9iamVjdFRlcm0oZSkpOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfcGVla19jaGFyXzIuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9wZWVrX2NoYXJfMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMGEzZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfcGVla19jaGFyXzIuamF2YQpAQCAtMCwwICsxLDg2IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKK2ltcG9ydCBqYXZhLmlvLio7CisvKioKKyAgIDxjb2RlPnBlZWtfY2hhci8yPC9jb2RlPjxicj4KKyAgIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICAgQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAgIEB2ZXJzaW9uIDEuMAorKi8KK3B1YmxpYyBjbGFzcyBQUkVEX3BlZWtfY2hhcl8yIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFRlcm0gU1lNX0VPRiA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiZW5kX29mX2ZpbGUiKTsKKyAgICBwdWJsaWMgVGVybSBhcmcxLCBhcmcyOworCisgICAgcHVibGljIFBSRURfcGVla19jaGFyXzIoVGVybSBhMSwgVGVybSBhMiwgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGExOworICAgICAgICBhcmcyID0gYTI7CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfcGVla19jaGFyXzIoKXt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGFyZ3NbMF07CisgICAgICAgIGFyZzIgPSBhcmdzWzFdOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAyOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gInBlZWtfY2hhcigiICsgYXJnMSArICIsIiArIGFyZzIgKyAiKSI7CisgICAgfQorCisgICAgYm9vbGVhbiBpbkNoYXJhY3RlcihUZXJtIHQpIHsKKwlpZiAoISB0LmlzU3ltYm9sKCkpCisJICAgIHJldHVybiBmYWxzZTsKKwlpZiAodC5lcXVhbHMoU1lNX0VPRikpCisJICAgIHJldHVybiB0cnVlOworCXJldHVybiAoKFN5bWJvbFRlcm0pdCkubmFtZSgpLmxlbmd0aCgpID09IDE7CisgICAgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisgICAgICAgIFRlcm0gYTEsIGEyOworICAgICAgICBhMSA9IGFyZzE7CisgICAgICAgIGEyID0gYXJnMjsKKwlPYmplY3Qgc3RyZWFtID0gbnVsbDsKKworCS8vIENoYXIKKwlhMiA9IGEyLmRlcmVmZXJlbmNlKCk7IAorCWlmICghIGEyLmlzVmFyaWFibGUoKSAmJiAhIGluQ2hhcmFjdGVyKGEyKSkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJpbl9jaGFyYWN0ZXIiLCBhMik7CisJLy8gU19vcl9hCisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOyAKKwlpZiAoYTEuaXNWYXJpYWJsZSgpKSB7CisJICAgIHRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAxKTsKKwl9IGVsc2UgaWYgKGExLmlzU3ltYm9sKCkpIHsKKwkgICAgaWYgKCEgZW5naW5lLmdldFN0cmVhbU1hbmFnZXIoKS5jb250YWluc0tleShhMSkpCisJCXRocm93IG5ldyBFeGlzdGVuY2VFeGNlcHRpb24odGhpcywgMSwgInN0cmVhbSIsIGExLCAiIik7CisJICAgIHN0cmVhbSA9ICgoSmF2YU9iamVjdFRlcm0pIGVuZ2luZS5nZXRTdHJlYW1NYW5hZ2VyKCkuZ2V0KGExKSkub2JqZWN0KCk7CisJfSBlbHNlIGlmIChhMS5pc0phdmFPYmplY3QoKSkgeworCSAgICBzdHJlYW0gPSAoKEphdmFPYmplY3RUZXJtKSBhMSkub2JqZWN0KCk7CisJfSBlbHNlIHsKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxEb21haW5FeGNlcHRpb24odGhpcywgMSwgInN0cmVhbV9vcl9hbGlhcyIsIGExKTsKKwl9CisJaWYgKCEgKHN0cmVhbSBpbnN0YW5jZW9mIFB1c2hiYWNrUmVhZGVyKSkKKwkgICAgdGhyb3cgbmV3IFBlcm1pc3Npb25FeGNlcHRpb24odGhpcywgImlucHV0IiwgInN0cmVhbSIsIGExLCAiIik7CisJLy8gcmVhZCBzaW5nbGUgY2hhcmFjdGVyCisJdHJ5IHsKKwkgICAgaW50IGMgPSAoKFB1c2hiYWNrUmVhZGVyKXN0cmVhbSkucmVhZCgpOworCSAgICBpZiAoYyA8IDApIHsgLy8gRU9GCisJCWlmICghIGEyLnVuaWZ5KFNZTV9FT0YsIGVuZ2luZS50cmFpbCkpCisJCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKwkJcmV0dXJuIGNvbnQ7CisJICAgIH0gCisJICAgIGlmICghIENoYXJhY3Rlci5pc0RlZmluZWQoYykpCisJCXRocm93IG5ldyBSZXByZXNlbnRhdGlvbkV4Y2VwdGlvbih0aGlzLCAwLCAiY2hhcmFjdGVyIik7CisJICAgICgoUHVzaGJhY2tSZWFkZXIpc3RyZWFtKS51bnJlYWQoYyk7CisJICAgIGlmICghIGEyLnVuaWZ5KFN5bWJvbFRlcm0ubWFrZVN5bWJvbChTdHJpbmcudmFsdWVPZigoY2hhciljKSksIGVuZ2luZS50cmFpbCkpCisJCXJldHVybiBlbmdpbmUuZmFpbCgpOworCSAgICByZXR1cm4gY29udDsKKwl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJICAgIHRocm93IG5ldyBUZXJtRXhjZXB0aW9uKG5ldyBKYXZhT2JqZWN0VGVybShlKSk7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9wZWVrX2NvZGVfMi5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX3BlZWtfY29kZV8yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYwYzY0MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9wZWVrX2NvZGVfMi5qYXZhCkBAIC0wLDAgKzEsODMgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0IGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworaW1wb3J0IGphdmEuaW8uKjsKKy8qKgorICAgPGNvZGU+cGVla19jb2RlLzI8L2NvZGU+PGJyPgorICAgQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgICBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICAgQHZlcnNpb24gMS4wCisqLworcHVibGljIGNsYXNzIFBSRURfcGVla19jb2RlXzIgZXh0ZW5kcyBQcmVkaWNhdGUgeworICAgIHB1YmxpYyBzdGF0aWMgSW50ZWdlclRlcm0gSU5UX0VPRiA9IG5ldyBJbnRlZ2VyVGVybSgtMSk7CisgICAgcHVibGljIFRlcm0gYXJnMSwgYXJnMjsKKworICAgIHB1YmxpYyBQUkVEX3BlZWtfY29kZV8yKFRlcm0gYTEsIFRlcm0gYTIsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhMTsKKyAgICAgICAgYXJnMiA9IGEyOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEX3BlZWtfY29kZV8yKCl7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhcmdzWzBdOworICAgICAgICBhcmcyID0gYXJnc1sxXTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMjsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJwZWVrX2NvZGUoIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworICAgICAgICBUZXJtIGExLCBhMjsKKyAgICAgICAgYTEgPSBhcmcxOworICAgICAgICBhMiA9IGFyZzI7CisJT2JqZWN0IHN0cmVhbSA9IG51bGw7CisKKwkvLyBDaGFyCisJYTIgPSBhMi5kZXJlZmVyZW5jZSgpOyAKKwlpZiAoISBhMi5pc1ZhcmlhYmxlKCkpIHsKKwkgICAgaWYgKCEgYTIuaXNJbnRlZ2VyKCkpCisJCXRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAyLCAiaW50ZWdlciIsIGEyKTsKKwkgICAgaW50IG4gPSAoKEludGVnZXJUZXJtKWEyKS5pbnRWYWx1ZSgpOworCSAgICBpZiAobiAhPSAtMSAmJiAhIENoYXJhY3Rlci5pc0RlZmluZWQobikpCisJCXRocm93IG5ldyBSZXByZXNlbnRhdGlvbkV4Y2VwdGlvbih0aGlzLCAyLCAiaW5fY2hhcmFjdGVyX2NvZGUiKTsKKwl9CisJLy8gU19vcl9hCisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOyAKKwlpZiAoYTEuaXNWYXJpYWJsZSgpKSB7CisJICAgIHRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAxKTsKKwl9IGVsc2UgaWYgKGExLmlzU3ltYm9sKCkpIHsKKwkgICAgaWYgKCEgZW5naW5lLmdldFN0cmVhbU1hbmFnZXIoKS5jb250YWluc0tleShhMSkpCisJCXRocm93IG5ldyBFeGlzdGVuY2VFeGNlcHRpb24odGhpcywgMSwgInN0cmVhbSIsIGExLCAiIik7CisJICAgIHN0cmVhbSA9ICgoSmF2YU9iamVjdFRlcm0pIGVuZ2luZS5nZXRTdHJlYW1NYW5hZ2VyKCkuZ2V0KGExKSkub2JqZWN0KCk7CisJfSBlbHNlIGlmIChhMS5pc0phdmFPYmplY3QoKSkgeworCSAgICBzdHJlYW0gPSAoKEphdmFPYmplY3RUZXJtKSBhMSkub2JqZWN0KCk7CisJfSBlbHNlIHsKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxEb21haW5FeGNlcHRpb24odGhpcywgMSwgInN0cmVhbV9vcl9hbGlhcyIsIGExKTsKKwl9CisJaWYgKCEgKHN0cmVhbSBpbnN0YW5jZW9mIFB1c2hiYWNrUmVhZGVyKSkKKwkgICAgdGhyb3cgbmV3IFBlcm1pc3Npb25FeGNlcHRpb24odGhpcywgImlucHV0IiwgInN0cmVhbSIsIGExLCAiIik7CisJLy8gcmVhZCBzaW5nbGUgY2hhcmFjdGVyCisJdHJ5IHsKKwkgICAgaW50IGMgPSAoKFB1c2hiYWNrUmVhZGVyKXN0cmVhbSkucmVhZCgpOworCSAgICBpZiAoYyA8IDApIHsgLy8gRU9GCisJCWlmICghIGEyLnVuaWZ5KElOVF9FT0YsIGVuZ2luZS50cmFpbCkpCisJCSAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKwkJcmV0dXJuIGNvbnQ7CisJICAgIH0gCisJICAgIGlmICghIENoYXJhY3Rlci5pc0RlZmluZWQoYykpCisJCXRocm93IG5ldyBSZXByZXNlbnRhdGlvbkV4Y2VwdGlvbih0aGlzLCAwLCAiY2hhcmFjdGVyIik7CisJICAgICgoUHVzaGJhY2tSZWFkZXIpc3RyZWFtKS51bnJlYWQoYyk7CisJICAgIGlmICghIGEyLnVuaWZ5KG5ldyBJbnRlZ2VyVGVybShjKSwgZW5naW5lLnRyYWlsKSkKKwkJcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJICAgIHJldHVybiBjb250OworCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkgICAgdGhyb3cgbmV3IFRlcm1FeGNlcHRpb24obmV3IEphdmFPYmplY3RUZXJtKGUpKTsKKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX3B1dF9ieXRlXzIuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9wdXRfYnl0ZV8yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzODllYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9wdXRfYnl0ZV8yLmphdmEKQEAgLTAsMCArMSw3MSBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CitpbXBvcnQgamF2YS5pby4qOworLyoqCisgICA8Y29kZT5wdXRfYnl0ZS8yPC9jb2RlPjxicj4KKyAgIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICAgQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAgIEB2ZXJzaW9uIDEuMQorICAgQHNpbmNlIDEuMQorKi8KK3B1YmxpYyBjbGFzcyBQUkVEX3B1dF9ieXRlXzIgZXh0ZW5kcyBQcmVkaWNhdGUgeworCisgICAgcHVibGljIFRlcm0gYXJnMSwgYXJnMjsKKworICAgIHB1YmxpYyBQUkVEX3B1dF9ieXRlXzIoVGVybSBhMSwgVGVybSBhMiwgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGExOworICAgICAgICBhcmcyID0gYTI7CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfcHV0X2J5dGVfMigpe30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYXJnc1swXTsKKyAgICAgICAgYXJnMiA9IGFyZ3NbMV07CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDI7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAicHV0X2J5dGUoIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworICAgICAgICBUZXJtIGExLCBhMjsKKyAgICAgICAgYTEgPSBhcmcxOworICAgICAgICBhMiA9IGFyZzI7CisJaW50IGM7CisJT2JqZWN0IHN0cmVhbSA9IG51bGw7CisKKwkvLyBCeXRlCisJYTIgPSBhMi5kZXJlZmVyZW5jZSgpOyAKKwlpZiAoYTIuaXNWYXJpYWJsZSgpKQorCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMik7CisJaWYgKCEgYTIuaXNJbnRlZ2VyKCkpCisJICAgIHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAyLCAiYnl0ZSIsIGEyKTsKKwljID0gKChJbnRlZ2VyVGVybSlhMikuaW50VmFsdWUoKTsKKwlpZiAoYyA8IDAgfHwgYyA+IDI1NSkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJieXRlIiwgYTIpOworCS8vIFNfb3JfYQorCWExID0gYTEuZGVyZWZlcmVuY2UoKTsgCisJaWYgKGExLmlzVmFyaWFibGUoKSkgeworCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMSk7CisJfSBlbHNlIGlmIChhMS5pc1N5bWJvbCgpKSB7CisJICAgIGlmICghIGVuZ2luZS5nZXRTdHJlYW1NYW5hZ2VyKCkuY29udGFpbnNLZXkoYTEpKQorCQl0aHJvdyBuZXcgRXhpc3RlbmNlRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW0iLCBhMSwgIiIpOworCSAgICBzdHJlYW0gPSAoKEphdmFPYmplY3RUZXJtKSBlbmdpbmUuZ2V0U3RyZWFtTWFuYWdlcigpLmdldChhMSkpLm9iamVjdCgpOworCX0gZWxzZSBpZiAoYTEuaXNKYXZhT2JqZWN0KCkpIHsKKwkgICAgc3RyZWFtID0gKChKYXZhT2JqZWN0VGVybSkgYTEpLm9iamVjdCgpOworCX0gZWxzZSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW1fb3JfYWxpYXMiLCBhMSk7CisJfQorCWlmICghIChzdHJlYW0gaW5zdGFuY2VvZiBQcmludFdyaXRlcikpCisJICAgIHRocm93IG5ldyBQZXJtaXNzaW9uRXhjZXB0aW9uKHRoaXMsICJvdXRwdXQiLCAic3RyZWFtIiwgYTEsICIiKTsKKwkvLyBwcmludCBzaW5nbGUgYnl0ZQorCSgoUHJpbnRXcml0ZXIpIHN0cmVhbSkucHJpbnQoKGNoYXIpYyk7CisJcmV0dXJuIGNvbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX3B1dF9jaGFyXzIuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9wdXRfY2hhcl8yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYwNWE0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9wdXRfY2hhcl8yLmphdmEKQEAgLTAsMCArMSw3NCBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CitpbXBvcnQgamF2YS5pby4qOworLyoqCisgICA8Y29kZT5wdXRfY2hhci8yPC9jb2RlPjxicj4KKyAgIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICAgQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAgIEB2ZXJzaW9uIDEuMAorKi8KK3B1YmxpYyBjbGFzcyBQUkVEX3B1dF9jaGFyXzIgZXh0ZW5kcyBQcmVkaWNhdGUgeworCisgICAgcHVibGljIFRlcm0gYXJnMSwgYXJnMjsKKworICAgIHB1YmxpYyBQUkVEX3B1dF9jaGFyXzIoVGVybSBhMSwgVGVybSBhMiwgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGExOworICAgICAgICBhcmcyID0gYTI7CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfcHV0X2NoYXJfMigpe30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYXJnc1swXTsKKyAgICAgICAgYXJnMiA9IGFyZ3NbMV07CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDI7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAicHV0X2NoYXIoIiArIGFyZzEgKyAiLCIgKyBhcmcyICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworICAgICAgICBUZXJtIGExLCBhMjsKKyAgICAgICAgYTEgPSBhcmcxOworICAgICAgICBhMiA9IGFyZzI7CisJU3RyaW5nIHN0cjsKKwljaGFyIGM7CisJT2JqZWN0IHN0cmVhbSA9IG51bGw7CisKKwkvLyBDaGFyCisJYTIgPSBhMi5kZXJlZmVyZW5jZSgpOyAKKwlpZiAoYTIuaXNWYXJpYWJsZSgpKQorCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMik7CisJaWYgKCEgYTIuaXNTeW1ib2woKSkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJjaGFyYWN0ZXIiLCBhMik7CisJLy8gU19vcl9hCisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOyAKKwlpZiAoYTEuaXNWYXJpYWJsZSgpKSB7CisJICAgIHRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAxKTsKKwl9IGVsc2UgaWYgKGExLmlzU3ltYm9sKCkpIHsKKwkgICAgaWYgKCEgZW5naW5lLmdldFN0cmVhbU1hbmFnZXIoKS5jb250YWluc0tleShhMSkpCisJCXRocm93IG5ldyBFeGlzdGVuY2VFeGNlcHRpb24odGhpcywgMSwgInN0cmVhbSIsIGExLCAiIik7CisJICAgIHN0cmVhbSA9ICgoSmF2YU9iamVjdFRlcm0pIGVuZ2luZS5nZXRTdHJlYW1NYW5hZ2VyKCkuZ2V0KGExKSkub2JqZWN0KCk7CisJfSBlbHNlIGlmIChhMS5pc0phdmFPYmplY3QoKSkgeworCSAgICBzdHJlYW0gPSAoKEphdmFPYmplY3RUZXJtKSBhMSkub2JqZWN0KCk7CisJfSBlbHNlIHsKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxEb21haW5FeGNlcHRpb24odGhpcywgMSwgInN0cmVhbV9vcl9hbGlhcyIsIGExKTsKKwl9CisJaWYgKCEgKHN0cmVhbSBpbnN0YW5jZW9mIFByaW50V3JpdGVyKSkKKwkgICAgdGhyb3cgbmV3IFBlcm1pc3Npb25FeGNlcHRpb24odGhpcywgIm91dHB1dCIsICJzdHJlYW0iLCBhMSwgIiIpOworCS8vIHByaW50IHNpbmdsZSBjaGFyYWN0ZXIKKwlzdHIgPSAoKFN5bWJvbFRlcm0pYTIpLm5hbWUoKTsKKwlpZiAoc3RyLmxlbmd0aCgpICE9IDEpCisJICAgIHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAyLCAiY2hhcmFjdGVyIiwgYTIpOworCWMgPSBzdHIuY2hhckF0KDApOworCWlmICghIENoYXJhY3Rlci5pc0RlZmluZWQoYykpCisJICAgIHRocm93IG5ldyBSZXByZXNlbnRhdGlvbkV4Y2VwdGlvbih0aGlzLCAyLCAiY2hhcmFjdGVyIik7CisJKChQcmludFdyaXRlcikgc3RyZWFtKS5wcmludChjKTsKKwlyZXR1cm4gY29udDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfcHV0X2NvZGVfMi5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX3B1dF9jb2RlXzIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjNlNzc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX3B1dF9jb2RlXzIuamF2YQpAQCAtMCwwICsxLDcwIEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKK2ltcG9ydCBqYXZhLmlvLio7CisvKioKKyAgIDxjb2RlPnB1dF9jb2RlLzI8L2NvZGU+PGJyPgorICAgQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgICBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICAgQHZlcnNpb24gMS4wCisqLworcHVibGljIGNsYXNzIFBSRURfcHV0X2NvZGVfMiBleHRlbmRzIFByZWRpY2F0ZSB7CisKKyAgICBwdWJsaWMgVGVybSBhcmcxLCBhcmcyOworCisgICAgcHVibGljIFBSRURfcHV0X2NvZGVfMihUZXJtIGExLCBUZXJtIGEyLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYTE7CisgICAgICAgIGFyZzIgPSBhMjsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF9wdXRfY29kZV8yKCl7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhcmdzWzBdOworICAgICAgICBhcmcyID0gYXJnc1sxXTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMjsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJwdXRfY29kZSgiICsgYXJnMSArICIsIiArIGFyZzIgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisgICAgICAgIFRlcm0gYTEsIGEyOworICAgICAgICBhMSA9IGFyZzE7CisgICAgICAgIGEyID0gYXJnMjsKKwlpbnQgYzsKKwlPYmplY3Qgc3RyZWFtID0gbnVsbDsKKworCS8vIENoYXIKKwlhMiA9IGEyLmRlcmVmZXJlbmNlKCk7IAorCWlmIChhMi5pc1ZhcmlhYmxlKCkpCisJICAgIHRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAyKTsKKwlpZiAoISBhMi5pc0ludGVnZXIoKSkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDIsICJpbnRlZ2VyIiwgYTIpOworCS8vIFNfb3JfYQorCWExID0gYTEuZGVyZWZlcmVuY2UoKTsgCisJaWYgKGExLmlzVmFyaWFibGUoKSkgeworCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMSk7CisJfSBlbHNlIGlmIChhMS5pc1N5bWJvbCgpKSB7CisJICAgIGlmICghIGVuZ2luZS5nZXRTdHJlYW1NYW5hZ2VyKCkuY29udGFpbnNLZXkoYTEpKQorCQl0aHJvdyBuZXcgRXhpc3RlbmNlRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW0iLCBhMSwgIiIpOworCSAgICBzdHJlYW0gPSAoKEphdmFPYmplY3RUZXJtKSBlbmdpbmUuZ2V0U3RyZWFtTWFuYWdlcigpLmdldChhMSkpLm9iamVjdCgpOworCX0gZWxzZSBpZiAoYTEuaXNKYXZhT2JqZWN0KCkpIHsKKwkgICAgc3RyZWFtID0gKChKYXZhT2JqZWN0VGVybSkgYTEpLm9iamVjdCgpOworCX0gZWxzZSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW1fb3JfYWxpYXMiLCBhMSk7CisJfQorCWlmICghIChzdHJlYW0gaW5zdGFuY2VvZiBQcmludFdyaXRlcikpCisJICAgIHRocm93IG5ldyBQZXJtaXNzaW9uRXhjZXB0aW9uKHRoaXMsICJvdXRwdXQiLCAic3RyZWFtIiwgYTEsICIiKTsKKwkvLyBwcmludCBzaW5nbGUgY2hhcmFjdGVyCisJYyA9ICgoSW50ZWdlclRlcm0pYTIpLmludFZhbHVlKCk7CisJaWYgKCEgQ2hhcmFjdGVyLmlzRGVmaW5lZChjKSkKKwkgICAgdGhyb3cgbmV3IFJlcHJlc2VudGF0aW9uRXhjZXB0aW9uKHRoaXMsIDIsICJjaGFyYWN0ZXIiKTsKKwkoKFByaW50V3JpdGVyKSBzdHJlYW0pLnByaW50KChjaGFyKWMpOworCXJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9yYWlzZV9leGNlcHRpb25fMS5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX3JhaXNlX2V4Y2VwdGlvbl8xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M4Zjk3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9yYWlzZV9leGNlcHRpb25fMS5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKKy8qKgorICogPGNvZGU+cmFpc2VfZXhjZXB0aW9uLzE8L2NvZGU+PGJyPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBQUkVEX3JhaXNlX2V4Y2VwdGlvbl8xIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICBUZXJtIGFyZzE7CisKKyAgICBwdWJsaWMgUFJFRF9yYWlzZV9leGNlcHRpb25fMSgpIHt9CisgICAgcHVibGljIFBSRURfcmFpc2VfZXhjZXB0aW9uXzEoVGVybSBhMSwgUHJlZGljYXRlIGNvbnQpIHsKKwlhcmcxID0gYTE7CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpeworCWFyZzEgPSBhcmdzWzBdOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDE7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiAicmFpc2VfZXhjZXB0aW9uKCIgKyBhcmcxICsgIikiOyB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKwlUZXJtIGExOworCWExID0gYXJnMTsKKworCWExID0gYTEuZGVyZWZlcmVuY2UoKTsKKwlpZiAoYTEuaXNWYXJpYWJsZSgpKQorCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMSk7CisJdGhyb3cgbmV3IFRlcm1FeGNlcHRpb24oYTEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9yZWFkX2xpbmVfMi5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX3JlYWRfbGluZV8yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc4ZmI5YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9yZWFkX2xpbmVfMi5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0ICBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKK2ltcG9ydCBqYXZhLmlvLio7CisvKioKKyAqIDxjb2RlPnJlYWRfbGluZS8yPC9jb2RlPjxicj4KKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMAorICovCitjbGFzcyBQUkVEX3JlYWRfbGluZV8yIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICBUZXJtIGFyZzEsIGFyZzI7CisKKyAgICBwdWJsaWMgUFJFRF9yZWFkX2xpbmVfMihUZXJtIGExLCBUZXJtIGEyLCBQcmVkaWNhdGUgY29udCkgeworCWFyZzEgPSBhMTsKKwlhcmcyID0gYTI7CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisgICAgcHVibGljIFBSRURfcmVhZF9saW5lXzIoKSB7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KXsKKwlhcmcxID0gYXJnc1swXTsKKwlhcmcyID0gYXJnc1sxXTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAyOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gInJlYWRfbGluZSgiICsgYXJnMSArICIsIiArIGFyZzIgKyAiKSI7IH0KKworICAgIHB1YmxpYyBQcmVkaWNhdGUgZXhlYyhQcm9sb2cgZW5naW5lKSB7CisgICAgICAgIGVuZ2luZS5zZXRCMCgpOworICAgICAgICBUZXJtIGExLCBhMjsKKyAgICAgICAgYTEgPSBhcmcxOworICAgICAgICBhMiA9IGFyZzI7CisJT2JqZWN0IHN0cmVhbSA9IG51bGw7CisJU3RyaW5nIGxpbmU7CisJY2hhcltdIGNoYXJzOworCVRlcm0gdDsKKworCS8vIFNfb3JfYQorCWExID0gYTEuZGVyZWZlcmVuY2UoKTsgCisJaWYgKGExLmlzVmFyaWFibGUoKSkgeworCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMSk7CisJfSBlbHNlIGlmIChhMS5pc1N5bWJvbCgpKSB7CisJICAgIGlmICghIGVuZ2luZS5nZXRTdHJlYW1NYW5hZ2VyKCkuY29udGFpbnNLZXkoYTEpKQorCQl0aHJvdyBuZXcgRXhpc3RlbmNlRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW0iLCBhMSwgIiIpOworCSAgICBzdHJlYW0gPSAoKEphdmFPYmplY3RUZXJtKSBlbmdpbmUuZ2V0U3RyZWFtTWFuYWdlcigpLmdldChhMSkpLm9iamVjdCgpOworCX0gZWxzZSBpZiAoYTEuaXNKYXZhT2JqZWN0KCkpIHsKKwkgICAgc3RyZWFtID0gKChKYXZhT2JqZWN0VGVybSkgYTEpLm9iamVjdCgpOworCX0gZWxzZSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW1fb3JfYWxpYXMiLCBhMSk7CisJfQorCWlmICghIChzdHJlYW0gaW5zdGFuY2VvZiBQdXNoYmFja1JlYWRlcikpCisJICAgIHRocm93IG5ldyBQZXJtaXNzaW9uRXhjZXB0aW9uKHRoaXMsICJpbnB1dCIsICJzdHJlYW0iLCBhMSwgIiIpOworCS8vIHJlYWQgbGluZQorCXRyeSB7CisJICAgIGxpbmUgPSAobmV3IEJ1ZmZlcmVkUmVhZGVyKChQdXNoYmFja1JlYWRlcilzdHJlYW0pKS5yZWFkTGluZSgpOworCSAgICBpZiAobGluZSA9PSBudWxsKSB7IC8vIGVuZF9vZl9zdHJlYW0KKwkJaWYoISBhMi51bmlmeShuZXcgSW50ZWdlclRlcm0oLTEpLCBlbmdpbmUudHJhaWwpKQorCQkgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJCXJldHVybiBjb250OworCSAgICB9CisJICAgIGNoYXJzID0gbGluZS50b0NoYXJBcnJheSgpOworCSAgICB0ID0gUHJvbG9nLk5pbDsKKwkgICAgZm9yIChpbnQgaT1jaGFycy5sZW5ndGg7IGk+MDsgaS0tKSB7CisJCWlmICghIENoYXJhY3Rlci5pc0RlZmluZWQoKGludCljaGFyc1tpLTFdKSkKKwkJICAgIHRocm93IG5ldyBSZXByZXNlbnRhdGlvbkV4Y2VwdGlvbih0aGlzLCAwLCAiY2hhcmFjdGVyIik7CisJCXQgPSBuZXcgTGlzdFRlcm0obmV3IEludGVnZXJUZXJtKChpbnQpY2hhcnNbaS0xXSksIHQpOworCSAgICB9CisJICAgIGlmKCEgYTIudW5pZnkodCwgZW5naW5lLnRyYWlsKSkKKwkJcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJICAgIHJldHVybiBjb250OworCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkgICAgdGhyb3cgbmV3IFRlcm1FeGNlcHRpb24obmV3IEphdmFPYmplY3RUZXJtKGUpKTsKKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX3NldF9pbnB1dF8xLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfc2V0X2lucHV0XzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjA3NDNiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX3NldF9pbnB1dF8xLmphdmEKQEAgLTAsMCArMSw1NSBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CitpbXBvcnQgamF2YS5pby5QdXNoYmFja1JlYWRlcjsKKy8qKgorICAgPGNvZGU+c2V0X2lucHV0LzE8L2NvZGU+PGJyPgorICAgQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgICBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICAgQHZlcnNpb24gMS4wCisqLworcHVibGljIGNsYXNzIFBSRURfc2V0X2lucHV0XzEgZXh0ZW5kcyBQcmVkaWNhdGUgeworCisgICAgcHVibGljIFRlcm0gYXJnMTsKKworICAgIHB1YmxpYyBQUkVEX3NldF9pbnB1dF8xKFRlcm0gYTEsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhMTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF9zZXRfaW5wdXRfMSgpe30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYXJnc1swXTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gMTsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJzZXRfaW5wdXQoIiArIGFyZzEgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisgICAgICAgIFRlcm0gYTE7CisgICAgICAgIGExID0gYXJnMTsKKwlPYmplY3Qgc3RyZWFtID0gbnVsbDsKKworCWExID0gYTEuZGVyZWZlcmVuY2UoKTsKKwlpZiAoYTEuaXNWYXJpYWJsZSgpKSB7CisJICAgIHRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAxKTsKKwl9IGVsc2UgaWYgKGExLmlzU3ltYm9sKCkpIHsKKwkgICAgaWYgKCEgZW5naW5lLmdldFN0cmVhbU1hbmFnZXIoKS5jb250YWluc0tleShhMSkpCisJCXRocm93IG5ldyBFeGlzdGVuY2VFeGNlcHRpb24odGhpcywgMSwgInN0cmVhbSIsIGExLCAiIik7CisJICAgIHN0cmVhbSA9ICgoSmF2YU9iamVjdFRlcm0pIGVuZ2luZS5nZXRTdHJlYW1NYW5hZ2VyKCkuZ2V0KGExKSkub2JqZWN0KCk7CisJfSBlbHNlIGlmIChhMS5pc0phdmFPYmplY3QoKSkgeworCSAgICBzdHJlYW0gPSAoKEphdmFPYmplY3RUZXJtKSBhMSkub2JqZWN0KCk7CisJfSBlbHNlIHsKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxEb21haW5FeGNlcHRpb24odGhpcywgMSwgInN0cmVhbV9vcl9hbGlhcyIsIGExKTsKKwl9CisJaWYgKCEgKHN0cmVhbSBpbnN0YW5jZW9mIFB1c2hiYWNrUmVhZGVyKSkKKwkgICAgdGhyb3cgbmV3IFBlcm1pc3Npb25FeGNlcHRpb24odGhpcywgImlucHV0IiwgInN0cmVhbSIsIGExLCAiIik7CisJZW5naW5lLnNldEN1cnJlbnRJbnB1dCgoUHVzaGJhY2tSZWFkZXIpc3RyZWFtKTsKKyAgICAgICAgcmV0dXJuIGNvbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX3NldF9vdXRwdXRfMS5qYXZhIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX3NldF9vdXRwdXRfMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MmUwY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfc2V0X291dHB1dF8xLmphdmEKQEAgLTAsMCArMSw1NSBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKy8qKgorICAgPGNvZGU+c2V0X291dHB1dC8xPC9jb2RlPjxicj4KKyAgIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICAgQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAgIEB2ZXJzaW9uIDEuMAorKi8KK3B1YmxpYyBjbGFzcyBQUkVEX3NldF9vdXRwdXRfMSBleHRlbmRzIFByZWRpY2F0ZSB7CisKKyAgICBwdWJsaWMgVGVybSBhcmcxOworCisgICAgcHVibGljIFBSRURfc2V0X291dHB1dF8xKFRlcm0gYTEsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhMTsKKyAgICAgICAgdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF9zZXRfb3V0cHV0XzEoKXt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGFyZ3NbMF07CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDE7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAic2V0X291dHB1dCgiICsgYXJnMSArICIpIjsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworICAgICAgICBlbmdpbmUuc2V0QjAoKTsKKyAgICAgICAgVGVybSBhMTsKKyAgICAgICAgYTEgPSBhcmcxOworCU9iamVjdCBzdHJlYW0gPSBudWxsOworCisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOworCWlmIChhMS5pc1ZhcmlhYmxlKCkpIHsKKwkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDEpOworCX0gZWxzZSBpZiAoYTEuaXNTeW1ib2woKSkgeworCSAgICBpZiAoISBlbmdpbmUuZ2V0U3RyZWFtTWFuYWdlcigpLmNvbnRhaW5zS2V5KGExKSkKKwkJdGhyb3cgbmV3IEV4aXN0ZW5jZUV4Y2VwdGlvbih0aGlzLCAxLCAic3RyZWFtIiwgYTEsICIiKTsKKwkgICAgc3RyZWFtID0gKChKYXZhT2JqZWN0VGVybSkgZW5naW5lLmdldFN0cmVhbU1hbmFnZXIoKS5nZXQoYTEpKS5vYmplY3QoKTsKKwl9IGVsc2UgaWYgKGExLmlzSmF2YU9iamVjdCgpKSB7CisJICAgIHN0cmVhbSA9ICgoSmF2YU9iamVjdFRlcm0pIGExKS5vYmplY3QoKTsKKwl9IGVsc2UgeworCSAgICB0aHJvdyBuZXcgSWxsZWdhbERvbWFpbkV4Y2VwdGlvbih0aGlzLCAxLCAic3RyZWFtX29yX2FsaWFzIiwgYTEpOworCX0KKwlpZiAoISAoc3RyZWFtIGluc3RhbmNlb2YgUHJpbnRXcml0ZXIpKQorCSAgICB0aHJvdyBuZXcgUGVybWlzc2lvbkV4Y2VwdGlvbih0aGlzLCAib3V0cHV0IiwgInN0cmVhbSIsIGExLCAiIik7CisJZW5naW5lLnNldEN1cnJlbnRPdXRwdXQoKFByaW50V3JpdGVyKXN0cmVhbSk7CisgICAgICAgIHJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9za2lwXzIuamF2YSBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9za2lwXzIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjQ2YzA5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX3NraXBfMi5qYXZhCkBAIC0wLDAgKzEsODkgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluOworaW1wb3J0IGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworaW1wb3J0IGphdmEuaW8uKjsKKy8qKgorICAgPGNvZGU+c2tpcC8yPC9jb2RlPjxicj4KKyAgIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICAgQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAgIEB2ZXJzaW9uIDEuMAorKi8KK3B1YmxpYyBjbGFzcyBQUkVEX3NraXBfMiBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgcHVibGljIHN0YXRpYyBJbnRlZ2VyVGVybSBJTlRfRU9GID0gbmV3IEludGVnZXJUZXJtKC0xKTsKKyAgICBwdWJsaWMgVGVybSBhcmcxLCBhcmcyOworCisgICAgcHVibGljIFBSRURfc2tpcF8yKFRlcm0gYTEsIFRlcm0gYTIsIFByZWRpY2F0ZSBjb250KSB7CisgICAgICAgIGFyZzEgPSBhMTsKKyAgICAgICAgYXJnMiA9IGEyOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBQUkVEX3NraXBfMigpe30KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCkgeworICAgICAgICBhcmcxID0gYXJnc1swXTsKKyAgICAgICAgYXJnMiA9IGFyZ3NbMV07CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDI7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAic2tpcCgiICsgYXJnMSArICIsIiArIGFyZzIgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisgICAgICAgIFRlcm0gYTEsIGEyOworICAgICAgICBhMSA9IGFyZzE7CisgICAgICAgIGEyID0gYXJnMjsKKwlpbnQgbjsKKwlPYmplY3Qgc3RyZWFtID0gbnVsbDsKKwkKKwkvLyBDaGFyCisJYTIgPSBhMi5kZXJlZmVyZW5jZSgpOyAKKwlpZiAoYTIuaXNWYXJpYWJsZSgpKQorCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMik7CisJaWYgKCEgYTIuaXNJbnRlZ2VyKCkpIHsKKwkgICAgdHJ5IHsKKwkJYTIgPSBBcml0aG1ldGljLmV2YWx1YXRlKGEyKTsKKwkgICAgfSBjYXRjaCAoQnVpbHRpbkV4Y2VwdGlvbiBlKSB7CisJCWUuZ29hbCA9IHRoaXM7CisJCWUuYXJnTm8gPSAyOworCQl0aHJvdyBlOworCSAgICB9CisJfQorCW4gPSAoKE51bWJlclRlcm0pYTIpLmludFZhbHVlKCk7CisJaWYgKCEgQ2hhcmFjdGVyLmlzRGVmaW5lZChuKSkKKwkgICAgdGhyb3cgbmV3IFJlcHJlc2VudGF0aW9uRXhjZXB0aW9uKHRoaXMsIDIsICJjaGFyYWN0ZXJfY29kZSIpOworCS8vIFNfb3JfYQorCWExID0gYTEuZGVyZWZlcmVuY2UoKTsgCisJaWYgKGExLmlzVmFyaWFibGUoKSkgeworCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMSk7CisJfSBlbHNlIGlmIChhMS5pc1N5bWJvbCgpKSB7CisJICAgIGlmICghIGVuZ2luZS5nZXRTdHJlYW1NYW5hZ2VyKCkuY29udGFpbnNLZXkoYTEpKQorCQl0aHJvdyBuZXcgRXhpc3RlbmNlRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW0iLCBhMSwgIiIpOworCSAgICBzdHJlYW0gPSAoKEphdmFPYmplY3RUZXJtKSBlbmdpbmUuZ2V0U3RyZWFtTWFuYWdlcigpLmdldChhMSkpLm9iamVjdCgpOworCX0gZWxzZSBpZiAoYTEuaXNKYXZhT2JqZWN0KCkpIHsKKwkgICAgc3RyZWFtID0gKChKYXZhT2JqZWN0VGVybSkgYTEpLm9iamVjdCgpOworCX0gZWxzZSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW1fb3JfYWxpYXMiLCBhMSk7CisJfQorCWlmICghIChzdHJlYW0gaW5zdGFuY2VvZiBQdXNoYmFja1JlYWRlcikpCisJICAgIHRocm93IG5ldyBQZXJtaXNzaW9uRXhjZXB0aW9uKHRoaXMsICJpbnB1dCIsICJzdHJlYW0iLCBhMSwgIiIpOworCS8vIHNraXAKKwl0cnkgeworCSAgICBQdXNoYmFja1JlYWRlciBpbiA9IChQdXNoYmFja1JlYWRlcikgc3RyZWFtOworCSAgICBpbnQgYyA9IGluLnJlYWQoKTsKKwkgICAgd2hpbGUoYyAhPSBuKSB7CisJCWMgPSBpbi5yZWFkKCk7CisJCWlmIChjID09IC0xKSAvLyBFT0YKKwkJICAgIHJldHVybiBjb250OworCQlpZiAoISBDaGFyYWN0ZXIuaXNEZWZpbmVkKGMpKQorCQkgICAgdGhyb3cgbmV3IFJlcHJlc2VudGF0aW9uRXhjZXB0aW9uKHRoaXMsIDAsICJjaGFyYWN0ZXIiKTsKKwkgICAgfSAKKwkgICAgcmV0dXJuIGNvbnQ7CisJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCSAgICB0aHJvdyBuZXcgVGVybUV4Y2VwdGlvbihuZXcgSmF2YU9iamVjdFRlcm0oZSkpOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvYnVpbHRpbi9CYXNlL1BSRURfc29ydF8yLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfc29ydF8yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZjZTM2OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL0Jhc2UvUFJFRF9zb3J0XzIuamF2YQpAQCAtMCwwICsxLDc4IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbjsKK2ltcG9ydCBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworLyoqCisgKiA8Y29kZT5zb3J0LzI8L2NvZGU+PGJyPgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4xCisgKi8KK3B1YmxpYyBjbGFzcyBQUkVEX3NvcnRfMiBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gTmlsID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJbXSIpOworICAgIFRlcm0gYXJnMSwgYXJnMjsKKworICAgIHB1YmxpYyBQUkVEX3NvcnRfMihUZXJtIGExLCBUZXJtIGEyLCBQcmVkaWNhdGUgY29udCkgeworCWFyZzEgPSBhMTsKKwlhcmcyID0gYTI7CisJdGhpcy5jb250ID0gY29udDsKKyAgICB9CisKKyAgICBwdWJsaWMgUFJFRF9zb3J0XzIoKSB7fQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnQoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KXsKKwlhcmcxID0gYXJnc1swXTsKKwlhcmcyID0gYXJnc1sxXTsKKwl0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAyIDsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuICJzb3J0KCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIpIjsgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisJVGVybSBhMSwgYTI7CisJYTEgPSBhcmcxOworCWEyID0gYXJnMjsKKwlpbnQgbGVuOworCVRlcm0gdG1wLCB0bXAyOworCVRlcm1bXSBsaXN0OworCisJYTEgPSBhMS5kZXJlZmVyZW5jZSgpOworCWlmIChhMS5pc1ZhcmlhYmxlKCkpIHsKKwkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDEpOworCX0gZWxzZSBpZiAoYTEuZXF1YWxzKE5pbCkpIHsKKwkgICAgaWYgKCEgYTIudW5pZnkoTmlsLCBlbmdpbmUudHJhaWwpKQorCQlyZXR1cm4gZW5naW5lLmZhaWwoKTsKKwkgICAgcmV0dXJuIGNvbnQ7CisJfSBlbHNlIGlmICghIGExLmlzTGlzdCgpKSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbih0aGlzLCAxLCAibGlzdCIsIGExKTsKKwl9CisJbGVuID0gKChMaXN0VGVybSlhMSkubGVuZ3RoKCk7CisJbGlzdCA9IG5ldyBUZXJtW2xlbl07CisJdG1wID0gYTE7CisJZm9yIChpbnQgaT0wOyBpPGxlbjsgaSsrKSB7CisJICAgIGlmICghIHRtcC5pc0xpc3QoKSkKKwkJdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKHRoaXMsIDEsICJsaXN0IiwgYTEpOworCSAgICBsaXN0W2ldID0gKChMaXN0VGVybSl0bXApLmNhcigpLmRlcmVmZXJlbmNlKCk7CisJICAgIHRtcCA9ICgoTGlzdFRlcm0pdG1wKS5jZHIoKS5kZXJlZmVyZW5jZSgpOworCX0KKwlpZiAoISB0bXAuZXF1YWxzKE5pbCkpCisJICAgIHRocm93IG5ldyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbih0aGlzLCAxKTsKKwl0cnkgeworCSAgICBBcnJheXMuc29ydChsaXN0KTsKKwl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworCSAgICB0aHJvdyBuZXcgSmF2YUV4Y2VwdGlvbih0aGlzLCAxLCBlKTsKKwl9CisJdG1wID0gTmlsOworCXRtcDIgPSBudWxsOworCWZvciAoaW50IGk9bGlzdC5sZW5ndGgtMTsgaT49MDsgaS0tKSB7CisJICAgIGlmICghIGxpc3RbaV0uZXF1YWxzKHRtcDIpKQorCQl0bXAgPSBuZXcgTGlzdFRlcm0obGlzdFtpXSwgdG1wKTsKKwkgICAgdG1wMiA9IGxpc3RbaV07CisJfQorCWlmKCEgYTIudW5pZnkodG1wLCBlbmdpbmUudHJhaWwpKSAKKwkgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisJcmV0dXJuIGNvbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX3RhYl8yLmphdmEgYi9zcmMvYnVpbHRpbi9CYXNlL1BSRURfdGFiXzIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTNiZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vQmFzZS9QUkVEX3RhYl8yLmphdmEKQEAgLTAsMCArMSw3OCBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW47CitpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CitpbXBvcnQgamF2YS5pby4qOworLyoqCisgICA8Y29kZT50YWIvMjwvY29kZT48YnI+CisgICBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAgIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgICBAdmVyc2lvbiAxLjAKKyovCitwdWJsaWMgY2xhc3MgUFJFRF90YWJfMiBleHRlbmRzIFByZWRpY2F0ZSB7CisKKyAgICBwdWJsaWMgVGVybSBhcmcxLCBhcmcyOworCisgICAgcHVibGljIFBSRURfdGFiXzIoVGVybSBhMSwgVGVybSBhMiwgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGExOworICAgICAgICBhcmcyID0gYTI7CisgICAgICAgIHRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFBSRURfdGFiXzIoKXt9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpIHsKKyAgICAgICAgYXJnMSA9IGFyZ3NbMF07CisgICAgICAgIGFyZzIgPSBhcmdzWzFdOworICAgICAgICB0aGlzLmNvbnQgPSBjb250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAyOyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gInRhYigiICsgYXJnMSArICIsIiArIGFyZzIgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKyAgICAgICAgZW5naW5lLnNldEIwKCk7CisgICAgICAgIFRlcm0gYTEsIGEyOworICAgICAgICBhMSA9IGFyZzE7CisgICAgICAgIGEyID0gYXJnMjsKKwlpbnQgbjsKKwlTdHJpbmcgcyA9ICIiOworCU9iamVjdCBzdHJlYW0gPSBudWxsOworCisJLy8gQ2hhcgorCWEyID0gYTIuZGVyZWZlcmVuY2UoKTsgCisJaWYgKGEyLmlzVmFyaWFibGUoKSkKKwkgICAgdGhyb3cgbmV3IFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKHRoaXMsIDIpOworCWlmICghIGEyLmlzSW50ZWdlcigpKSB7CisJICAgIHRyeSB7CisJCWEyID0gQXJpdGhtZXRpYy5ldmFsdWF0ZShhMik7CisJICAgIH0gY2F0Y2ggKEJ1aWx0aW5FeGNlcHRpb24gZSkgeworCQllLmdvYWwgPSB0aGlzOworCQllLmFyZ05vID0gMjsKKwkJdGhyb3cgZTsKKwkgICAgfQorCX0KKwluID0gKChOdW1iZXJUZXJtKWEyKS5pbnRWYWx1ZSgpOworCS8vIFNfb3JfYQorCWExID0gYTEuZGVyZWZlcmVuY2UoKTsgCisJaWYgKGExLmlzVmFyaWFibGUoKSkgeworCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24odGhpcywgMSk7CisJfSBlbHNlIGlmIChhMS5pc1N5bWJvbCgpKSB7CisJICAgIGlmICghIGVuZ2luZS5nZXRTdHJlYW1NYW5hZ2VyKCkuY29udGFpbnNLZXkoYTEpKQorCQl0aHJvdyBuZXcgRXhpc3RlbmNlRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW0iLCBhMSwgIiIpOworCSAgICBzdHJlYW0gPSAoKEphdmFPYmplY3RUZXJtKSBlbmdpbmUuZ2V0U3RyZWFtTWFuYWdlcigpLmdldChhMSkpLm9iamVjdCgpOworCX0gZWxzZSBpZiAoYTEuaXNKYXZhT2JqZWN0KCkpIHsKKwkgICAgc3RyZWFtID0gKChKYXZhT2JqZWN0VGVybSkgYTEpLm9iamVjdCgpOworCX0gZWxzZSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKHRoaXMsIDEsICJzdHJlYW1fb3JfYWxpYXMiLCBhMSk7CisJfQorCWlmICghIChzdHJlYW0gaW5zdGFuY2VvZiBQcmludFdyaXRlcikpCisJICAgIHRocm93IG5ldyBQZXJtaXNzaW9uRXhjZXB0aW9uKHRoaXMsICJvdXRwdXQiLCAic3RyZWFtIiwgYTEsICIiKTsKKwkvLyB0YWIKKwlmb3IgKGludCBpPTA7IGk8bjsgaSsrKQorCSAgICBzICs9ICIgIjsKKwkoKFByaW50V3JpdGVyKSBzdHJlYW0pLnByaW50KHMpOworCXJldHVybiBjb250OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL01ha2VmaWxlIGIvc3JjL2J1aWx0aW4vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJhN2YyYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL01ha2VmaWxlCkBAIC0wLDAgKzEsNDAgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMJTWFrZWZpbGUgZm9yIFByb2xvZyBDYWZlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhlIGZvbGxvd2luZyB0d28gZGVmaW5pdGlvbnMgd2lsbCBiZSBvdmVycmlkZGVuLgorIworIyBKQVZBQyA6IHRoZSBjb21tYW5kIG9mIEphdmEgY29tcGlsZXIgc3lzdGVtCisjICAgICAgICAgIChleC4gamF2YWMpCisjIEpBUiAgIDogdGhlIGNvbW1hbmQgb2YgSmFyIGFyY2hpdmUgc3lzdGVtCisjICAgICAgICAgIChleC4gamFyKQorIworSkFWQUMgICAgID0gamF2YWMKK0pBVkFDT1BUUyA9IC1kIC4gLVhsaW50IC1jbGFzc3BhdGggJCRQTENBRkVESVIvbGFuZy5qYXI6JCRDTEFTU1BBVEgKK0pBUiAgICAgICA9IGphcgorSkFST1BUUyAgID0gY2YKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLmFtIC5wbCAkKFNVRkZJWEVTKQorCithbV9vYmplY3RzID0gYnVpbHRpbnMuYW0gXAorCXN5c3RlbS5hbSBcCisKKy5wbC5hbToKKwlwbDJhbS5wbGMgLXYgLU8gJDwgJEAKKwktbWtkaXIgJCoKKwlhbTJqLnBsYyAtdiAtZCAkKiAkQAorCitidWlsdGluOiQoYW1fb2JqZWN0cykKKwkkKEpBVkFDKSAkKEpBVkFDT1BUUykgKi8qLmphdmEKKwkkKEpBUikgJChKQVJPUFRTKSBidWlsdGluLmphciBqcC9hYy9rb2JlX3UvY3MvcHJvbG9nL2J1aWx0aW4vCisKK2NsZWFuOgorCS1ybSAtZiAtciBidWlsdGlucworCS1ybSAtZiAtciBzeXN0ZW0KKwktcm0gLWYgLXIganAKKwktcm0gLWYgQmFzZS9jb3JlIEJhc2UvKn4gQmFzZS8qLmNsYXNzCisJLXJtIC1mIGNvcmUgKn4gKi5hbSAqLmphciAqLmNsYXNzCisKK3JlYWxjbGVhbjogY2xlYW4KZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL2J1aWx0aW5zLnBsIGIvc3JjL2J1aWx0aW4vYnVpbHRpbnMucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ0MDE4OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9idWlsdGluL2J1aWx0aW5zLnBsCkBAIC0wLDAgKzEsMjYxMiBAQAorJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSBCdWlsdGluIFByZWRpY2F0ZXMgb2YgUHJvbG9nIENhZmUKKyUgCislIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyUgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCislIEtvYmUgVW5pdmVyc2l0eQorJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorOi0gb3AoMTE1MCwgIGZ4LCAocGFja2FnZSkpLiAKK3BhY2thZ2UoXykuIAorOi0gcGFja2FnZSAnanAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluJy4KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSBDb250cm9sIGNvbnN0cnVjdHMKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKzotIHB1YmxpYyB0cnVlLzAsIHRoZXJ3aXNlLzAuCis6LSBwdWJsaWMgZmFpbC8wLCBmYWxzZS8wLgorJTotIHB1YmxpYyAoISkvMCwgJyRnZXRfbGV2ZWwnLzEsICckbmVja19jdXQnLzAsICckY3V0Jy8xLgorOi0gcHVibGljICghKS8wLgorOi0gcHVibGljICheKS8yLgorOi0gcHVibGljICgnLCcpLzIuCis6LSBwdWJsaWMgKDspLzIuCis6LSBwdWJsaWMgKC0+KS8yLgorOi0gcHVibGljIGNhbGwvMS4KKwordHJ1ZS4KK290aGVyd2lzZS4KKworZmFpbCA6LSBmYWlsLgorZmFsc2UgOi0gZmFpbC4KKworIS4KKyUnJGdldF9sZXZlbCcoWCkgOi0gJyRnZXRfbGV2ZWwnKFgpLgorJSckbmVja19jdXQnIDotICckbmVja19jdXQnLgorJSckY3V0JyhYKSA6LSAnJGN1dCcoWCkuCisKKyhfIF4gRykgOi0gY2FsbChHKS4KKworKFAsIFEpIDotIGNhbGwoUCksIGNhbGwoUSkuCisKKyhQOyBfUSkgOi0gUCBcPSAoXyAtPiBfKSwgY2FsbChQKS4KKyhfUDsgUSkgOi0gUSBcPSAoXyAtPiBfKSwgY2FsbChRKS4KKworKElGIC0+IFRIRU4pIDotIGNhbGwoSUYpLCAhLCBjYWxsKFRIRU4pLgorCisoSUYgLT4gVEhFTjsgX0VMU0UpIDotIGNhbGwoSUYpLCAhLCBjYWxsKFRIRU4pLgorKF9JRiAtPiBfVEhFTjsgRUxTRSkgOi0gY2FsbChFTFNFKS4KKworY2FsbChUZXJtKSA6LSAKKwklJyRnZXRfbGV2ZWwnKEN1dCksCisJJyRnZXRfY3VycmVudF9CJyhDdXQpLAorCSckbWV0YV9jYWxsJyhUZXJtLCB1c2VyLCBDdXQsIDAsIGludGVycHJldCkuCisKKyckbWV0YV9jYWxsJyhYLCBfLCBfLCBfLCBfKSA6LSB2YXIoWCksICEsIGlsbGFyZyh2YXIsIGNhbGwoWCksIDEpLgorJyRtZXRhX2NhbGwnKFgsIF8sIF8sIF8sIF8pIDotIGNsb3N1cmUoWCksICEsICckY2FsbF9jbG9zdXJlJyhYKS4KKyckbWV0YV9jYWxsJyh0cnVlLCBfLCBfLCBfLCBfKSA6LSAhLgorJyRtZXRhX2NhbGwnKHRyYWNlLCBfLCBfLCBfLCBfKSA6LSAhLCB0cmFjZS4KKyckbWV0YV9jYWxsJyhkZWJ1ZywgXywgXywgXywgXykgOi0gISwgZGVidWcuCisnJG1ldGFfY2FsbCcobm90cmFjZSwgXywgXywgXywgXykgOi0gISwgbm90cmFjZS4KKyckbWV0YV9jYWxsJyhub2RlYnVnLCBfLCBfLCBfLCBfKSA6LSAhLCBub2RlYnVnLgorJyRtZXRhX2NhbGwnKHNweShMKSwgXywgXywgXywgXykgOi0gISwgc3B5KEwpLgorJyRtZXRhX2NhbGwnKG5vc3B5KEwpLCBfLCBfLCBfLCBfKSA6LSAhLCBub3NweShMKS4KKyckbWV0YV9jYWxsJyhub3NweWFsbCwgXywgXywgXywgXykgOi0gISwgbm9zcHlhbGwuCisnJG1ldGFfY2FsbCcobGVhc2goTCksIF8sIF8sIF8sIF8pIDotICEsIGxlYXNoKEwpLgorJyRtZXRhX2NhbGwnKFtYfFhzXSwgXywgXywgXywgXykgOi0gISwgY29uc3VsdChbWHxYc10pLgorJyRtZXRhX2NhbGwnKF9eWCwgUCwgQ3V0LCBEZXB0aCwgTW9kZSkgOi0gISwKKwknJG1ldGFfY2FsbCcoWCwgUCwgQ3V0LCBEZXB0aCwgTW9kZSkuCisnJG1ldGFfY2FsbCcoUDpYLCBfLCBDdXQsIERlcHRoLCBNb2RlKSA6LSAhLAorCSckbWV0YV9jYWxsJyhYLCBQLCBDdXQsIERlcHRoLCBNb2RlKS4KKyckbWV0YV9jYWxsJyghLCBfLCBubywgXywgXykgOi0gISwgaWxsYXJnKGNvbnRleHQoaWYsY3V0KSwgISwgMCkuCisnJG1ldGFfY2FsbCcoISwgXywgQ3V0LCBfLCBfKSA6LSAhLCAnJGN1dCcoQ3V0KS4KKyckbWV0YV9jYWxsJygoWCxZKSwgUCwgQ3V0LCBEZXB0aCwgTW9kZSkgOi0gISwKKwknJG1ldGFfY2FsbCcoWCwgUCwgQ3V0LCBEZXB0aCwgTW9kZSksCisJJyRtZXRhX2NhbGwnKFksIFAsIEN1dCwgRGVwdGgsIE1vZGUpLgorJyRtZXRhX2NhbGwnKChYLT5ZO1opLCBQLCBDdXQsIERlcHRoLCBNb2RlKSA6LSAhLAorCSggICAnJG1ldGFfY2FsbCcoWCwgUCwgbm8sIERlcHRoLCBNb2RlKSAtPiAnJG1ldGFfY2FsbCcoWSwgUCwgQ3V0LCBEZXB0aCwgTW9kZSkKKyAgICAgICAgOyAgICckbWV0YV9jYWxsJyhaLCBQLCBDdXQsIERlcHRoLCBNb2RlKQorICAgICAgICApLgorJyRtZXRhX2NhbGwnKChYLT5ZKSwgUCwgQ3V0LCBEZXB0aCwgTW9kZSkgOi0gISwKKwkoICAgJyRtZXRhX2NhbGwnKFgsIFAsIG5vLCBEZXB0aCwgTW9kZSkgLT4gJyRtZXRhX2NhbGwnKFksIFAsIEN1dCwgRGVwdGgsIE1vZGUpICAgKS4KKyckbWV0YV9jYWxsJygoWDtZKSwgUCwgQ3V0LCBEZXB0aCwgTW9kZSkgOi0gISwKKwkoICAgJyRtZXRhX2NhbGwnKFgsIFAsIEN1dCwgRGVwdGgsIE1vZGUpIDsgJyRtZXRhX2NhbGwnKFksIFAsIEN1dCwgRGVwdGgsIE1vZGUpICAgKS4KKyckbWV0YV9jYWxsJyhcKyhYKSwgUCwgXywgRGVwdGgsIE1vZGUpIDotICEsCisJXCsgJyRtZXRhX2NhbGwnKFgsIFAsIG5vLCBEZXB0aCwgTW9kZSkuCisnJG1ldGFfY2FsbCcoZmluZGFsbChYLFksWiksIFAsIEN1dCwgRGVwdGgsIE1vZGUpIDotICEsCisJZmluZGFsbChYLCAnJG1ldGFfY2FsbCcoWSwgUCwgQ3V0LCBEZXB0aCwgTW9kZSksIFopLgorJyRtZXRhX2NhbGwnKGJhZ29mKFgsWSxaKSwgUCwgQ3V0LCBEZXB0aCwgTW9kZSkgOi0gISwKKwliYWdvZihYLCAnJG1ldGFfY2FsbCcoWSwgUCwgQ3V0LCBEZXB0aCwgTW9kZSksIFopLgorJyRtZXRhX2NhbGwnKHNldG9mKFgsWSxaKSwgUCwgQ3V0LCBEZXB0aCwgTW9kZSkgOi0gISwKKwlzZXRvZihYLCAnJG1ldGFfY2FsbCcoWSwgUCwgQ3V0LCBEZXB0aCwgTW9kZSksIFopLgorJyRtZXRhX2NhbGwnKG9uY2UoWCksIFAsIEN1dCwgRGVwdGgsIE1vZGUpIDotICEsCisJb25jZSgnJG1ldGFfY2FsbCcoWCwgUCwgQ3V0LCBEZXB0aCwgTW9kZSkpLgorJyRtZXRhX2NhbGwnKG9uX2V4Y2VwdGlvbihYLFksWiksIFAsIEN1dCwgRGVwdGgsIE1vZGUpIDotICEsCisJb25fZXhjZXB0aW9uKFgsICckbWV0YV9jYWxsJyhZLCBQLCBDdXQsIERlcHRoLCBNb2RlKSwgJyRtZXRhX2NhbGwnKFosIFAsIEN1dCwgRGVwdGgsIE1vZGUpKS4KKyckbWV0YV9jYWxsJyhjYXRjaChYLFksWiksIFAsIEN1dCwgRGVwdGgsIE1vZGUpIDotICEsCisJY2F0Y2goJyRtZXRhX2NhbGwnKFgsIFAsIEN1dCwgRGVwdGgsIE1vZGUpLCBZLCAnJG1ldGFfY2FsbCcoWiwgUCwgQ3V0LCBEZXB0aCwgTW9kZSkpLgorJSckbWV0YV9jYWxsJyhmcmVlemUoWCxZKSwgUCwgQ3V0LCBEZXB0aCwgTW9kZSkgOi0gISwgPz8/CislCWZyZWV6ZShYLCAnJG1ldGFfY2FsbCcoWSwgUCwgQ3V0LCBEZXB0aCwgTW9kZSkpLgorJyRtZXRhX2NhbGwnKHN5bmNocm9uaXplZChYLFkpLCBQLCBDdXQsIERlcHRoLCBNb2RlKSA6LSAhLAorCXN5bmNocm9uaXplZChYLCAnJG1ldGFfY2FsbCcoWSwgUCwgQ3V0LCBEZXB0aCwgTW9kZSkpLgorJyRtZXRhX2NhbGwnKGNsYXVzZShYLCBZKSwgUCwgXywgXywgXykgOi0gISwgY2xhdXNlKFA6WCwgWSkuCisnJG1ldGFfY2FsbCcoYXNzZXJ0KFgpLCBQLCBfLCBfLCBfKSA6LSAhLCBhc3NlcnR6KFA6WCkuCisnJG1ldGFfY2FsbCcoYXNzZXJ0eihYKSwgUCwgXywgXywgXykgOi0gISwgYXNzZXJ0eihQOlgpLgorJyRtZXRhX2NhbGwnKGFzc2VydGEoWCksIFAsIF8sIF8sIF8pIDotICEsIGFzc2VydGEoUDpYKS4KKyckbWV0YV9jYWxsJyhyZXRyYWN0KFgpLCBQLCBfLCBfLCBfKSA6LSAhLCByZXRyYWN0KFA6WCkuCisnJG1ldGFfY2FsbCcoYWJvbGlzaChYKSwgUCwgXywgXywgXykgOi0gISwgYWJvbGlzaChQOlgpLgorJyRtZXRhX2NhbGwnKHJldHJhY3RhbGwoWCksIFAsIF8sIF8sIF8pIDotICEsIHJldHJhY3RhbGwoUDpYKS4KKyckbWV0YV9jYWxsJyhYLCBQLCBfLCBEZXB0aCwgTW9kZSkgOi0gYXRvbShQKSwgY2FsbGFibGUoWCksICEsCisJJyRtZXRhX2NhbGwnKE1vZGUsIERlcHRoLCBQLCBYKS4KKyckbWV0YV9jYWxsJyhYLCBQLCBfLCBfLCBfKSA6LSAKKwlpbGxhcmcodHlwZShjYWxsYWJsZSksIGNhbGwoUDpYKSwgMSkuCisKKyckbWV0YV9jYWxsJyh0cmFjZSwgRGVwdGgsIFAsIFgpIDotICEsIAorCWZ1bmN0b3IoWCwgRiwgQSksCisJJyR0cmFjZV9nb2FsJyhYLCBQLCBGL0EsIERlcHRoKS4KKyckbWV0YV9jYWxsJyhpbnRlcnByZXQsIERlcHRoLCBQLCBYKSA6LSAKKwlmdW5jdG9yKFgsIEYsIEEpLAorCSckY2FsbF9pbnRlcm5hbCcoWCwgUCwgRi9BLCBEZXB0aCwgaW50ZXJwcmV0KS4KKworJyRjYWxsX2ludGVybmFsJyhYLCBQLCBGQSwgRGVwdGgsIE1vZGUpIDotIAorCSckbmV3X2ludGVybmFsX2RhdGFiYXNlJyhQKSwKKwloYXNoX2NvbnRhaW5zX2tleShQLCBGQSksCisJISwKKwklJyRnZXRfbGV2ZWwnKEN1dCksCisJJyRnZXRfY3VycmVudF9CJyhDdXQpLAorCURlcHRoMSBpcyBEZXB0aCArIDEsCisJY2xhdXNlKFA6WCwgQm9keSksCisJJyRtZXRhX2NhbGwnKEJvZHksIFAsIEN1dCwgRGVwdGgxLCBNb2RlKS4KKyckY2FsbF9pbnRlcm5hbCcoWCwgUCwgXywgXywgXykgOi0gJyRjYWxsJyhQLCBYKS4KKworCis6LSBwdWJsaWMgY2F0Y2gvMywgdGhyb3cvMS4KKzotIHB1YmxpYyBvbl9leGNlcHRpb24vMy4KKyU6LSBwdWJsaWMgcmFpc2VfZXhjZXB0aW9uLzEuICh3cml0dGVuIGluIEphdmEpCisKK2NhdGNoKEdvYWwsIENhdGNoLCBSZWNvdmVyeSkgOi0KKwlvbl9leGNlcHRpb24oQ2F0Y2gsIEdvYWwsIFJlY292ZXJ5KS4KKwordGhyb3coTXNnKSA6LSByYWlzZV9leGNlcHRpb24oTXNnKS4KKworb25fZXhjZXB0aW9uKENhdGNoLCBHb2FsLCBSZWNvdmVyeSkgOi0gCisJY2FsbGFibGUoR29hbCksIAorCSEsCisJJyRvbl9leGNlcHRpb24nKENhdGNoLCBHb2FsLCBSZWNvdmVyeSkuCitvbl9leGNlcHRpb24oQ2F0Y2gsIEdvYWwsIFJlY292ZXJ5KSA6LSAKKwlpbGxhcmcodHlwZShjYWxsYWJsZSksIG9uX2V4Y2VwdGlvbihDYXRjaCxHb2FsLFJlY292ZXJ5KSwgMikuCisKKyckb25fZXhjZXB0aW9uJyhfQ2F0Y2gsIEdvYWwsIF9SZWNvdmVyeSkgOi0KKwknJHNldF9leGNlcHRpb24nKCckbm9uZScpLAorCSckYmVnaW5fZXhjZXB0aW9uJyhMKSwKKwljYWxsKEdvYWwpLAorCSckZW5kX2V4Y2VwdGlvbicoTCkuCisnJG9uX2V4Y2VwdGlvbicoQ2F0Y2gsIF9Hb2FsLCBSZWNvdmVyeSkgOi0KKyAgICAgICAgJyRnZXRfZXhjZXB0aW9uJyhNc2cpLAorICAgICAgICBNc2cgXD09ICckbm9uZScsCisJJyRjYXRjaF9hbmRfdGhyb3cnKE1zZywgQ2F0Y2gsIFJlY292ZXJ5KS4KKworJyRjYXRjaF9hbmRfdGhyb3cnKE1zZywgTXNnLCBSZWNvdmVyeSkgOi0gICEsIAorICAgICAgICAnJHNldF9leGNlcHRpb24nKCckbm9uZScpLAorCWNhbGwoUmVjb3ZlcnkpLgorJyRjYXRjaF9hbmRfdGhyb3cnKE1zZywgXywgXykgOi0gIAorCXJhaXNlX2V4Y2VwdGlvbihNc2cpLgorCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCislIFRlcm0gdW5pZmljYXRpb24KKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKzotIHB1YmxpYyAoPSkvMiwgJyR1bmlmeScvMi4KKzotIHB1YmxpYyAoXD0pLzIsICckbm90X3VuaWZpYWJsZScvMi4KKworWCA9IFkgOi0gWCA9IFkuCisnJHVuaWZ5JyhYLCBZKSA6LSAnJHVuaWZ5JyhYLCBZKS4KKworWCBcPSBZIDotIFggXD0gWS4KKyckbm90X3VuaWZpYWJsZScoWCwgWSkgOi0gJyRub3RfdW5pZmlhYmxlJyhYLCBZKS4KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSBUeXBlIHRlc3RpbmcKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKzotIHB1YmxpYyB2YXIvMSwgYXRvbS8xLCBpbnRlZ2VyLzEsIGZsb2F0LzEsIGF0b21pYy8xLCBjb21wb3VuZC8xLCBub252YXIvMSwgbnVtYmVyLzEuCis6LSBwdWJsaWMgamF2YS8xLCBqYXZhLzIsIGNsb3N1cmUvMS4KKzotIHB1YmxpYyBncm91bmQvMSwgY2FsbGFibGUvMS4KKwordmFyKFgpIDotIHZhcihYKS4KKworYXRvbShYKSA6LSBhdG9tKFgpLgorCitpbnRlZ2VyKFgpIDotIGludGVnZXIoWCkuCisKK2Zsb2F0KFgpIDotIGZsb2F0KFgpLgorCithdG9taWMoWCkgOi0gYXRvbWljKFgpLgorCitub252YXIoWCkgOi0gbm9udmFyKFgpLgorCitudW1iZXIoWCkgOi0gbnVtYmVyKFgpLgorCitqYXZhKFgpIDotIGphdmEoWCkuCitqYXZhKFgsIFkpIDotIGphdmEoWCwgWSkuCisKK2Nsb3N1cmUoWCkgOi0gY2xvc3VyZShYKS4KKworZ3JvdW5kKFgpIDotIGdyb3VuZChYKS4KKworY29tcG91bmQoWCkgOi0gbm9udmFyKFgpLCBmdW5jdG9yKFgsIF8sIEEpLCBBID4gMC4KKworY2FsbGFibGUoWCkgOi0gYXRvbShYKSwgIS4KK2NhbGxhYmxlKFgpIDotIGNvbXBvdW5kKFgpLCAhLgorY2FsbGFibGUoWCkgOi0gY2xvc3VyZShYKS4KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSBUZXJtIGNvbXBhcmlzb24KKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKzotIHB1YmxpYyAoPT0pLzIsICAnJGVxdWFsaXR5X29mX3Rlcm0nLzIuCis6LSBwdWJsaWMgKFw9PSkvMiwgJyRpbmVxdWFsaXR5X29mX3Rlcm0nLzIuCis6LSBwdWJsaWMgKEA8KS8yLCAgJyRiZWZvcmUnLzIuCis6LSBwdWJsaWMgKEA+KS8yLCAgJyRhZnRlcicvMi4KKzotIHB1YmxpYyAoQD08KS8yLCAnJG5vdF9hZnRlcicvMi4KKzotIHB1YmxpYyAoQD49KS8yLCAnJG5vdF9iZWZvcmUnLzIuCis6LSBwdWJsaWMgKD89KS8yLCAgJyRpZGVudGljYWxfb3JfY2Fubm90X3VuaWZ5Jy8yLgorOi0gcHVibGljIGNvbXBhcmUvMy4KKyUgOi0gcHVibGljIHNvcnQvMi4gICAgd2l0dGVuIGluIEphdmEKKyUgOi0gcHVibGljIGtleXNvcnQvMi4gd2l0dGVuIGluIEphdmEKKyUgOi0gcHVibGljIG1lcmdlLzMuCisKK1ggPT0gWSA6LSBYID09IFkuCisnJGVxdWFsaXR5X29mX3Rlcm0nKFgsIFkpIDotICckZXF1YWxpdHlfb2ZfdGVybScoWCwgWSkuCisKK1ggXD09IFkgOi0gWCBcPT0gWS4KKyckaW5lcXVhbGl0eV9vZl90ZXJtJyhYLCBZKSA6LSAnJGluZXF1YWxpdHlfb2ZfdGVybScoWCwgWSkuCisKK1ggQDwgWSA6LSBYIEA8IFkuCisnJGJlZm9yZScoWCwgWSkgOi0gJyRiZWZvcmUnKFgsIFkpLgorCitYIEA+IFkgOi0gWCBAPiBZLgorJyRhZnRlcicoWCwgWSkgOi0gJyRhZnRlcicoWCwgWSkuCisKK1ggQD08IFkgOi0gWCBAPTwgWS4KKyckbm90X2FmdGVyJyhYLCBZKSA6LSAnJG5vdF9hZnRlcicoWCwgWSkuCisKK1ggQD49IFkgOi0gWCBAPj0gWS4KKyckbm90X2JlZm9yZScoWCwgWSkgOi0gJyRub3RfYmVmb3JlJyhYLCBZKS4KKworPz0oWCwgWSkgOi0gPz0oWCwgWSkuCisnJGlkZW50aWNhbF9vcl9jYW5ub3RfdW5pZnknKFgsIFkpIDotICckaWRlbnRpY2FsX29yX2Nhbm5vdF91bmlmeScoWCwgWSkuCisKK2NvbXBhcmUoT3AsIFgsIFkpIDotICckY29tcGFyZTAnKE9wMCwgWCwgWSksICckbWFwX2NvbXBhcmVfb3AnKE9wMCwgT3ApLgorCisnJGNvbXBhcmUwJyhPcDAsIFgsIFkpIDotCisJJyRJTlNFUlRfQU0nKFtkZXJlZihhKDIpLGEoMikpLGRlcmVmKGEoMyksYSgzKSldKSwKKwknJElOU0VSVCcoWydcdGlmKCEgYTEudW5pZnkobmV3IEludGVnZXJUZXJtKGEyLmNvbXBhcmVUbyhhMykpLCBlbmdpbmUudHJhaWwpKScsCisJICAgICAgICAgICAnXHRcdHJldHVybiBlbmdpbmUuZmFpbCgpOyddKS4KKworJyRtYXBfY29tcGFyZV9vcCcoT3AwLCBPcCkgOi0gT3AwID06PSAwLCAhLCBPcCA9ICg9KS4KKyckbWFwX2NvbXBhcmVfb3AnKE9wMCwgT3ApIDotIE9wMCA8IDAsICEsIE9wID0gKDwpLgorJyRtYXBfY29tcGFyZV9vcCcoT3AwLCBPcCkgOi0gT3AwID4gMCwgISwgT3AgPSAoPikuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUgVGVybSBjcmVhdGlvbiBhbmQgZGVjb21wb3NpdGlvbgorJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJTotIHB1YmxpYyBhcmcvMy4gICAgIC0tPiB3cml0dGVuIGluIEphdmEKKyU6LSBwdWJsaWMgZnVuY3Rvci8zLiAtLT4gd3JpdHRlbiBpbiBKYXZhCis6LSBwdWJsaWMgKD0uLikvMi4KKzotIHB1YmxpYyBjb3B5X3Rlcm0vMi4KKworVGVybSA9Li4gTGlzdCA6LSBUZXJtID0uLiBMaXN0LgorCitjb3B5X3Rlcm0oWCwgWSkgOi0gY29weV90ZXJtKFgsIFkpLgorCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCislIEFyaXRobWV0aWMgZXZhbHVhdGlvbgorJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorOi0gcHVibGljIChpcykvMi4KKzotIHB1YmxpYyAnJGFicycvMiwgJyRhc2luJy8yLCAnJGFjb3MnLzIsICckYXRhbicvMi4KKzotIHB1YmxpYyAnJGJpdHdpc2VfY29uaicvMywgJyRiaXR3aXNlX2Rpc2onLzMsICckYml0d2lzZV9leGNsdXNpdmVfb3InLzMsICckYml0d2lzZV9uZWcnLzIuCis6LSBwdWJsaWMgJyRjZWlsJy8yLCAnJGNvcycvMi4KKzotIHB1YmxpYyAnJGRlZ3JlZXMnLzIuCis6LSBwdWJsaWMgJyRleHAnLzIuCis6LSBwdWJsaWMgJyRmbG9hdCcvMiwgJyRmbG9hdF9pbnRlZ2VyX3BhcnQnLzIsICckZmxvYXRfZnJhY3Rpb25hbF9wYXJ0Jy8yLCAnJGZsb2F0X3F1b3RpZW50Jy8zLCAnJGZsb29yJy8yLgorOi0gcHVibGljICckaW50X3F1b3RpZW50Jy8zLgorOi0gcHVibGljICckbG9nJy8yLgorOi0gcHVibGljICckbWF4Jy8zLCAnJG1pbicvMywgJyRtaW51cycvMywgJyRtb2QnLzMsICckbXVsdGknLzMuCis6LSBwdWJsaWMgJyRwbHVzJy8zLCAnJHBvdycvMy4KKzotIHB1YmxpYyAnJHJhZGlhbnMnLzIsICckcmludCcvMiwgJyRyb3VuZCcvMi4KKzotIHB1YmxpYyAnJHNoaWZ0X2xlZnQnLzMsICckc2hpZnRfcmlnaHQnLzMsICckc2lnbicvMiwgJyRzaW4nLzIsICckc3FydCcvMi4KKzotIHB1YmxpYyAnJHRhbicvMiwgJyR0cnVuY2F0ZScvMi4KKworWiBpcyBZIDotIFogaXMgWS4KKworJyRhYnMnKFgsIFkpIDotICckYWJzJyhYLCBZKS4KKyckYXNpbicoWCwgWSkgOi0gJyRhc2luJyhYLCBZKS4KKyckYWNvcycoWCwgWSkgOi0gJyRhY29zJyhYLCBZKS4KKyckYXRhbicoWCwgWSkgOi0gJyRhdGFuJyhYLCBZKS4KKyckYml0d2lzZV9jb25qJyhYLCBZLCBaKSA6LSAnJGJpdHdpc2VfY29uaicoWCwgWSwgWikuCisnJGJpdHdpc2VfZGlzaicoWCwgWSwgWikgOi0gJyRiaXR3aXNlX2Rpc2onKFgsIFksIFopLgorJyRiaXR3aXNlX2V4Y2x1c2l2ZV9vcicoWCwgWSwgWikgOi0gJyRiaXR3aXNlX2V4Y2x1c2l2ZV9vcicoWCwgWSwgWikuCisnJGJpdHdpc2VfbmVnJyhYLCBZKSA6LSAnJGJpdHdpc2VfbmVnJyhYLCBZKS4KKyckY2VpbCcoWCwgWSkgOi0gJyRjZWlsJyhYLCBZKS4KKyckY29zJyhYLCBZKSA6LSAnJGNvcycoWCwgWSkuCisnJGRlZ3JlZXMnKFgsIFkpIDotICckZGVncmVlcycoWCwgWSkuCisnJGV4cCcoWCwgWSkgOi0gJyRleHAnKFgsIFkpLgorJyRmbG9hdCcoWCwgWSkgOi0gJyRmbG9hdCcoWCwgWSkuCisnJGZsb2F0X2ludGVnZXJfcGFydCcoWCwgWSkgOi0gJyRmbG9hdF9pbnRlZ2VyX3BhcnQnKFgsIFkpLgorJyRmbG9hdF9mcmFjdGlvbmFsX3BhcnQnKFgsIFkpIDotICckZmxvYXRfZnJhY3Rpb25hbF9wYXJ0JyhYLCBZKS4KKyckZmxvYXRfcXVvdGllbnQnKFgsIFksIFopIDotICckZmxvYXRfcXVvdGllbnQnKFgsIFksIFopLgorJyRmbG9vcicoWCwgWSkgOi0gJyRmbG9vcicoWCwgWSkuCisnJGludF9xdW90aWVudCcoWCwgWSwgWikgOi0gJyRpbnRfcXVvdGllbnQnKFgsIFksIFopLgorJyRsb2cnKFgsIFkpIDotICckbG9nJyhYLCBZKS4KKyckbWF4JyhYLCBZLCBaKSA6LSAnJG1heCcoWCwgWSwgWikuCisnJG1pbicoWCwgWSwgWikgOi0gJyRtaW4nKFgsIFksIFopLgorJyRtaW51cycoWCwgWSwgWikgOi0gJyRtaW51cycoWCwgWSwgWikuCisnJG1vZCcoWCwgWSwgWikgOi0gJyRtb2QnKFgsIFksIFopLgorJyRtdWx0aScoWCwgWSwgWikgOi0gJyRtdWx0aScoWCwgWSwgWikuCisnJHBsdXMnKFgsWSxaKSA6LSAnJHBsdXMnKFgsWSxaKS4KKyckcG93JyhYLCBZLCBaKSA6LSAnJHBvdycoWCwgWSwgWikuCisnJHJhZGlhbnMnKFgsIFkpIDotICckcmFkaWFucycoWCwgWSkuCisnJHJpbnQnKFgsIFkpIDotICckcmludCcoWCwgWSkuCisnJHJvdW5kJyhYLCBZKSA6LSAnJHJvdW5kJyhYLCBZKS4KKyckc2hpZnRfbGVmdCcoWCwgWSwgWikgOi0gJyRzaGlmdF9sZWZ0JyhYLCBZLCBaKS4KKyckc2hpZnRfcmlnaHQnKFgsIFksIFopIDotICckc2hpZnRfcmlnaHQnKFgsIFksIFopLgorJyRzaWduJyhYLCBZKSA6LSAnJHNpZ24nKFgsIFkpLgorJyRzaW4nKFgsIFkpIDotICckc2luJyhYLCBZKS4KKyckc3FydCcoWCwgWSkgOi0gJyRzcXJ0JyhYLCBZKS4KKyckdGFuJyhYLCBZKSA6LSAnJHRhbicoWCwgWSkuCisnJHRydW5jYXRlJyhYLCBZKSA6LSAnJHRydW5jYXRlJyhYLCBZKS4KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSBBcml0aG1ldGljIGNvbXBhcmlzb24KKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKzotIHB1YmxpYyAoPTo9KS8yLCAnJGFyaXRoX2VxdWFsJy8yLgorOi0gcHVibGljICg9XD0pLzIsICckYXJpdGhfbm90X2VxdWFsJy8yLgorOi0gcHVibGljICg8KS8yLCAnJGxlc3NfdGhhbicvMi4KKzotIHB1YmxpYyAoPTwpLzIsICckbGVzc19vcl9lcXVhbCcvMi4KKzotIHB1YmxpYyAoPikvMiwgJyRncmVhdGVyX3RoYW4nLzIuCis6LSBwdWJsaWMgKD49KS8yLCAnJGdyZWF0ZXJfb3JfZXF1YWwnLzIuCisKK1ggPTo9IFkgOi0gWCA9Oj0gWS4KKyckYXJpdGhfZXF1YWwnKFgsIFkpIDotICckYXJpdGhfZXF1YWwnKFgsIFkpLgorCitYID1cPSBZIDotIFggPVw9IFkuCisnJGFyaXRoX25vdF9lcXVhbCcoWCwgWSkgOi0gJyRhcml0aF9ub3RfZXF1YWwnKFgsIFkpLgorCitYIDwgWSA6LSBYIDwgWS4KKyckbGVzc190aGFuJyhYLCBZKSA6LSAnJGxlc3NfdGhhbicoWCwgWSkuCisKK1ggPTwgWSA6LSBYID08IFkuCisnJGxlc3Nfb3JfZXF1YWwnKFgsIFkpIDotICckbGVzc19vcl9lcXVhbCcoWCwgWSkuCisKK1ggPiBZIDotIFggPiBZLgorJyRncmVhdGVyX3RoYW4nKFgsIFkpIDotICckZ3JlYXRlcl90aGFuJyhYLCBZKS4KKworWCA+PSBZIDotIFggPj0gWS4KKyckZ3JlYXRlcl9vcl9lcXVhbCcoWCwgWSkgOi0gJyRncmVhdGVyX29yX2VxdWFsJyhYLCBZKS4KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSBDbGF1c2UgcmV0cmlldmFsIGFuZCBpbmZvcm1hdGlvbgorJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorOi0gcHVibGljIGNsYXVzZS8yLgorOi0gcHVibGljIChpbml0aWFsaXphdGlvbikvMi4KKzotIHB1YmxpYyAnJG5ld19pbmRleGluZ19oYXNoJy8zLgorCitjbGF1c2UoSGVhZCwgQikgOi0KKwknJGhlYWRfdG9fdGVybScoSGVhZCwgSCwgUDpQSSwgY2xhdXNlKEhlYWQsQikpLAorCSckbmV3X2ludGVybmFsX2RhdGFiYXNlJyhQKSwKKwknJGNoZWNrX3Byb2NlZHVyZV9wZXJtaXNzaW9uJyhQOlBJLCBhY2Nlc3MsIHByaXZhdGVfcHJvY2VkdXJlLCBjbGF1c2UoSGVhZCwgQikpLCAKKwknJGNsYXVzZV9pbnRlcm5hbCcoUCwgUEksIEgsIENsLCBfKSwKKwklKGdyb3VuZChDbCkgLT4gQ2wgPSAoSCA6LSBCKSA7IGNvcHlfdGVybShDbCwgKEggOi0gQikpKS4gPz8/CisJY29weV90ZXJtKENsLCAoSCA6LSBCKSkuCisKKyUgaGVhZCAtLT4gdGVybQorJyRoZWFkX3RvX3Rlcm0nKEgsIFQsIFBrZzpGL0EsIEdvYWwpIDotIAorCSckaGVhZF90b190ZXJtJyhILCBULCB1c2VyLCBQa2csIEdvYWwpLAorCWZ1bmN0b3IoVCwgRiwgQSkuCisKKyckaGVhZF90b190ZXJtJyhILCBfLCBfLCBfLCBHb2FsKSA6LSB2YXIoSCksICEsCisJaWxsYXJnKHZhciwgR29hbCwgMSkuCisnJGhlYWRfdG9fdGVybScoUDpILCBULCBfLCBQa2csIEdvYWwpIDotICEsCisJJyRoZWFkX3RvX3Rlcm0nKEgsIFQsIFAsIFBrZywgR29hbCkuCisnJGhlYWRfdG9fdGVybScoSCwgSCwgUGtnLCBQa2csIF8pIDotIGNhbGxhYmxlKEgpLCBhdG9tKFBrZyksICEuCisnJGhlYWRfdG9fdGVybScoXywgXywgXywgXywgR29hbCkgOi0gCisJaWxsYXJnKHR5cGUoY2FsbGFibGUpLCBHb2FsLCAxKS4KKworJSBjcmVhdGVzIGFuIGludGVybmFsIGRhdGFiYXNlIGZvciBBIGlmIG5vIGV4aXN0cy4KKyckbmV3X2ludGVybmFsX2RhdGFiYXNlJyhBKSA6LQorCWF0b20oQSksCisJJyRnZXRfaGFzaF9tYW5hZ2VyJyhITSksCisJJyRuZXdfaW50ZXJuYWxfZGF0YWJhc2UnKEhNLCBBKS4KKworJyRuZXdfaW50ZXJuYWxfZGF0YWJhc2UnKEhNLCBBKSA6LQorCWhhc2hfY29udGFpbnNfa2V5KEhNLCBBKSwKKwkhLgorJyRuZXdfaW50ZXJuYWxfZGF0YWJhc2UnKF8sIEEpIDotCisJbmV3X2hhc2goXywgW2FsaWFzKEEpXSksCisJJyRpbml0X2ludGVybmFsX2RhdGFiYXNlJyhBKS4KKworJyRpbml0X2ludGVybmFsX2RhdGFiYXNlJyhBKSA6LQorCSckY29tcGlsZWRfcHJlZGljYXRlJyhBLCAnJGluaXQnLCAwKSwKKwljYWxsKEE6JyRpbml0JyksCisJIS4KKyckaW5pdF9pbnRlcm5hbF9kYXRhYmFzZScoXykuCisKKyUgY2hlY2tzIGlmIHRoZSBpbnRlcm5hbCBkYXRhYmFzZSBvZiBBIGV4aXN0cy4KKyckZGVmaW5lZF9pbnRlcm5hbF9kYXRhYmFzZScoQSkgOi0KKwlhdG9tKEEpLAorCSckZ2V0X2hhc2hfbWFuYWdlcicoSE0pLAorCWhhc2hfY29udGFpbnNfa2V5KEhNLCBBKS4KKworJSByZXBlYXRlZGx5IGZpbmRzIGR5bmFtaWMgY2xhdXNlcy4KKyckY2xhdXNlX2ludGVybmFsJyhQLCBQSSwgSCwgQ2wsIFJlZikgOi0KKwloYXNoX2NvbnRhaW5zX2tleShQLCBQSSksCisJJyRnZXRfaW5kaWNlcycoUCwgUEksIEgsIFJldlJlZnMpLAorCSckZ2V0X2luc3RhbmNlcycoUmV2UmVmcywgQ2xzX1JlZnMpLAorCSUgPz8/CisJJWxlbmd0aChDbHNfUmVmcyxOKSwKKwklJyRmYXN0X3dyaXRlJyhbY2xhdXNlX2ludGVybmFsLE4sZm9yLFAsUEldKSxubCwKKwklCisJJyRjbGF1c2VfaW50ZXJuYWwwJyhDbHNfUmVmcywgQ2wsIFJlZikuCisKKyckY2xhdXNlX2ludGVybmFsMCcoW10sIF8sIF8pIDotIGZhaWwuCisnJGNsYXVzZV9pbnRlcm5hbDAnKFsoQ2wsUmVmKV0sIENsLCBSZWYpIDotICEuCisnJGNsYXVzZV9pbnRlcm5hbDAnKEwsIENsLCBSZWYpIDotCisJJyRidWlsdGluX21lbWJlcicoKENsLFJlZiksIEwpLgorCisnJGdldF9pbmRpY2VzJyhQLCBQSSwgSCwgUmVmcykgOi0KKwknJG5ld19pbmRleGluZ19oYXNoJyhQLCBQSSwgSUgpLAorCSckY2FsY19pbmRleGluZ19rZXknKEgsIEtleSksCisJKCAgICBoYXNoX2NvbnRhaW5zX2tleShJSCwgS2V5KSAtPiBoYXNoX2dldChJSCwgS2V5LCBSZWZzKQorICAgICAgICAgICAgIDsgCisgICAgICAgICAgICAgaGFzaF9nZXQoSUgsIHZhciwgUmVmcykKKyAgICAgICAgKS4KKworJSBmaW5kcyB0aGUgaW5kZXhpbmcgaGFzaHRhYmxlIGZvciBQOlBJLiBjcmVhdGVzIGl0IGlmIG5vIGV4aXN0LgorJyRuZXdfaW5kZXhpbmdfaGFzaCcoUCwgUEksIElIKSA6LQorCWhhc2hfY29udGFpbnNfa2V5KFAsIFBJKSwKKwkhLAorCWhhc2hfZ2V0KFAsIFBJLCBJSCkuCisnJG5ld19pbmRleGluZ19oYXNoJyhQLCBQSSwgSUgpIDotCisJbmV3X2hhc2goSUgpLAorCWhhc2hfcHV0KElILCBhbGwsIFtdKSwKKwloYXNoX3B1dChJSCwgdmFyLCBbXSksCisJaGFzaF9wdXQoSUgsIGxpcywgW10pLAorCWhhc2hfcHV0KElILCBzdHIsIFtdKSwKKwloYXNoX3B1dChQLCBQSSwgSUgpLgorCisnJGNhbGNfaW5kZXhpbmdfa2V5JyhILCBhbGwpIDotIGF0b20oSCksICEuCisnJGNhbGNfaW5kZXhpbmdfa2V5JyhILCBLZXkpIDotIAorCWFyZygxLCBILCBBMSksIAorCSckY2FsY19pbmRleGluZ19rZXkwJyhBMSwgS2V5KS4KKworJyRjYWxjX2luZGV4aW5nX2tleTAnKEExLCBhbGwpIDotIHZhcihBMSksICEuCisnJGNhbGNfaW5kZXhpbmdfa2V5MCcoQTEsIGxpcykgOi0gQTEgPSBbX3xfXSwgIS4KKyckY2FsY19pbmRleGluZ19rZXkwJyhBMSwgc3RyKSA6LSBjb21wb3VuZChBMSksICEuCisnJGNhbGNfaW5kZXhpbmdfa2V5MCcoQTEsIEtleSkgOi0gZ3JvdW5kKEExKSwgISwgJyR0ZXJtX2hhc2gnKEExLCBLZXkpLgorJyRjYWxjX2luZGV4aW5nX2tleTAnKEExLCBLZXkpIDotIGlsbGFyZyh0eXBlKHRlcm0pLCAnJGNhbGNfaW5kZXhpbmdfa2V5MCcoQTEsS2V5KSwgMSkuCisKKyUgY2hlY2tzIHRoZSBwZXJtaXNzaW9uIG9mIHByZWRpY2F0ZSBQOkYvQS4KKyckY2hlY2tfcHJvY2VkdXJlX3Blcm1pc3Npb24nKFA6Ri9BLCBfT3BlcmF0aW9uLCBfT2JqVHlwZSwgX0dvYWwpIDotIAorCWhhc2hfY29udGFpbnNfa2V5KFAsIEYvQSksCisJIS4KKyckY2hlY2tfcHJvY2VkdXJlX3Blcm1pc3Npb24nKFA6Ri9BLCBPcGVyYXRpb24sIE9ialR5cGUsIEdvYWwpIDotIAorCSckY29tcGlsZWRfcHJlZGljYXRlX29yX2J1aWx0aW4nKFAsIEYsIEEpLAorCSEsCisgICAgICAgIGlsbGFyZyhwZXJtaXNzaW9uKE9wZXJhdGlvbixPYmpUeXBlLFA6Ri9BLF8pLCBHb2FsLCBfKS4KKyckY2hlY2tfcHJvY2VkdXJlX3Blcm1pc3Npb24nKF8sIF8sIF8sIF8pLgorCislIGNoZWNrcyBpZiBwcmVkaWNhdGUgUDpGL0EgaXMgY29tcGlsZWQgb3Igbm90LgorJyRjb21waWxlZF9wcmVkaWNhdGUnKFAsIEYsIEEpIDotCisJJyRJTlNFUlRfQU0nKFtkZXJlZihhKDEpLGEoMSkpLGRlcmVmKGEoMiksYSgyKSksZGVyZWYoYSgzKSxhKDMpKV0pLAorCSckSU5TRVJUJyhbJ1x0aWYoISBlbmdpbmUucGNsLmRlZmluZWRQcmVkaWNhdGUoKChTeW1ib2xUZXJtKWExKS5uYW1lKCksICgoU3ltYm9sVGVybSlhMikubmFtZSgpLCAoKEludGVnZXJUZXJtKWEzKS5pbnRWYWx1ZSgpKSknLAorCSAgICAgICAgICAgJ1x0XHRyZXR1cm4gZW5naW5lLmZhaWwoKTsnXSkuCisKKyckY29tcGlsZWRfcHJlZGljYXRlX29yX2J1aWx0aW4nKFAsIEYsIEEpIDotCisJJyRJTlNFUlRfQU0nKFtkZXJlZihhKDEpLGEoMSkpLGRlcmVmKGEoMiksYSgyKSksZGVyZWYoYSgzKSxhKDMpKV0pLAorCSckSU5TRVJUJyhbJ1x0aWYoISBlbmdpbmUucGNsLmRlZmluZWRQcmVkaWNhdGUoKChTeW1ib2xUZXJtKWExKS5uYW1lKCksICgoU3ltYm9sVGVybSlhMikubmFtZSgpLCAoKEludGVnZXJUZXJtKWEzKS5pbnRWYWx1ZSgpKSAmJiAhIGVuZ2luZS5wY2wuZGVmaW5lZFByZWRpY2F0ZSgianAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluIiwgKChTeW1ib2xUZXJtKWEyKS5uYW1lKCksICgoSW50ZWdlclRlcm0pYTMpLmludFZhbHVlKCkpKScsCisJICAgICAgICAgICAnXHRcdHJldHVybiBlbmdpbmUuZmFpbCgpOyddKS4KKworJSBpbml0aWFsaXplIGludGVybmFsIGRhdGFiYXNlcyBvZiBnaXZlbiBwYWNrYWdlcy4KKyVpbml0aWFsaXphdGlvbihbXSwgR29hbCkgOi0gISwgY2FsbChHb2FsKS4KK2luaXRpYWxpemF0aW9uKFtdLCBHb2FsKSA6LSAhLCBvbmNlKEdvYWwpLgoraW5pdGlhbGl6YXRpb24oW1B8UHNdLCBHb2FsKSA6LQorCSckbmV3X2ludGVybmFsX2RhdGFiYXNlJyhQKSwKKwlpbml0aWFsaXphdGlvbihQcywgR29hbCkuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUgQ2xhdXNlIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbgorJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorOi0gcHVibGljIGFzc2VydC8xLgorOi0gcHVibGljIGFzc2VydHovMS4KKzotIHB1YmxpYyBhc3NlcnRhLzEuCis6LSBwdWJsaWMgcmV0cmFjdC8xLgorOi0gcHVibGljIGFib2xpc2gvMS4KKzotIHB1YmxpYyByZXRyYWN0YWxsLzEuCisKK2Fzc2VydChUKSA6LWFzc2VydHooVCkuCisKK2Fzc2VydHooVCkgOi0KKwknJHRlcm1fdG9fY2xhdXNlJyhULCBDbCwgUDpQSSwgYXNzZXJ0eihUKSksCisJJyRuZXdfaW50ZXJuYWxfZGF0YWJhc2UnKFApLAorCSckY2hlY2tfcHJvY2VkdXJlX3Blcm1pc3Npb24nKFA6UEksIG1vZGlmeSwgc3RhdGljX3Byb2NlZHVyZSwgYXNzZXJ0eihUKSksCisJY29weV90ZXJtKENsLCBOZXdDbCksCisJJyRpbnNlcnQnKE5ld0NsLCBSZWYpLAorCSUnJGZhc3Rfd3JpdGUnKFtpbnRlcnQsTmV3Q2wsUmVmXSksIG5sLCAlPz8/CisJJyR1cGRhdGVfaW5kZXhpbmcnKFAsIFBJLCBDbCwgUmVmLCAneicpLAorCWZhaWwuCithc3NlcnR6KF8pLgorCithc3NlcnRhKFQpIDotIAorCSckdGVybV90b19jbGF1c2UnKFQsIENsLCBQOlBJLCBhc3NlcnRhKFQpKSwKKwknJG5ld19pbnRlcm5hbF9kYXRhYmFzZScoUCksCisJJyRjaGVja19wcm9jZWR1cmVfcGVybWlzc2lvbicoUDpQSSwgbW9kaWZ5LCBzdGF0aWNfcHJvY2VkdXJlLCBhc3NlcnRhKFQpKSwKKwljb3B5X3Rlcm0oQ2wsIE5ld0NsKSwKKwknJGluc2VydCcoTmV3Q2wsIFJlZiksCisJJSckZmFzdF93cml0ZScoW2luc2VydCxOZXdDbCxSZWZdKSwgbmwsICU/Pz8KKwknJHVwZGF0ZV9pbmRleGluZycoUCwgUEksIENsLCBSZWYsICdhJyksCisJZmFpbC4KK2Fzc2VydGEoXykuCisKK2Fib2xpc2goVCkgOi0gCisJJyR0ZXJtX3RvX3ByZWRpY2F0ZWluZGljYXRvcicoVCwgUDpQSSwgYWJvbGlzaChUKSksCisJJyRuZXdfaW50ZXJuYWxfZGF0YWJhc2UnKFApLAorCSckY2hlY2tfcHJvY2VkdXJlX3Blcm1pc3Npb24nKFA6UEksIG1vZGlmeSwgc3RhdGljX3Byb2NlZHVyZSwgYWJvbGlzaChUKSksCisJJyRuZXdfaW5kZXhpbmdfaGFzaCcoUCwgUEksIElIKSwKKwloYXNoX2dldChJSCwgYWxsLCBSZWZzKSwKKwklJyRmYXN0X3dyaXRlJyhbZXJhc2VfYWxsLFJlZnNdKSwgbmwsICU/Pz8KKwknJGVyYXNlX2FsbCcoUmVmcyksCisJaGFzaF9yZW1vdmUoUCwgUEkpLAorCWZhaWwuCithYm9saXNoKF8pLgorCityZXRyYWN0KENsKSA6LQorCSckY2xhdXNlX3RvX3Rlcm0nKENsLCBULCBQOlBJLCByZXRyYWN0KENsKSksCisJJyRuZXdfaW50ZXJuYWxfZGF0YWJhc2UnKFApLAorCSckY2hlY2tfcHJvY2VkdXJlX3Blcm1pc3Npb24nKFA6UEksIGFjY2Vzcywgc3RhdGljX3Byb2NlZHVyZSwgcmV0cmFjdChDbCkpLAorCVQgPSAoSCA6LSBfKSwKKwknJGNsYXVzZV9pbnRlcm5hbCcoUCwgUEksIEgsIENsMCwgUmVmKSwKKwljb3B5X3Rlcm0oQ2wwLCBUKSwKKwklJyRmYXN0X3dyaXRlJyhbZXJhc2UsQ2wwLFJlZl0pLCBubCwgJT8/PworCSckZXJhc2UnKFJlZiksCisJJyRyZWhhc2hfaW5kZXhpbmcnKFAsIFBJLCBSZWYpLgorCityZXRyYWN0YWxsKEhlYWQpIDotIAorCSckaGVhZF90b190ZXJtJyhIZWFkLCBILCBQOlBJLCByZXRyYWN0YWxsKEhlYWQpKSwKKwknJG5ld19pbnRlcm5hbF9kYXRhYmFzZScoUCksCisJJyRjaGVja19wcm9jZWR1cmVfcGVybWlzc2lvbicoUDpQSSwgYWNjZXNzLCBzdGF0aWNfcHJvY2VkdXJlLCByZXRyYWN0YWxsKEhlYWQpKSwKKwknJGNsYXVzZV9pbnRlcm5hbCcoUCwgUEksIEgsIENsLCBSZWYpLAorCWNvcHlfdGVybShDbCwgKEggOi0gXykpLAorCSUnJGZhc3Rfd3JpdGUnKFtlcmFzZSxDbCxSZWZdKSwgbmwsICU/Pz8KKwknJGVyYXNlJyhSZWYpLAorCSckcmVoYXNoX2luZGV4aW5nJyhQLCBQSSwgUmVmKSwKKwlmYWlsLgorcmV0cmFjdGFsbChfKS4KKworJSB0ZXJtIC0tPiBjbGF1c2UgKGZvciBhc3NlcnQpCisnJHRlcm1fdG9fY2xhdXNlJyhDbDAsIENsLCBQa2c6Ri9BLCBHb2FsKSA6LSAKKwknJHRlcm1fdG9fY2xhdXNlJyhDbDAsIENsLCB1c2VyLCBQa2csIEdvYWwpLAorCUNsID0gKEggOi0gXyksCisJZnVuY3RvcihILCBGLCBBKS4KKworJyR0ZXJtX3RvX2NsYXVzZScoQ2wwLCBfLCBfLCBfLCBHb2FsKSA6LSB2YXIoQ2wwKSwgISwKKwlpbGxhcmcodmFyLCBHb2FsLCAxKS4KKyckdGVybV90b19jbGF1c2UnKF8sIF8sIFBrZzAsIF8sIEdvYWwpIDotIHZhcihQa2cwKSwgISwKKwlpbGxhcmcodmFyLCBHb2FsLCAxKS4KKyckdGVybV90b19jbGF1c2UnKFA6Q2wwLCBDbCwgXywgUGtnLCBHb2FsKSA6LSAhLAorCSckdGVybV90b19jbGF1c2UnKENsMCwgQ2wsIFAsIFBrZywgR29hbCkuCisnJHRlcm1fdG9fY2xhdXNlJyhfLCBfLCBQa2cwLCBfLCBHb2FsKSA6LSBcKyhhdG9tKFBrZzApKSwgISwKKwlpbGxhcmcodHlwZShhdG9tKSwgR29hbCwgMSkuCisnJHRlcm1fdG9fY2xhdXNlJygoSDAgOi0gQjApLCAoSCA6LSBCKSwgUGtnLCBQa2csIEdvYWwpIDotICEsCisJJyR0ZXJtX3RvX2hlYWQnKEgwLCBILCBQa2csIEdvYWwpLAorCSckdGVybV90b19ib2R5JyhCMCwgQiwgUGtnLCBHb2FsKS4KKyckdGVybV90b19jbGF1c2UnKEgwLCAoSCA6LSB0cnVlKSwgUGtnLCBQa2csIEdvYWwpIDotCisJJyR0ZXJtX3RvX2hlYWQnKEgwLCBILCBQa2csIEdvYWwpLgorCisnJHRlcm1fdG9faGVhZCcoSCwgSCwgXywgXykgOi0gYXRvbShIKSwgIS4KKyckdGVybV90b19oZWFkJyhILCBILCBfLCBfKSA6LSBjb21wb3VuZChIKSwgIS4KKyckdGVybV90b19oZWFkJyhfLCBfLCBfLCBHb2FsKSA6LSAKKwlpbGxhcmcodHlwZShjYWxsYWJsZSksIEdvYWwsIDEpLgorCisnJHRlcm1fdG9fYm9keScoQjAsIEIsIFBrZywgXykgOi0gCisJJyRsb2NhbGl6ZV9ib2R5JyhCMCwgUGtnLCBCKS4KKworJyRsb2NhbGl6ZV9ib2R5JyhHLCBQLCBHMSkgOi0gdmFyKEcpLCAhLAorCSckbG9jYWxpemVfYm9keScoY2FsbChHKSwgUCwgRzEpLgorJyRsb2NhbGl6ZV9ib2R5JyhQOkcsIF8sIEcxKSA6LSAhLAorCSckbG9jYWxpemVfYm9keScoRywgUCwgRzEpLgorJyRsb2NhbGl6ZV9ib2R5JygoWCxZKSwgUCwgKFgxLFkxKSkgOi0gISwKKwknJGxvY2FsaXplX2JvZHknKFgsIFAsIFgxKSwKKwknJGxvY2FsaXplX2JvZHknKFksIFAsIFkxKS4KKyckbG9jYWxpemVfYm9keScoKFgtPlkpLCBQLCAoWDEtPlkxKSkgOi0gISwKKwknJGxvY2FsaXplX2JvZHknKFgsIFAsIFgxKSwKKwknJGxvY2FsaXplX2JvZHknKFksIFAsIFkxKS4KKyckbG9jYWxpemVfYm9keScoKFg7WSksIFAsIChYMTtZMSkpIDotICEsCisJJyRsb2NhbGl6ZV9ib2R5JyhYLCBQLCBYMSksCisJJyRsb2NhbGl6ZV9ib2R5JyhZLCBQLCBZMSkuCQorJyRsb2NhbGl6ZV9ib2R5JyhHLCBQLCBHMSkgOi0KKwlmdW5jdG9yKEcsIEYsIEEpLAorCSckYnVpbHRpbl9tZXRhX3ByZWRpY2F0ZXMnKEYsIEEsIE0pLCAlPz8/CisJISwKKwlHICA9Li4gW0Z8QXNdLAorCSckbG9jYWxpemVfYXJncycoTSwgQXMsIFAsIEFzMSksCisJRzEgPS4uIFtGfEFzMV0uCisnJGxvY2FsaXplX2JvZHknKEcsIFAsIGNhbGwoUDpHKSkgOi0gdmFyKFApLCAhLgorJyRsb2NhbGl6ZV9ib2R5JyhHLCB1c2VyLCBHKSA6LSAhLgorJyRsb2NhbGl6ZV9ib2R5JyhHLCBfLCBHKSA6LSBzeXN0ZW1fcHJlZGljYXRlKEcpLCAhLgorJyRsb2NhbGl6ZV9ib2R5JyhHLCBQLCBQOkcpLgorCisnJGxvY2FsaXplX2FyZ3MnKFtdLCBbXSwgXywgW10pIDotICEuCisnJGxvY2FsaXplX2FyZ3MnKFs6fE1zXSwgW0F8QXNdLCBQLCBbUDpBfEFzMV0pIDotCisJKHZhcihBKSA7IEEgXD0gXzpfKSwKKwkhLAorCSckbG9jYWxpemVfYXJncycoTXMsIEFzLCBQLCBBczEpLgorJyRsb2NhbGl6ZV9hcmdzJyhbX3xNc10sIFtBfEFzXSwgUCwgW0F8QXMxXSkgOi0KKwknJGxvY2FsaXplX2FyZ3MnKE1zLCBBcywgUCwgQXMxKS4KKworJyRidWlsdGluX21ldGFfcHJlZGljYXRlcycoKF4pLCAyLCBbPyw6XSkuCisnJGJ1aWx0aW5fbWV0YV9wcmVkaWNhdGVzJyhjYWxsLCAxLCBbOl0pLgorJyRidWlsdGluX21ldGFfcHJlZGljYXRlcycob25jZSwgMSwgWzpdKS4KKyckYnVpbHRpbl9tZXRhX3ByZWRpY2F0ZXMnKChcKyksIDEsIFs6XSkuCisnJGJ1aWx0aW5fbWV0YV9wcmVkaWNhdGVzJyhmaW5kYWxsLCAzLCBbPyw6LD9dKS4KKyckYnVpbHRpbl9tZXRhX3ByZWRpY2F0ZXMnKHNldG9mLCAzLCBbPyw6LD9dKS4KKyckYnVpbHRpbl9tZXRhX3ByZWRpY2F0ZXMnKGJhZ29mLCAzLCBbPyw6LD9dKS4KKyckYnVpbHRpbl9tZXRhX3ByZWRpY2F0ZXMnKG9uX2V4Y2VwdGlvbiwgMywgWz8sOiw6XSkuCisnJGJ1aWx0aW5fbWV0YV9wcmVkaWNhdGVzJyhjYXRjaCwgMywgWzosPyw6XSkuCisnJGJ1aWx0aW5fbWV0YV9wcmVkaWNhdGVzJyhzeW5jaHJvbml6ZWQsIDIsIFs/LDpdKS4KKyckYnVpbHRpbl9tZXRhX3ByZWRpY2F0ZXMnKGZyZWV6ZSwgMiwgWz8sOl0pLgorCislIGNsYXVzZSAtLT4gdGVybSAoZm9yIHJldHJhY3QpCisnJGNsYXVzZV90b190ZXJtJyhDbCwgVCwgUGtnOkYvQSwgR29hbCkgOi0gCisJJyRjbGF1c2VfdG9fdGVybScoQ2wsIFQsIHVzZXIsIFBrZywgR29hbCksCisJVCA9IChIIDotIF8pLAorCWZ1bmN0b3IoSCwgRiwgQSkuCisKKyckY2xhdXNlX3RvX3Rlcm0nKENsLCBfLCBfLCBfLCBHb2FsKSA6LSB2YXIoQ2wpLCAhLAorCWlsbGFyZyh2YXIsIEdvYWwsIDEpLgorJyRjbGF1c2VfdG9fdGVybScoXywgXywgUGtnLCBfLCBHb2FsKSA6LSB2YXIoUGtnKSwgISwKKwlpbGxhcmcodmFyLCBHb2FsLCAxKS4KKyckY2xhdXNlX3RvX3Rlcm0nKFA6Q2wsIFQsIF8sIFBrZywgR29hbCkgOi0gISwKKwknJGNsYXVzZV90b190ZXJtJyhDbCwgVCwgUCwgUGtnLCBHb2FsKS4KKyckY2xhdXNlX3RvX3Rlcm0nKF8sIF8sIFBrZywgXywgR29hbCkgOi0gXCsoYXRvbShQa2cpKSwgISwKKwlpbGxhcmcodHlwZShhdG9tKSwgR29hbCwgMSkuCisnJGNsYXVzZV90b190ZXJtJygoSDAgOi0gQiksIChIIDotIEIpLCBQa2csIFBrZywgR29hbCkgOi0gISwKKwknJGhlYWRfdG9fdGVybScoSDAsIEgsIF8sIEdvYWwpLgorCSUnJGJvZHlfdG9fdGVybScoQjAsIEIsIEdvYWwpLgorJyRjbGF1c2VfdG9fdGVybScoSDAsIChIIDotIHRydWUpLCBQa2csIFBrZywgR29hbCkgOi0KKwknJGhlYWRfdG9fdGVybScoSDAsIEgsIF8sIEdvYWwpLgorCislIHRlcm0gLS0+IHByZWRpY2F0ZSBpbmRpY2F0b3IgKGZvciBhYm9saXNoKQorJyR0ZXJtX3RvX3ByZWRpY2F0ZWluZGljYXRvcicoVCwgUGtnOlBJLCBHb2FsKSA6LSAKKwknJHRlcm1fdG9fcHJlZGljYXRlaW5kaWNhdG9yJyhULCBQSSwgdXNlciwgUGtnLCBHb2FsKS4KKworJyR0ZXJtX3RvX3ByZWRpY2F0ZWluZGljYXRvcicoVCwgXywgXywgXywgR29hbCkgOi0gdmFyKFQpLCAhLAorCWlsbGFyZyh2YXIsIEdvYWwsIDEpLgorJyR0ZXJtX3RvX3ByZWRpY2F0ZWluZGljYXRvcicoXywgXywgUGtnLCBfLCBHb2FsKSA6LSB2YXIoUGtnKSwgISwKKwlpbGxhcmcodmFyLCBHb2FsLCAxKS4KKyckdGVybV90b19wcmVkaWNhdGVpbmRpY2F0b3InKFA6VCwgUEksIF8sIFBrZywgR29hbCkgOi0gISwKKwknJHRlcm1fdG9fcHJlZGljYXRlaW5kaWNhdG9yJyhULCBQSSwgUCwgUGtnLCBHb2FsKS4KKyckdGVybV90b19wcmVkaWNhdGVpbmRpY2F0b3InKFQsIF8sIF8sIF8sIEdvYWwpIDotIFQgXD0gXy9fLCAhLAorCWlsbGFyZyh0eXBlKCdwcmVkaWNhdGVfaW5kaWNhdG9yJyksIEdvYWwsIDEpLgorJyR0ZXJtX3RvX3ByZWRpY2F0ZWluZGljYXRvcicoRi9fLCBfLCBfLCBfLCBHb2FsKSA6LSBcKyBhdG9tKEYpLCAhLAorCWlsbGFyZyh0eXBlKGF0b20pLCBHb2FsLCAxKS4KKyckdGVybV90b19wcmVkaWNhdGVpbmRpY2F0b3InKF8vQSwgXywgXywgXywgR29hbCkgOi0gXCsgaW50ZWdlcihBKSwgISwKKwlpbGxhcmcodHlwZShpbnRlZ2VyKSwgR29hbCwgMSkuCisnJHRlcm1fdG9fcHJlZGljYXRlaW5kaWNhdG9yJyhULCBULCBQa2csIFBrZywgXykuCisKKyckdXBkYXRlX2luZGV4aW5nJyhQLCBQSSwgQ2wsIFJlZiwgQV9vcl9aKSA6LQorCSckbmV3X2luZGV4aW5nX2hhc2gnKFAsIFBJLCBJSCksCisJJyRnZW5faW5kZXhpbmdfa2V5cycoQ2wsIElILCBLZXlzKSwKKwklJyRmYXN0X3dyaXRlJyhbdXBkYXRlX2luZGV4aW5nLFAsUEksQ2wsUmVmLEtleXNdKSwgbmwsICU/Pz8KKwknJHVwZGF0ZV9pbmRleGluZ19oYXNoJyhBX29yX1osIEtleXMsIElILCBSZWYpLgorCisnJGdlbl9pbmRleGluZ19rZXlzJygoSCA6LSBfKSwgXywgW2FsbF0pIDotIGF0b20oSCksICEuCisnJGdlbl9pbmRleGluZ19rZXlzJygoSCA6LSBfKSwgSVQsIEtleXMpIDotIAorCWFyZygxLCBILCBBMSksIAorCSckZ2VuX2luZGV4aW5nX2tleXMwJyhBMSwgSVQsIEtleXMpLgorCisnJGdlbl9pbmRleGluZ19rZXlzMCcoQTEsIElULCAgICAgIEtleXMpIDotIHZhcihBMSksICEsIGhhc2hfa2V5cyhJVCwgS2V5cykuCisnJGdlbl9pbmRleGluZ19rZXlzMCcoQTEsICBfLCBbYWxsLGxpc10pIDotIEExID0gW198X10sICEuCisnJGdlbl9pbmRleGluZ19rZXlzMCcoQTEsICBfLCBbYWxsLHN0cl0pIDotIGNvbXBvdW5kKEExKSwgIS4KKyckZ2VuX2luZGV4aW5nX2tleXMwJyhBMSwgSVQsIFthbGwsS2V5XSkgOi0gZ3JvdW5kKEExKSwgICEsCisJJyR0ZXJtX2hhc2gnKEExLCBLZXkpLCAlIGdldCB0aGUgaGFzaCBjb2RlIG9mIEExCisJKCAgICBoYXNoX2NvbnRhaW5zX2tleShJVCwgS2V5KSAtPiB0cnVlCisgICAgICAgICAgICAgOworICAgICAgICAgICAgIGhhc2hfZ2V0KElULCB2YXIsIEwpLCBoYXNoX3B1dChJVCwgS2V5LCBMKQorICAgICAgICApLgorJyRnZW5faW5kZXhpbmdfa2V5czAnKEExLCBJVCwgS2V5cykgOi0gCisJaWxsYXJnKHR5cGUodGVybSksICckZ2VuX2luZGV4aW5nX2tleXMwJyhBMSxJVCxLZXlzKSwgMSkuCisKKyckdXBkYXRlX2luZGV4aW5nX2hhc2gnKGEsIEtleXMsIElILCBSZWYpIDotICEsICckaGFzaF9hZGR6X2FsbCcoS2V5cywgSUgsIFJlZikuCisnJHVwZGF0ZV9pbmRleGluZ19oYXNoJyh6LCBLZXlzLCBJSCwgUmVmKSA6LSAhLCAnJGhhc2hfYWRkYV9hbGwnKEtleXMsIElILCBSZWYpLgorCisnJGhhc2hfYWRkYV9hbGwnKFtdLCBfLCBfKSA6LSAhLgorJyRoYXNoX2FkZGFfYWxsJyhbS3xLc10sIEgsIFgpIDotIAorCSckaGFzaF9hZGRhJyhILCBLLCBYKSwgCisJJyRoYXNoX2FkZGFfYWxsJyhLcywgSCwgWCkuCisKKyckaGFzaF9hZGR6X2FsbCcoW10sIF8sIF8pIDotICEuCisnJGhhc2hfYWRkel9hbGwnKFtLfEtzXSwgSCwgWCkgOi0KKwknJGhhc2hfYWRkeicoSCwgSywgWCksCisJJyRoYXNoX2FkZHpfYWxsJyhLcywgSCwgWCkuCisKKyckZXJhc2VfYWxsJyhbXSkgOi0gIS4KKyckZXJhc2VfYWxsJyhbUnxSc10pIDotICckZXJhc2UnKFIpLCAnJGVyYXNlX2FsbCcoUnMpLgorCisnJHJlaGFzaF9pbmRleGluZycoUCwgUEksIFJlZikgOi0KKwknJG5ld19pbmRleGluZ19oYXNoJyhQLCBQSSwgSUgpLAorCWhhc2hfa2V5cyhJSCwgS2V5cyksCisJJSckZmFzdF93cml0ZScoW3JlaGFzaF9pbmRleGluZyxQLFBJLEtleXNdKSwgbmwsICU/Pz8KKwknJHJlbW92ZV9pbmRleF9hbGwnKEtleXMsIElILCBSZWYpLgorCisnJHJlbW92ZV9pbmRleF9hbGwnKFtdLCBfLCBfKSA6LSAhLgorJyRyZW1vdmVfaW5kZXhfYWxsJyhbS3xLc10sIElILCBSZWYpIDotCisJJyRoYXNoX3JlbW92ZV9maXJzdCcoSUgsIEssIFJlZiksCisJJyRyZW1vdmVfaW5kZXhfYWxsJyhLcywgSUgsIFJlZikuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUgQWxsIHNvbHV0aW9ucworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorOi0gcHVibGljIGZpbmRhbGwvMy4KKzotIHB1YmxpYyBiYWdvZi8zLgorOi0gcHVibGljIHNldG9mLzMuCisKKyUgZmluZGFsbC8zCitmaW5kYWxsKFRlbXBsYXRlLCBHb2FsLCBJbnN0YW5jZXMpIDotIGNhbGxhYmxlKEdvYWwpLCAhLAorCW5ld19oYXNoKEgpLAorCSckZmluZGFsbCcoSCwgVGVtcGxhdGUsIEdvYWwsIEluc3RhbmNlcykuCitmaW5kYWxsKFRlbXBsYXRlLCBHb2FsLCBJbnN0YW5jZXMpIDotIAorCWlsbGFyZyh0eXBlKGNhbGxhYmxlKSwgZmluZGFsbChUZW1wbGF0ZSxHb2FsLEluc3RhbmNlcyksIDIpLgorCisnJGZpbmRhbGwnKEgsIFRlbXBsYXRlLCBHb2FsLCBfKSA6LQorCWNhbGwoR29hbCksIAorCWNvcHlfdGVybShUZW1wbGF0ZSwgQ1QpLAorCSckaGFzaF9hZGRhJyhILCAnJEZJTkRBTEwnLCBDVCksCisJZmFpbC4KKyckZmluZGFsbCcoSCwgXywgXywgSW5zdGFuY2VzKSA6LQorCWhhc2hfZ2V0KEgsICckRklOREFMTCcsIFZzKSwKKwknJGJ1aWx0aW5fcmV2ZXJzZScoVnMsIEluc3RhbmNlcykuCisKKyUgYmFnb2YvMyAmIHNldG9mLzMKK2JhZ29mKFRlbXBsYXRlLCBHb2FsLCBJbnN0YW5jZXMpIDotIGNhbGxhYmxlKEdvYWwpLCAhLAkKKwknJGJhZ29mJyhUZW1wbGF0ZSwgR29hbCwgSW5zdGFuY2VzKS4KK2JhZ29mKFRlbXBsYXRlLCBHb2FsLCBJbnN0YW5jZXMpIDotIAorCWlsbGFyZyh0eXBlKGNhbGxhYmxlKSwgYmFnb2YoVGVtcGxhdGUsR29hbCxJbnN0YW5jZXMpLCAyKS4KKworc2V0b2YoVGVtcGxhdGUsIEdvYWwsIEluc3RhbmNlcykgOi0gY2FsbGFibGUoR29hbCksICEsCQorCSckYmFnb2YnKFRlbXBsYXRlLCBHb2FsLCBJbnN0YW5jZXMwKSwKKwlzb3J0KEluc3RhbmNlczAsIEluc3RhbmNlcykuCitzZXRvZihUZW1wbGF0ZSwgR29hbCwgSW5zdGFuY2VzKSA6LSAKKwlpbGxhcmcodHlwZShjYWxsYWJsZSksIHNldG9mKFRlbXBsYXRlLEdvYWwsSW5zdGFuY2VzKSwgMikuCisKKyckYmFnb2YnKFRlbXBsYXRlLCBHb2FsLCBJbnN0YW5jZXMpIDotIAorCSckZnJlZV92YXJpYWJsZXNfc2V0JyhHb2FsLCBUZW1wbGF0ZSwgRlYpLAorCSV3cml0ZSgnR29hbCA9ICcpLCB3cml0ZShHb2FsKSwgbmwsCisJJXdyaXRlKCdGcmVlIHZhcmlhYmxlcyBzZXQgPSAnKSwgd3JpdGUoRlYpLCBubCwKKwlGViBcPT0gW10sCisJISwKKwlXaXRuZXNzID0uLiBbJyR3aXRuZXNzJ3xGVl0sCisJZmluZGFsbChXaXRuZXNzK1RlbXBsYXRlLCBHb2FsLCBTKSwKKwknJGJhZ29mX2luc3RhbmNlcycoUywgV2l0bmVzcywgSW5zdGFuY2VzMCksCisJSW5zdGFuY2VzID0gSW5zdGFuY2VzMC4KKyckYmFnb2YnKFRlbXBsYXRlLCBHb2FsLCBJbnN0YW5jZXMpIDotIAorCWZpbmRhbGwoVGVtcGxhdGUsIEdvYWwsIEluc3RhbmNlcyksCisJSW5zdGFuY2VzIFw9PSBbXS4KKworJyRiYWdvZl9pbnN0YW5jZXMnKFtdLCBfV2l0bmVzcywgX0luc3RhbmNlcykgOi0gZmFpbC4KKyckYmFnb2ZfaW5zdGFuY2VzJyhTMCwgV2l0bmVzcywgSW5zdGFuY2VzKSA6LQorCVMwID0gW1crVHxTXSwKKwknJHZhcmlhbnRzX3N1YnNldCcoUywgVywgV1RfbGlzdCwgVF9saXN0LCBTX25leHQpLAorCSckYmFnb2ZfaW5zdGFuY2VzMCcoU19uZXh0LCBXaXRuZXNzLCBJbnN0YW5jZXMsIFtXK1R8V1RfbGlzdF0sIFtUfFRfbGlzdF0pLgorCisnJGJhZ29mX2luc3RhbmNlczAnKF8sIFdpdG5lc3MsIEluc3RhbmNlcywgV1RfbGlzdCwgVF9saXN0KSA6LQorCSckdW5pZnlfd2l0bmVzcycoV1RfbGlzdCwgV2l0bmVzcyksCisJSW5zdGFuY2VzID0gVF9saXN0LgorJyRiYWdvZl9pbnN0YW5jZXMwJyhTX25leHQsIFdpdG5lc3MsIEluc3RhbmNlcywgXywgXykgOi0KKwknJGJhZ29mX2luc3RhbmNlcycoU19uZXh0LCBXaXRuZXNzLCBJbnN0YW5jZXMpLgorCisnJHZhcmlhbnRzX3N1YnNldCcoW10sIF9XLCBbXSwgW10sIFtdKSA6LSAhLgorJyR2YXJpYW50c19zdWJzZXQnKFtXMCtUMHxTXSwgVywgW1cwK1QwfFdUX2xpc3RdLCBbVDB8VF9saXN0XSwgU19uZXh0KSA6LQorCSckdGVybV92YXJpYW50JyhXLCBXMCksCisJISwKKwknJHZhcmlhbnRzX3N1YnNldCcoUywgVywgV1RfbGlzdCwgVF9saXN0LCBTX25leHQpLgorJyR2YXJpYW50c19zdWJzZXQnKFtXVHxTXSwgVywgV1RfbGlzdCwgVF9saXN0LCBbV1R8U19uZXh0XSkgOi0KKwknJHZhcmlhbnRzX3N1YnNldCcoUywgVywgV1RfbGlzdCwgVF9saXN0LCBTX25leHQpLgorCisnJHRlcm1fdmFyaWFudCcoWCwgWSkgOi0gbmV3X2hhc2goSGFzaCksICckdGVybV92YXJpYW50JyhYLCBZLCBIYXNoKS4KKworJyR0ZXJtX3ZhcmlhbnQnKFgsIFksIEhhc2gpIDotIHZhcihYKSwgISwKKwkoICAgaGFzaF9jb250YWluc19rZXkoSGFzaCwgWCkgLT4KKwkgICAgaGFzaF9nZXQoSGFzaCwgWCwgViksIFkgPT0gVgorCSAgICA7CisJICAgIHZhcihZKSwgaGFzaF9wdXQoSGFzaCwgWCwgWSkKKwkpLgorJyR0ZXJtX3ZhcmlhbnQnKFgsIFksIF8pIDotIGdyb3VuZChYKSwgISwKKwlYID09IFkuCisnJHRlcm1fdmFyaWFudCcoXywgWSwgXykgOi0gdmFyKFkpLCAhLAorCWZhaWwuCisnJHRlcm1fdmFyaWFudCcoW1h8WHNdLCBbWXxZc10sIEhhc2gpIDotICEsCisJJyR0ZXJtX3ZhcmlhbnQnKFgsIFksIEhhc2gpLAorCSckdGVybV92YXJpYW50JyhYcywgWXMsIEhhc2gpLgorJyR0ZXJtX3ZhcmlhbnQnKFgsIFksIEhhc2gpIDotIAorCVggPS4uIFhzLAorCVkgPS4uIFlzLAorCSckdGVybV92YXJpYW50JyhYcywgWXMsIEhhc2gpLgorCisnJHVuaWZ5X3dpdG5lc3MnKFtdLCBfKSA6LSAhLgorJyR1bmlmeV93aXRuZXNzJyhbVytffFdUX2xpc3RdLCBXKSA6LQorCSckdW5pZnlfd2l0bmVzcycoV1RfbGlzdCwgVykuCisKKyUgVmFyaWFibGUgc2V0IG9mIGEgdGVybQorJyR2YXJpYWJsZXNfc2V0JyhYLCBWcykgOi0gJyR2YXJpYWJsZXNfc2V0JyhYLCBbXSwgVnMpLgorCisnJHZhcmlhYmxlc19zZXQnKFgsIFZzLCBWcyAgICAgICkgOi0gdmFyKFgpLCAnJGJ1aWx0aW5fbWVtcScoWCwgVnMpLCAhLgorJyR2YXJpYWJsZXNfc2V0JyhYLCBWcywgW1h8VnNdICApIDotIHZhcihYKSwgIS4KKyckdmFyaWFibGVzX3NldCcoWCwgVnMwLCBWczAgICAgKSA6LSBhdG9taWMoWCksICEuCisnJHZhcmlhYmxlc19zZXQnKFtYfFhzXSwgVnMwLCBWcykgOi0gISwgCisJJyR2YXJpYWJsZXNfc2V0JyhYLCBWczAsIFZzMSksIAorCSckdmFyaWFibGVzX3NldCcoWHMsIFZzMSwgVnMpLgorJyR2YXJpYWJsZXNfc2V0JyhYLCBWczAsIFZzICAgICApIDotIAorCVggPS4uIFhzLCAKKwknJHZhcmlhYmxlc19zZXQnKFhzLCBWczAsIFZzKS4KKworJyRidWlsdGluX21lbXEnKFgsIFtZfF9dKSAgOi0gWD09WSwgIS4KKyckYnVpbHRpbl9tZW1xJyhYLCBbX3xZc10pIDotICckYnVpbHRpbl9tZW1xJyhYLCBZcykuCisKKyUgRXhpc3RlbnRpYWwgdmFyaWFibGVzIHNldCBvZiBhIHRlcm0KKyckZXhpc3RlbnRpYWxfdmFyaWFibGVzX3NldCcoWCwgVnMpIDotIAorCSckZXhpc3RlbnRpYWxfdmFyaWFibGVzX3NldCcoWCwgW10sIFZzKS4KKworJyRleGlzdGVudGlhbF92YXJpYWJsZXNfc2V0JyhYLCBWcywgVnMpIDotIHZhcihYKSwgIS4KKyckZXhpc3RlbnRpYWxfdmFyaWFibGVzX3NldCcoWCwgVnMsIFZzKSA6LSBhdG9taWMoWCksICEuCisnJGV4aXN0ZW50aWFsX3ZhcmlhYmxlc19zZXQnKF86WCwgVnMwLCBWcykgOi0gISwKKwknJGV4aXN0ZW50aWFsX3ZhcmlhYmxlc19zZXQnKFgsIFZzMCwgVnMpLgorJSckZXhpc3RlbnRpYWxfdmFyaWFibGVzX3NldCcoKFg7WSksIFZzMCwgVnMpIDotICEsCislCSckZXhpc3RlbnRpYWxfdmFyaWFibGVzX3NldCcoWCwgVnMwLCBWczEpLAorJQknJGV4aXN0ZW50aWFsX3ZhcmlhYmxlc19zZXQnKFksIFZzMSwgVnMpLgorJSckZXhpc3RlbnRpYWxfdmFyaWFibGVzX3NldCcoKFgtPlkpLCBWczAsIFZzKSA6LSAhLAorJQknJGV4aXN0ZW50aWFsX3ZhcmlhYmxlc19zZXQnKFgsIFZzMCwgVnMxKSwKKyUJJyRleGlzdGVudGlhbF92YXJpYWJsZXNfc2V0JyhZLCBWczEsIFZzKS4KKyUnJGV4aXN0ZW50aWFsX3ZhcmlhYmxlc19zZXQnKChYLFkpLCBWczAsIFZzKSA6LSAhLAkKKyUJJyRleGlzdGVudGlhbF92YXJpYWJsZXNfc2V0JyhYLCBWczAsIFZzMSksCislCSckZXhpc3RlbnRpYWxfdmFyaWFibGVzX3NldCcoWSwgVnMxLCBWcykuCisnJGV4aXN0ZW50aWFsX3ZhcmlhYmxlc19zZXQnKF4oVixHKSwgVnMwLCBWcykgOi0gISwKKwknJHZhcmlhYmxlc19zZXQnKFYsIFZzMCwgVnMxKSwKKwknJGV4aXN0ZW50aWFsX3ZhcmlhYmxlc19zZXQnKEcsIFZzMSwgVnMpLgorJyRleGlzdGVudGlhbF92YXJpYWJsZXNfc2V0JygnJG1ldGFfY2FsbCcoRyxfLF8sXyxfKSwgVnMwLCBWcykgOi0gISwgJT8/PworCSckZXhpc3RlbnRpYWxfdmFyaWFibGVzX3NldCcoRywgVnMwLCBWcykuCisnJGV4aXN0ZW50aWFsX3ZhcmlhYmxlc19zZXQnKF8sIFZzLCBWcykuCisKKyUgRnJlZSB2YXJpYWJsZXMgc2V0IG9mIGEgdGVybQorJyRmcmVlX3ZhcmlhYmxlc19zZXQnKFQsIFYsIEZWKSA6LSAKKwknJHZhcmlhYmxlc19zZXQnKFQsIFRWKSwKKwknJHZhcmlhYmxlc19zZXQnKFYsIFZWKSwKKwknJGV4aXN0ZW50aWFsX3ZhcmlhYmxlc19zZXQnKFQsIFZWLCBCViksCisJJyRidWlsdGluX3NldF9kaWZmJyhUViwgQlYsIEZWKSwKKwkhLgorCisnJGJ1aWx0aW5fc2V0X2RpZmYnKEwxLCBMMiwgTCkgOi0KKwlzb3J0KEwxLCBTTDEpLAorCXNvcnQoTDIsIFNMMiksCisJJyRidWlsdGluX3NldF9kaWZmMCcoU0wxLCBTTDIsIEwpLgorCisnJGJ1aWx0aW5fc2V0X2RpZmYwJyhbXSwgXywgW10pIDotICEuCisnJGJ1aWx0aW5fc2V0X2RpZmYwJyhMMSwgW10sIEwxKSA6LSAhLgorJyRidWlsdGluX3NldF9kaWZmMCcoW1h8WHNdLCBbWXxZc10sIEwpIDotIFggPT0gWSwgISwKKwknJGJ1aWx0aW5fc2V0X2RpZmYwJyhYcywgWXMsIEwpLgorJyRidWlsdGluX3NldF9kaWZmMCcoW1h8WHNdLCBbWXxZc10sIFtYfExdKSA6LSBYIEA8IFksICEsCisJJyRidWlsdGluX3NldF9kaWZmMCcoWHMsIFtZfFlzXSwgTCkuCisnJGJ1aWx0aW5fc2V0X2RpZmYwJyhbWHxYc10sIFtZfFlzXSwgW1l8TF0pIDotIAorCSckYnVpbHRpbl9zZXRfZGlmZjAnKFtYfFhzXSwgWXMsIFtZfExdKS4KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSBTdHJlYW0gc2VsZWN0aW9uIGFuZCBjb250cm9sCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCislOi0gcHVibGljIGN1cnJlbnRfaW5wdXQvMSAgKHdyaXR0ZW4gaW4gSmF2YSkKKyU6LSBwdWJsaWMgY3VycmVudF9vdXRwdXQvMSAod3JpdHRlbiBpbiBKYXZhKQorJTotIHB1YmxpYyBzZXRfaW5wdXQvMSwgc2V0X291dHB1dC8xLiAod3JpdHRlbiBpbiBKYXZhKQorJTotIHB1YmxpYyBvcGVuLzQgKHdyaXR0ZW4gaW4gSmF2YSkKKzotIHB1YmxpYyBvcGVuLzMuCislOi0gcHVibGljIGNsb3NlLzIgKHdyaXR0ZW4gaW4gSmF2YSkKKzotIHB1YmxpYyBjbG9zZS8xLgorJTotIHB1YmxpYyBmbHVzaF9vdXRwdXQvMS4od3JpdHRlbiBpbiBKYXZhKQorOi0gcHVibGljIGZsdXNoX291dHB1dC8wLgorOi0gcHVibGljIHN0cmVhbV9wcm9wZXJ0eS8yLgorCitvcGVuKFNvdXJjZV9zaW5rLCBNb2RlLCBTdHJlYW0pIDotIG9wZW4oU291cmNlX3NpbmssIE1vZGUsIFN0cmVhbSwgW10pLgorCitjbG9zZShTX29yX2EpIDotIGNsb3NlKFNfb3JfYSwgW10pLgorCitmbHVzaF9vdXRwdXQgOi0gCisgICAgY3VycmVudF9vdXRwdXQoUyksCisgICAgZmx1c2hfb3V0cHV0KFMpLgorCitzdHJlYW1fcHJvcGVydHkoU3RyZWFtLCBTdHJlYW1fcHJvcGVydHkpIDotIAorCXZhcihTdHJlYW1fcHJvcGVydHkpLCAKKwkhLAorCSckc3RyZWFtX3Byb3BlcnR5JyhTdHJlYW0sIFN0cmVhbV9wcm9wZXJ0eSkuCitzdHJlYW1fcHJvcGVydHkoU3RyZWFtLCBTdHJlYW1fcHJvcGVydHkpIDotIAorCSckc3RyZWFtX3Byb3BlcnR5X3NwZWNpZmllcicoU3RyZWFtX3Byb3BlcnR5KSwgCisJISwKKwknJHN0cmVhbV9wcm9wZXJ0eScoU3RyZWFtLCBTdHJlYW1fcHJvcGVydHkpLgorc3RyZWFtX3Byb3BlcnR5KFN0cmVhbSwgU3RyZWFtX3Byb3BlcnR5KSA6LSAKKwlpbGxhcmcoZG9tYWluKHRlcm0sc3RyZWFtX3Byb2VwcnR5KSwgc3RyZWFtX3Byb3BlcnR5KFN0cmVhbSwgU3RyZWFtX3Byb3BlcnR5KSwgMikuCisKKyckc3RyZWFtX3Byb3BlcnR5JyhTdHJlYW0sIFN0cmVhbV9wcm9wZXJ0eSkgOi0gCisJdmFyKFN0cmVhbSksCisJISwKKwknJGdldF9zdHJlYW1fbWFuYWdlcicoU00pLAorCWhhc2hfbWFwKFNNLCBNYXApLAorCSckYnVpbHRpbl9tZW1iZXInKChTdHJlYW0sVnMpLCBNYXApLAorCWphdmEoU3RyZWFtKSwKKwknJGJ1aWx0aW5fbWVtYmVyJyhTdHJlYW1fcHJvcGVydHksIFZzKS4KKyckc3RyZWFtX3Byb3BlcnR5JyhTdHJlYW0sIFN0cmVhbV9wcm9wZXJ0eSkgOi0gCisJamF2YShTdHJlYW0pLAorCSEsCisJJyRnZXRfc3RyZWFtX21hbmFnZXInKFNNKSwKKwloYXNoX2dldChTTSwgU3RyZWFtLCBWcyksCisJJyRidWlsdGluX21lbWJlcicoU3RyZWFtX3Byb3BlcnR5LCBWcykuCisnJHN0cmVhbV9wcm9wZXJ0eScoU3RyZWFtLCBTdHJlYW1fcHJvcGVydHkpIDotIAorCWlsbGFyZyhkb21haW4oc3RyZWFtLHN0cmVhbSksIHN0cmVhbV9wcm9wZXJ0eShTdHJlYW0sIFN0cmVhbV9wcm9wZXJ0eSksIDEpLgorCisnJHN0cmVhbV9wcm9wZXJ0eV9zcGVjaWZpZXInKGlucHV0KS4KKyckc3RyZWFtX3Byb3BlcnR5X3NwZWNpZmllcicob3V0cHV0KS4KKyckc3RyZWFtX3Byb3BlcnR5X3NwZWNpZmllcicoYWxpYXMoXykpLgorJyRzdHJlYW1fcHJvcGVydHlfc3BlY2lmaWVyJyhtb2RlKF8pKS4KKyckc3RyZWFtX3Byb3BlcnR5X3NwZWNpZmllcicodHlwZShfKSkuCisnJHN0cmVhbV9wcm9wZXJ0eV9zcGVjaWZpZXInKGZpbGVfbmFtZShfKSkuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUgQ2hhcmFjdGVyIGlucHV0L291dHB1dAorJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJTotIHB1YmxpYyBnZXRfY2hhci8yLCBnZXRfY29kZS8yLiAgICh3cml0dGVuIGluIEphdmEpCislOi0gcHVibGljIHBlZWtfY2hhci8yLCBwZWVrX2NvZGUvMi4gKHdyaXR0ZW4gaW4gSmF2YSkKKyU6LSBwdWJsaWMgcHV0X2NoYXIvMiwgcHV0X2NvZGUvMi4gICAod3JpdHRlbiBpbiBKYXZhKQorJTotIHB1YmxpYyBubC8wLiAgICAgICAgICAgICAgICAgICAgICh3cml0dGVuIGluIEphdmEpCisKKzotIHB1YmxpYyBnZXRfY2hhci8xLCBnZXRfY29kZS8xLgorOi0gcHVibGljIHBlZWtfY2hhci8xLCBwZWVrX2NvZGUvMS4KKzotIHB1YmxpYyBwdXRfY2hhci8xLCBwdXRfY29kZS8xLgorOi0gcHVibGljIG5sLzEuCisKK2dldF9jaGFyKENoYXIpICA6LSBjdXJyZW50X2lucHV0KFMpLCBnZXRfY2hhcihTLCBDaGFyKS4KK2dldF9jb2RlKENvZGUpICA6LSBjdXJyZW50X2lucHV0KFMpLCBnZXRfY29kZShTLCBDb2RlKS4KKworcGVla19jaGFyKENoYXIpIDotIGN1cnJlbnRfaW5wdXQoUyksIHBlZWtfY2hhcihTLCBDaGFyKS4KK3BlZWtfY29kZShDb2RlKSA6LSBjdXJyZW50X2lucHV0KFMpLCBwZWVrX2NvZGUoUywgQ29kZSkuCisKK3B1dF9jaGFyKENoYXIpICA6LSBjdXJyZW50X291dHB1dChTKSwgcHV0X2NoYXIoUywgQ2hhcikuCitwdXRfY29kZShDb2RlKSAgOi0gY3VycmVudF9vdXRwdXQoUyksIHB1dF9jb2RlKFMsIENvZGUpLgorCitubChTKSA6LSBwdXRfY2hhcihTLCAnXG4nKS4KKworOi0gcHVibGljIGdldDAvMSwgZ2V0MC8yLgorOi0gcHVibGljIGdldC8xLgorJTotIHB1YmxpYyBnZXQvMi4gICh3cml0dGVuIGluIEphdmEpCis6LSBwdWJsaWMgcHV0LzEsIHB1dC8yLgorOi0gcHVibGljIHRhYi8xLgorJTotIHB1YmxpYyB0YWIvMi4gICh3cml0dGVuIGluIEphdmEpCis6LSBwdWJsaWMgc2tpcC8xLgorJTotIHB1YmxpYyBza2lwLzIuICh3cml0dGVuIGluIEphdmEpCisKK2dldDAoQ29kZSkgIDotIGN1cnJlbnRfaW5wdXQoUyksIGdldF9jb2RlKFMsIENvZGUpLgorZ2V0MChTX29yX2EsIENvZGUpICA6LSBnZXRfY29kZShTX29yX2EsIENvZGUpLgorCitnZXQoQ29kZSkgIDotIGN1cnJlbnRfaW5wdXQoUyksIGdldChTLCBDb2RlKS4KKworcHV0KEV4cCkgIDotIGN1cnJlbnRfb3V0cHV0KFMpLCBwdXQoUywgRXhwKS4KK3B1dChTX29yX2EsIEV4cCkgIDotIENvZGUgaXMgRXhwLCBwdXRfY29kZShTX29yX2EsIENvZGUpLgorCit0YWIoTikgOi0gY3VycmVudF9vdXRwdXQoUyksIHRhYihTLCBOKS4KKworc2tpcChOKSA6LSBjdXJyZW50X2lucHV0KFMpLCBza2lwKFMsIE4pLgorCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCislIEJ5dGUgaW5wdXQvb3V0cHV0CislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCis6LSBwdWJsaWMgZ2V0X2J5dGUvMSwgcGVla19ieXRlLzEsIHB1dF9ieXRlLzEuCislOi0gcHVibGljIGdldF9ieXRlLzIuICAlIHdyaXR0ZW4gaW4gamF2YQorJTotIHB1YmxpYyBwZWVrX2J5dGUvMi4gJSB3cml0dGVuIGluIGphdmEKKyU6LSBwdWJsaWMgcHV0X2J5dGUvMi4gICUgd3JpdHRlbiBpbiBqYXZhCisKK2dldF9ieXRlKEJ5dGUpIDotCisgICAgY3VycmVudF9pbnB1dChTKSwKKyAgICBnZXRfYnl0ZShTLCBCeXRlKS4KKworcGVla19ieXRlKEJ5dGUpIDotCisgICAgY3VycmVudF9pbnB1dChTKSwKKyAgICBwZWVrX2J5dGUoUywgQnl0ZSkuCisKK3B1dF9ieXRlKEJ5dGUpIDotCisgICAgY3VycmVudF9vdXRwdXQoUyksCisgICAgcHV0X2J5dGUoUywgQnl0ZSkuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUgVGVybSBpbnB1dC9vdXRwdXQgKHJlYWQpCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCis6LSBwdWJsaWMgcmVhZC8xLCByZWFkLzIuCis6LSBwdWJsaWMgcmVhZF93aXRoX3ZhcmlhYmxlcy8yLCByZWFkX3dpdGhfdmFyaWFibGVzLzMuCis6LSBwdWJsaWMgcmVhZF9saW5lLzEuCislOi0gcHVibGljIHJlYWRfbGluZS8yLiAod3JpdHRlbiBpbiBKYXZhKQorOi0gZHluYW1pYyAnJHRva2VucycvMS4gCisKK3JlYWQoWCkgOi0gY3VycmVudF9pbnB1dChTKSwgcmVhZChTLCBYKS4KKworcmVhZChTX29yX2EsIFgpIDotCisJcmVhZF90b2tlbnMoU19vcl9hLCBUb2tlbnMsIF8pLAorCXBhcnNlX3Rva2VucyhYLCBUb2tlbnMpLAorCSEuCisKK3JlYWRfd2l0aF92YXJpYWJsZXMoWCwgVnMpIDotIAorCWN1cnJlbnRfaW5wdXQoUyksIAorCXJlYWRfd2l0aF92YXJpYWJsZXMoUywgWCwgVnMpLgorCityZWFkX3dpdGhfdmFyaWFibGVzKFNfb3JfYSwgWCwgVnMpIDotCisJcmVhZF90b2tlbnMoU19vcl9hLCBUb2tlbnMsIFZzKSwKKwlwYXJzZV90b2tlbnMoWCwgVG9rZW5zKSwKKwkhLgorCityZWFkX2xpbmUoWCkgOi0gY3VycmVudF9pbnB1dChTKSwgcmVhZF9saW5lKFMsIFgpLgorCislIHJlYWRfdG9rZW4oU19vcl9hLCBUb2tlbikgcmVhZHMgb25lIHRva2VuIGZyb20gdGhlIGlucHV0LCAKKyUgYW5kIHVuaWZpZXMgVG9rZW4gd2l0aDoKKyUgICBlcnJvcihBdG9tKSwgCislICAgZW5kX29mX2ZpbGUsIAorJSAgICcuJywgJyAnLCAnKCcsICcpJywgJ1snLCAnXScsICd7JywgJ30nLCAnLCcsICd8JywgCislICAgbnVtYmVyKEludGVnZXJfb3JfRmxvYXQpLAorJSAgIGF0b20oQXRvbSksIAorJSAgIHZhcihBdG9tKSwgCislICAgc3RyaW5nKENoYXJDb2RlTGlzdCkKKworJXJlYWRfdG9rZW4oVG9rZW4pIDotIGN1cnJlbnRfaW5wdXQoUyksIHJlYWRfdG9rZW4oUywgVG9rZW4pLgorCityZWFkX3Rva2VuKFNfb3JfYSwgVG9rZW4pIDotCisJJyRyZWFkX3Rva2VuMCcoU19vcl9hLCBUeXBlLCBUb2tlbjApLAorCSckcmVhZF90b2tlbjEnKFtUeXBlXSwgVG9rZW4wLCBUb2tlbikuCisKKyckcmVhZF90b2tlbjEnKFstMl0sIFQsIGVycm9yKFQpKSAgOi0gIS4gJSBlcnJvcignbWVzc2FnZScpCisnJHJlYWRfdG9rZW4xJygiSSIsICBULCBudW1iZXIoVCkpIDotICEuICUgbnVtYmVyKGludHZhbHVlKQorJyRyZWFkX3Rva2VuMScoIkQiLCAgVCwgbnVtYmVyKFQpKSA6LSAhLiAlIG51bWJlcihmbG9hdHZhbHVlKQorJyRyZWFkX3Rva2VuMScoIkEiLCAgVCwgYXRvbShUKSkgICA6LSAhLiAlIGF0b20oJ25hbWUnKQorJyRyZWFkX3Rva2VuMScoIlYiLCAgVCwgdmFyKFQpKSAgICA6LSAhLiAlIHZhcignbmFtZScpCisnJHJlYWRfdG9rZW4xJygiUyIsICBULCBzdHJpbmcoVCkpIDotICEuICUgc3RyaW5nKCJjaGFycyIpCisnJHJlYWRfdG9rZW4xJyhfLCAgICBULCBUKSAgICAgICAgIDotICEuICUgb3RoZXJzCisKKyUgcmVhZF90b2tlbnMoVG9rZW5zLCBWcykgcmVhZHMgdG9rZW5zIGZyb20gdGhlIGlucHV0IAorJSB1bnRpbCBmdWxsLXN0b3AtbWFyayAoJy4nKSBvciBlbmRfb2ZfZmlsZSwgCislIHVuaWZpZXMgVG9rZW5zIHdpdGggYSBsaXN0IG9mIHRva2Vucy4KKyUgVG9rZW4gZm9yIGEgdmFyaWFibGUgaGFzIGEgZm9ybSBvZiB2YXIoTmFtZSxWYXJpYWJsZSkuCislIFZzIGlzIGEgbGlzdCBvZiBOYW1lPVZhcmlhYmxlIHBhaXJzLgorCislcmVhZF90b2tlbnMoVG9rZW5zLCBWcykgOi0KKyUJY3VycmVudF9pbnB1dChTdHJlYW0pLAorJQknJHJlYWRfdG9rZW5zJyhTdHJlYW0sIFRva2VucywgVnMsIFtdKSwKKyUJIS4KKworcmVhZF90b2tlbnMoU3RyZWFtLCBUb2tlbnMsIFZzKSA6LQorCSckcmVhZF90b2tlbnMnKFN0cmVhbSwgVG9rZW5zLCBWcywgW10pLAorCSEuCisKKyckcmVhZF90b2tlbnMnKFN0cmVhbSwgVG9rZW5zLCBWcywgVkkpIDotCisJcmVhZF90b2tlbihTdHJlYW0sIFRva2VuKSwKKwknJHJlYWRfdG9rZW5zMScoU3RyZWFtLCBUb2tlbiwgVG9rZW5zLCBWcywgVkkpLgorCisnJHJlYWRfdG9rZW5zMScoU3RyZWFtLCBlcnJvcihNZXNzYWdlKSwgW10sIF8sIF8pIDotICAhLAorCXdyaXRlKCd7U1lOVEFYIEVSUk9SfScpLCBubCwgCisJd3JpdGUoJyoqICcpLCB3cml0ZShNZXNzYWdlKSwgd3JpdGUoJyAqKicpLCBubCwKKwknJHJlYWRfdG9rZW5zX3VudGlsX2Z1bGxzdG9wJyhTdHJlYW0pLAorCWZhaWwuCisnJHJlYWRfdG9rZW5zMScoX1N0cmVhbSwgZW5kX29mX2ZpbGUsIFtlbmRfb2ZfZmlsZSwnLiddLCBbXSwgXykgOi0gIS4KKyckcmVhZF90b2tlbnMxJyhfU3RyZWFtLCAnLicsIFsnLiddLCBbXSwgXykgOi0gIS4KKyckcmVhZF90b2tlbnMxJyhTdHJlYW0sIHZhcignXycpLCBbdmFyKCdfJyxWKXxUb2tlbnNdLCBbJ18nPVZ8VnNdLCBWSTApIDotICEsCisJJyRyZWFkX3Rva2VucycoU3RyZWFtLCBUb2tlbnMsIFZzLCBbJ18nPVZ8VkkwXSkuCisnJHJlYWRfdG9rZW5zMScoU3RyZWFtLCB2YXIoTmFtZSksIFt2YXIoTmFtZSxWKXxUb2tlbnNdLCBWcywgVkkpIDotCisJJyRtZW1fcGFpcicoTmFtZT1WLCBWSSksICEsCisJJyRyZWFkX3Rva2VucycoU3RyZWFtLCBUb2tlbnMsIFZzLCBWSSkuCisnJHJlYWRfdG9rZW5zMScoU3RyZWFtLCB2YXIoTmFtZSksIFt2YXIoTmFtZSxWKXxUb2tlbnNdLCBbTmFtZT1WfFZzXSwgVkkwKSA6LSAhLAorCSckcmVhZF90b2tlbnMnKFN0cmVhbSwgVG9rZW5zLCBWcywgW05hbWU9VnxWSTBdKS4KKyckcmVhZF90b2tlbnMxJyhTdHJlYW0sIFRva2VuLCBbVG9rZW58VG9rZW5zXSwgVnMsIFZJKSA6LQorCSckcmVhZF90b2tlbnMnKFN0cmVhbSwgVG9rZW5zLCBWcywgVkkpLgorCisnJG1lbV9wYWlyJyhYMT1WMSwgW1gyPVYyfF9dKSA6LSBYMSA9PSBYMiwgISwgVjEgPSBWMi4KKyckbWVtX3BhaXInKFgsIFtffExdKSA6LSAnJG1lbV9wYWlyJyhYLCBMKS4KKyUnJG1lbV9wYWlyJyhYLCBbX3xMXSkgOi0gbWVtYmVyKFgsIEwpLgorCisnJHJlYWRfdG9rZW5zX3VudGlsX2Z1bGxzdG9wJyhTdHJlYW0pIDotCisJcmVhZF90b2tlbihTdHJlYW0sIFRva2VuKSwKKwknJHJlYWRfdG9rZW5zX3VudGlsX2Z1bGxzdG9wJyhTdHJlYW0sIFRva2VuKS4KKworJyRyZWFkX3Rva2Vuc191bnRpbF9mdWxsc3RvcCcoX1N0cmVhbSwgZW5kX29mX2ZpbGUpIDotICEuCisnJHJlYWRfdG9rZW5zX3VudGlsX2Z1bGxzdG9wJyhfU3RyZWFtLCAnLicpIDotICEuCisnJHJlYWRfdG9rZW5zX3VudGlsX2Z1bGxzdG9wJyhTdHJlYW0sIF8pIDotCisJcmVhZF90b2tlbihTdHJlYW0sIFRva2VuKSwKKwknJHJlYWRfdG9rZW5zX3VudGlsX2Z1bGxzdG9wJyhTdHJlYW0sIFRva2VuKS4KKworcGFyc2VfdG9rZW5zKFgsIFRva2VucykgOi0KKwlyZXRyYWN0YWxsKCckdG9rZW5zJyhfKSksCisJYXNzZXJ0eignJHRva2VucycoVG9rZW5zKSksCisJJyRwYXJzZV90b2tlbnMnKFgsIDEyMDEsIFRva2VucywgWycuJ10pLAorCXJldHJhY3QoJyR0b2tlbnMnKFRva2VucykpLAorCSEuCisKKyUgJyRwYXJzZV90b2tlbnMnKFgsIFByZWMpIHBhcnNlcyB0aGUgaW5wdXQgd2hvc2UgcHJlY2VkZWNlbmNlID08IFByZWMuCisnJHBhcnNlX3Rva2VucycoWCwgUHJlYzApIC0tPgorCSckcGFyc2VfdG9rZW5zX3NraXBfc3BhY2VzJywKKwknJHBhcnNlX3Rva2VuczEnKFByZWMwLCBYMSwgUHJlYzEpLAorCSEsCisJJyRwYXJzZV90b2tlbnNfc2tpcF9zcGFjZXMnLAorCSckcGFyc2VfdG9rZW5zMicoUHJlYzAsIFgxLCBQcmVjMSwgWCwgX1ByZWMpLAorCSEuCisKKyckcGFyc2VfdG9rZW5zMScoUHJlYzAsIFgxLCBQcmVjMSkgLS0+CisJJyRwYXJzZV90b2tlbnNfcGVlcF9uZXh0JyhOZXh0KSwKKwl7JyRwYXJzZV90b2tlbnNfaXNfc3RhcnRlcicoTmV4dCl9LAorCSEsCisJJyRwYXJzZV90b2tlbnNfYmVmb3JlX29wJyhQcmVjMCwgWDEsIFByZWMxKS4KKyckcGFyc2VfdG9rZW5zMScoXywgXywgXykgLS0+CisJJyRwYXJzZV90b2tlbnNfcGVlcF9uZXh0JyhOZXh0KSwKKwknJHBhcnNlX3Rva2Vuc19lcnJvcicoW05leHQsY2Fubm90LHN0YXJ0LGFuLGV4cHJlc3Npb25dKS4KKworJyRwYXJzZV90b2tlbnMyJyhQcmVjMCwgWCwgUHJlYywgWCwgUHJlYykgLS0+CisJJyRwYXJzZV90b2tlbnNfcGVlcF9uZXh0JyhOZXh0KSwKKwl7JyRwYXJzZV90b2tlbnNfaXNfdGVybWluYXRvcicoTmV4dCl9LAorCXtQcmVjID08IFByZWMwfSwKKwkhLgorJyRwYXJzZV90b2tlbnMyJyhQcmVjMCwgWDEsIFByZWMxLCBYLCBQcmVjKSAtLT4KKwknJHBhcnNlX3Rva2Vuc19wZWVwX25leHQnKE5leHQpLAorCXsnJHBhcnNlX3Rva2Vuc19pc19wb3N0X2luX29wJyhOZXh0KX0sCisJISwKKwknJHBhcnNlX3Rva2Vuc19wb3N0X2luX29wcycoUHJlYzAsIFgxLCBQcmVjMSwgWCwgUHJlYykuCisnJHBhcnNlX3Rva2VuczInKF8sIF8sIF8sIF8sIF8pIC0tPiAKKwknJHBhcnNlX3Rva2Vuc19lcnJvcicoW29wZXJhdG9yLGV4cGVjdGVkLGFmdGVyLGV4cHJlc3Npb25dKS4KKworJSAnJHBhcnNlX3Rva2Vuc19iZWZvcmVfb3AnKFByZWMwLCBYLCBQcmVjKQorJSBwYXJzZXMgdGhlIGlucHV0IHVudGlsIGluZml4IG9yIHBvc3RmaXggb3BlcmF0b3IsCislIGFuZCByZXR1cm5zIFggYW5kIFByZWMKKyckcGFyc2VfdG9rZW5zX2JlZm9yZV9vcCcoUHJlYzAsIFgsIFByZWMpIC0tPiBbJyAnXSwgISwKKwknJHBhcnNlX3Rva2Vuc19iZWZvcmVfb3AnKFByZWMwLCBYLCBQcmVjKS4KKyckcGFyc2VfdG9rZW5zX2JlZm9yZV9vcCcoXywgZW5kX29mX2ZpbGUsIDApIC0tPiBbZW5kX29mX2ZpbGVdLCAhLgorJyRwYXJzZV90b2tlbnNfYmVmb3JlX29wJyhfLCBOLCAwKSAtLT4gW251bWJlcihOKV0sICEuCisnJHBhcnNlX3Rva2Vuc19iZWZvcmVfb3AnKF8sIE4sIDApIC0tPgorCVthdG9tKCctJyldLCBbbnVtYmVyKE4wKV0sICEsIHtOIGlzIC1OMH0uCisnJHBhcnNlX3Rva2Vuc19iZWZvcmVfb3AnKF8sIFYsIDApIC0tPiBbdmFyKF8sVildLCAhLgorJyRwYXJzZV90b2tlbnNfYmVmb3JlX29wJyhfLCBTLCAwKSAtLT4gW3N0cmluZyhTKV0sICEuCisnJHBhcnNlX3Rva2Vuc19iZWZvcmVfb3AnKF8sIFgsIDApIC0tPiBbJygnXSwgISwKKwknJHBhcnNlX3Rva2VucycoWCwgMTIwMSksCisJJyRwYXJzZV90b2tlbnNfZXhwZWN0JygnKScpLgorJyRwYXJzZV90b2tlbnNfYmVmb3JlX29wJyhfLCBYLCAwKSAtLT4gWyd7J10sICEsCisJJyRwYXJzZV90b2tlbnNfc2tpcF9zcGFjZXMnLAorCSckcGFyc2VfdG9rZW5zX2JyYWNlJyhYKS4KKyckcGFyc2VfdG9rZW5zX2JlZm9yZV9vcCcoXywgWCwgMCkgLS0+IFsnWyddLCAhLAorCSckcGFyc2VfdG9rZW5zX3NraXBfc3BhY2VzJywKKwknJHBhcnNlX3Rva2Vuc19saXN0JyhYKS4KKyckcGFyc2VfdG9rZW5zX2JlZm9yZV9vcCcoXywgWCwgMCkgLS0+CisJW2F0b20oRildLCBbJygnXSwKKwkhLAorCSckcGFyc2VfdG9rZW5zX3NraXBfc3BhY2VzJywKKwknJHBhcnNlX3Rva2Vuc19hcmdzJyhBcmdzKSwKKwl7WCA9Li4gW0Z8QXJnc119LgorJyRwYXJzZV90b2tlbnNfYmVmb3JlX29wJyhQcmVjMCwgWCwgUHJlY09wKSAtLT4KKwlbYXRvbShGKV0sIHtjdXJyZW50X29wKFByZWNPcCxmeCxGKX0sIHtQcmVjT3AgPTwgUHJlYzB9LAorCSckcGFyc2VfdG9rZW5zX3NraXBfc3BhY2VzJywKKwknJHBhcnNlX3Rva2Vuc19wZWVwX25leHQnKE5leHQpLAorCXsnJHBhcnNlX3Rva2Vuc19pc19zdGFydGVyJyhOZXh0KX0sCisJe1wrICckcGFyc2VfdG9rZW5zX2lzX3Bvc3RfaW5fb3AnKE5leHQpfSwKKwkhLAorICAgICAgICB7UHJlYzEgaXMgUHJlY09wIC0gMX0sCisgICAgICAgICckcGFyc2VfdG9rZW5zJyhBcmcsIFByZWMxKSwKKwl7ZnVuY3RvcihYLCBGLCAxKX0sCisJe2FyZygxLCBYLCBBcmcpfS4KKyckcGFyc2VfdG9rZW5zX2JlZm9yZV9vcCcoUHJlYzAsIFgsIFByZWNPcCkgLS0+CisJW2F0b20oRildLCB7Y3VycmVudF9vcChQcmVjT3AsZnksRil9LCB7UHJlY09wID08IFByZWMwfSwKKwknJHBhcnNlX3Rva2Vuc19za2lwX3NwYWNlcycsCisJJyRwYXJzZV90b2tlbnNfcGVlcF9uZXh0JyhOZXh0KSwKKwl7JyRwYXJzZV90b2tlbnNfaXNfc3RhcnRlcicoTmV4dCl9LAorCXtcKyAnJHBhcnNlX3Rva2Vuc19pc19wb3N0X2luX29wJyhOZXh0KX0sCisJISwKKyAgICAgICAgJyRwYXJzZV90b2tlbnMnKEFyZywgUHJlY09wKSwKKwl7ZnVuY3RvcihYLCBGLCAxKX0sCisJe2FyZygxLCBYLCBBcmcpfS4KKyckcGFyc2VfdG9rZW5zX2JlZm9yZV9vcCcoXywgQSwgMCkgLS0+CisJW2F0b20oQSldLgorCisnJHBhcnNlX3Rva2Vuc19icmFjZScoJ3t9JykgLS0+IFsnfSddLCAhLgorJyRwYXJzZV90b2tlbnNfYnJhY2UnKFgpIC0tPgorCSckcGFyc2VfdG9rZW5zJyhYMSwgMTIwMSksCisJJyRwYXJzZV90b2tlbnNfZXhwZWN0JygnfScpLAorCXtYID0ge1gxfX0uCisKKyckcGFyc2VfdG9rZW5zX2xpc3QnKCdbXScpIC0tPiBbJ10nXSwgIS4KKyckcGFyc2VfdG9rZW5zX2xpc3QnKFtYfFhzXSkgLS0+CisJJyRwYXJzZV90b2tlbnMnKFgsIDk5OSksCisJJyRwYXJzZV90b2tlbnNfc2tpcF9zcGFjZXMnLAorCSckcGFyc2VfdG9rZW5zX2xpc3RfcmVzdCcoWHMpLgorCisnJHBhcnNlX3Rva2Vuc19saXN0X3Jlc3QnKFhzKSAtLT4gWyd8J10sICEsCisJJyRwYXJzZV90b2tlbnMnKFhzLCA5OTkpLAorCSckcGFyc2VfdG9rZW5zX2V4cGVjdCcoJ10nKS4KKyckcGFyc2VfdG9rZW5zX2xpc3RfcmVzdCcoW1h8WHNdKSAtLT4gWycsJ10sICEsCisJJyRwYXJzZV90b2tlbnMnKFgsIDk5OSksCisJJyRwYXJzZV90b2tlbnNfc2tpcF9zcGFjZXMnLAorCSckcGFyc2VfdG9rZW5zX2xpc3RfcmVzdCcoWHMpLgorJyRwYXJzZV90b2tlbnNfbGlzdF9yZXN0JygnW10nKSAtLT4KKwknJHBhcnNlX3Rva2Vuc19leHBlY3QnKCddJykuCisKKyckcGFyc2VfdG9rZW5zX2FyZ3MnKCdbXScpIC0tPiBbJyknXSwgIS4KKyckcGFyc2VfdG9rZW5zX2FyZ3MnKFtYfFhzXSkgLS0+CisJJyRwYXJzZV90b2tlbnMnKFgsIDk5OSksCisJJyRwYXJzZV90b2tlbnNfc2tpcF9zcGFjZXMnLAorCSckcGFyc2VfdG9rZW5zX2FyZ3NfcmVzdCcoWHMpLgorCisnJHBhcnNlX3Rva2Vuc19hcmdzX3Jlc3QnKFtYfFhzXSkgLS0+IFsnLCddLCAhLAorCSckcGFyc2VfdG9rZW5zJyhYLCA5OTkpLAorCSckcGFyc2VfdG9rZW5zX3NraXBfc3BhY2VzJywKKwknJHBhcnNlX3Rva2Vuc19hcmdzX3Jlc3QnKFhzKS4KKyckcGFyc2VfdG9rZW5zX2FyZ3NfcmVzdCcoJ1tdJykgLS0+CisJJyRwYXJzZV90b2tlbnNfZXhwZWN0JygnKScpLgorCislICckcGFyc2VfdG9rZW5zX3Bvc3RfaW5fb3AnKFByZWMwLCBYMSwgUHJlYzEsIFgsIFByZWMpCislIHBhcnNlcyB0aGUgaW5wdXQgYmVnaW5uaW5nIGZyb20gaW5maXggb3IgcG9zdGZpeCBvcGVyYXRvciwKKyUgYW5kIHJldHVybnMgWCBhbmQgUHJlYworJyRwYXJzZV90b2tlbnNfcG9zdF9pbl9vcHMnKFByZWMwLCBYMSwgUHJlYzEsIFgsIFByZWMpIC0tPgorCSckcGFyc2VfdG9rZW5zX3NraXBfc3BhY2VzJywKKwlbT3BdLAorCSckcGFyc2VfdG9rZW5zX29wJyhPcCwgUHJlYzAsIFgxLCBQcmVjMSwgWDIsIFByZWMyKSwKKwknJHBhcnNlX3Rva2Vuc19wb3N0X2luX29wcycoUHJlYzAsIFgyLCBQcmVjMiwgWCwgUHJlYykuCisnJHBhcnNlX3Rva2Vuc19wb3N0X2luX29wcycoUHJlYzAsIFgsIFByZWMsIFgsIFByZWMpIC0tPiAKKwl7UHJlYyA9PCBQcmVjMH0uCisKKyckcGFyc2VfdG9rZW5zX29wJygnLCcsIFByZWMwLCBYMSwgUHJlYzEsIFgsIFByZWNPcCkgLS0+ICEsCisJJyRwYXJzZV90b2tlbnNfb3AnKGF0b20oJywnKSwgUHJlYzAsIFgxLCBQcmVjMSwgWCwgUHJlY09wKS4KKyckcGFyc2VfdG9rZW5zX29wJygnfCcsIFByZWMwLCBYMSwgUHJlYzEsIFgsIFByZWNPcCkgLS0+ICEsCisJJyRwYXJzZV90b2tlbnNfb3AnKGF0b20oJzsnKSwgUHJlYzAsIFgxLCBQcmVjMSwgWCwgUHJlY09wKS4KKyckcGFyc2VfdG9rZW5zX29wJyhhdG9tKE9wKSwgUHJlYzAsIFgxLCBQcmVjMSwgWCwgUHJlY09wKSAtLT4KKwl7Y3VycmVudF9vcChQcmVjT3AsIHhmLCBPcCl9LCB7UHJlY09wID08IFByZWMwfSwKKwl7UHJlYzEgPCBQcmVjT3B9LAorCXtmdW5jdG9yKFgsIE9wLCAxKX0sCisJe2FyZygxLCBYLCBYMSl9LgorJyRwYXJzZV90b2tlbnNfb3AnKGF0b20oT3ApLCBQcmVjMCwgWDEsIFByZWMxLCBYLCBQcmVjT3ApIC0tPgorCXtjdXJyZW50X29wKFByZWNPcCwgeWYsIE9wKX0sIHtQcmVjT3AgPTwgUHJlYzB9LAorCXtQcmVjMSA9PCBQcmVjT3B9LAorCXtmdW5jdG9yKFgsIE9wLCAxKX0sCisJe2FyZygxLCBYLCBYMSl9LgorJyRwYXJzZV90b2tlbnNfb3AnKGF0b20oT3ApLCBQcmVjMCwgWDEsIFByZWMxLCBYLCBQcmVjT3ApIC0tPgorCXtjdXJyZW50X29wKFByZWNPcCwgeGZ4LCBPcCl9LCB7UHJlY09wID08IFByZWMwfSwKKwl7UHJlYzEgPCBQcmVjT3B9LAorCXtQcmVjMiBpcyBQcmVjT3AgLSAxfSwKKwknJHBhcnNlX3Rva2VucycoWDIsIFByZWMyKSwKKwkhLAorCXtmdW5jdG9yKFgsIE9wLCAyKX0sCisJe2FyZygxLCBYLCBYMSl9LAorCXthcmcoMiwgWCwgWDIpfS4KKyckcGFyc2VfdG9rZW5zX29wJyhhdG9tKE9wKSwgUHJlYzAsIFgxLCBQcmVjMSwgWCwgUHJlY09wKSAtLT4KKwl7Y3VycmVudF9vcChQcmVjT3AsIHhmeSwgT3ApfSwge1ByZWNPcCA9PCBQcmVjMH0sCisJe1ByZWMxIDwgUHJlY09wfSwKKwl7UHJlYzIgaXMgUHJlY09wfSwKKwknJHBhcnNlX3Rva2VucycoWDIsIFByZWMyKSwKKwkhLAorCXtmdW5jdG9yKFgsIE9wLCAyKX0sCisJe2FyZygxLCBYLCBYMSl9LAorCXthcmcoMiwgWCwgWDIpfS4KKyckcGFyc2VfdG9rZW5zX29wJyhhdG9tKE9wKSwgUHJlYzAsIFgxLCBQcmVjMSwgWCwgUHJlY09wKSAtLT4KKwl7Y3VycmVudF9vcChQcmVjT3AsIHlmeCwgT3ApfSwge1ByZWNPcCA9PCBQcmVjMH0sCisJe1ByZWMxID08IFByZWNPcH0sCisJe1ByZWMyIGlzIFByZWNPcCAtIDF9LAorCSckcGFyc2VfdG9rZW5zJyhYMiwgUHJlYzIpLAorCSEsCisJe2Z1bmN0b3IoWCwgT3AsIDIpfSwKKwl7YXJnKDEsIFgsIFgxKX0sCisJe2FyZygyLCBYLCBYMil9LgorCisnJHBhcnNlX3Rva2Vuc19pc19zdGFydGVyJyhlbmRfb2ZfZmlsZSkuCisnJHBhcnNlX3Rva2Vuc19pc19zdGFydGVyJygnKCcpLgorJyRwYXJzZV90b2tlbnNfaXNfc3RhcnRlcicoJ1snKS4KKyckcGFyc2VfdG9rZW5zX2lzX3N0YXJ0ZXInKCd7JykuCisnJHBhcnNlX3Rva2Vuc19pc19zdGFydGVyJyhudW1iZXIoXykpLgorJyRwYXJzZV90b2tlbnNfaXNfc3RhcnRlcicoYXRvbShfKSkuCisnJHBhcnNlX3Rva2Vuc19pc19zdGFydGVyJyh2YXIoXyxfKSkuCisnJHBhcnNlX3Rva2Vuc19pc19zdGFydGVyJyhzdHJpbmcoXykpLgorCisnJHBhcnNlX3Rva2Vuc19pc190ZXJtaW5hdG9yJygnKScpLgorJyRwYXJzZV90b2tlbnNfaXNfdGVybWluYXRvcicoJ10nKS4KKyckcGFyc2VfdG9rZW5zX2lzX3Rlcm1pbmF0b3InKCd9JykuCisnJHBhcnNlX3Rva2Vuc19pc190ZXJtaW5hdG9yJygnLicpLgorCisnJHBhcnNlX3Rva2Vuc19pc19wb3N0X2luX29wJygnLCcpIDotICEuCisnJHBhcnNlX3Rva2Vuc19pc19wb3N0X2luX29wJygnfCcpIDotICEuCisnJHBhcnNlX3Rva2Vuc19pc19wb3N0X2luX29wJyhhdG9tKE9wKSkgOi0KKwljdXJyZW50X29wKF8sIFR5cGUsIE9wKSwKKwknJHBhcnNlX3Rva2Vuc19wb3N0X2luX3R5cGUnKFR5cGUpLAorCSEuCisKKyckcGFyc2VfdG9rZW5zX3Bvc3RfaW5fdHlwZScoeGZ4KS4KKyckcGFyc2VfdG9rZW5zX3Bvc3RfaW5fdHlwZScoeGZ5KS4KKyckcGFyc2VfdG9rZW5zX3Bvc3RfaW5fdHlwZScoeWZ4KS4KKyckcGFyc2VfdG9rZW5zX3Bvc3RfaW5fdHlwZScoeGYpLgorJyRwYXJzZV90b2tlbnNfcG9zdF9pbl90eXBlJyh5ZikuCisKKyckcGFyc2VfdG9rZW5zX2V4cGVjdCcoVG9rZW4pIC0tPgorCSckcGFyc2VfdG9rZW5zX3NraXBfc3BhY2VzJywKKwlbVG9rZW5dLAorCSEuCisnJHBhcnNlX3Rva2Vuc19leHBlY3QnKFRva2VuKSAtLT4KKwknJHBhcnNlX3Rva2Vuc19lcnJvcicoW1Rva2VuLGV4cGVjdGVkXSkuCisKKyckcGFyc2VfdG9rZW5zX3NraXBfc3BhY2VzJyAtLT4gWycgJ10sICEsICckcGFyc2VfdG9rZW5zX3NraXBfc3BhY2VzJy4KKyckcGFyc2VfdG9rZW5zX3NraXBfc3BhY2VzJyAtLT4gW10uCisKKyckcGFyc2VfdG9rZW5zX3BlZXBfbmV4dCcoTmV4dCwgUywgUykgOi0gUyA9IFtOZXh0fF9dLgorCisnJHBhcnNlX3Rva2Vuc19lcnJvcicoTWVzc2FnZSwgUzAsIF9TKSA6LQorCXdyaXRlKCd7U1lOVEFYIEVSUk9SfScpLCBubCwgd3JpdGUoJyoqICcpLAorCSckcGFyc2VfdG9rZW5zX3dyaXRlX21lc3NhZ2UnKE1lc3NhZ2UpLCB3cml0ZSgnICoqJyksIG5sLAorCSckcGFyc2VfdG9rZW5zX2Vycm9yMScoW10sIFMwKSwKKwljbGF1c2UoJyR0b2tlbnMnKFRva2VucyksIF8pLAorCSckcGFyc2VfdG9rZW5zX2Vycm9yMScoVG9rZW5zLCBTMCksCisJZmFpbC4KKworJyRwYXJzZV90b2tlbnNfZXJyb3IxJyhbXSwgXykgOi0gIS4KKyckcGFyc2VfdG9rZW5zX2Vycm9yMScoVG9rZW5zLCBTMCkgOi0gVG9rZW5zID09IFMwLCAhLAorCW5sLCB3cml0ZSgnKiogaGVyZSAqKicpLCBubCwKKwknJHBhcnNlX3Rva2Vuc19lcnJvcjEnKFRva2VucywgW10pLCBubC4KKyckcGFyc2VfdG9rZW5zX2Vycm9yMScoW1Rva2VufFRva2Vuc10sIFMwKSA6LQorCSckcGFyc2VfdG9rZW5zX2Vycm9yMicoVG9rZW4pLAorCSckcGFyc2VfdG9rZW5zX2Vycm9yMScoVG9rZW5zLCBTMCkuCisKKyckcGFyc2VfdG9rZW5zX2Vycm9yMicobnVtYmVyKFgpKSA6LSAhLCB3cml0ZShYKS4KKyckcGFyc2VfdG9rZW5zX2Vycm9yMicoYXRvbShYKSkgOi0gISwgd3JpdGVxKFgpLgorJyRwYXJzZV90b2tlbnNfZXJyb3IyJyh2YXIoWCxfKSkgOi0gISwgd3JpdGUoWCkuCisnJHBhcnNlX3Rva2Vuc19lcnJvcjInKHN0cmluZyhYKSkgOi0gISwKKwl3cml0ZSgnIicpLCAnJHBhcnNlX3Rva2Vuc193cml0ZV9zdHJpbmcnKFgpLCB3cml0ZSgnIicpLgorJyRwYXJzZV90b2tlbnNfZXJyb3IyJyhYKSA6LSB3cml0ZShYKS4KKworJyRwYXJzZV90b2tlbnNfd3JpdGVfc3RyaW5nJyhbXSkuCisnJHBhcnNlX3Rva2Vuc193cml0ZV9zdHJpbmcnKFtDfENzXSkgOi0gW0NdID0gIiIiIiwgISwKKwlwdXRfY29kZShDKSwgcHV0X2NvZGUoQyksICckcGFyc2VfdG9rZW5zX3dyaXRlX3N0cmluZycoQ3MpLgorJyRwYXJzZV90b2tlbnNfd3JpdGVfc3RyaW5nJyhbQ3xDc10pIDotIAorCXB1dF9jb2RlKEMpLCAnJHBhcnNlX3Rva2Vuc193cml0ZV9zdHJpbmcnKENzKS4KKworJyRwYXJzZV90b2tlbnNfd3JpdGVfbWVzc2FnZScoW10pLgorJyRwYXJzZV90b2tlbnNfd3JpdGVfbWVzc2FnZScoW1h8WHNdKSA6LQorCXdyaXRlKFgpLCB3cml0ZSgnICcpLCAnJHBhcnNlX3Rva2Vuc193cml0ZV9tZXNzYWdlJyhYcykuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUgVGVybSBpbnB1dC9vdXRwdXQgKHdyaXRlKQorJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorOi0gcHVibGljIHdyaXRlLzEsIHdyaXRlLzIuCis6LSBwdWJsaWMgd3JpdGVxLzEsIHdyaXRlcS8yLgorOi0gcHVibGljIHdyaXRlX2Nhbm9uaWNhbC8xLCB3cml0ZV9jYW5vbmljYWwvMi4KKzotIHB1YmxpYyB3cml0ZV90ZXJtLzIsIHdyaXRlX3Rlcm0vMy4KKword3JpdGUoVGVybSkgOi0KKwljdXJyZW50X291dHB1dChTKSwKKwl3cml0ZV90ZXJtKFMsIFRlcm0sIFtudW1iZXJ2YXJzKHRydWUpXSkuCisKK3dyaXRlKFNfb3JfYSwgVGVybSkgOi0KKwl3cml0ZV90ZXJtKFNfb3JfYSwgVGVybSwgW251bWJlcnZhcnModHJ1ZSldKS4KKword3JpdGVxKFRlcm0pIDotCisJY3VycmVudF9vdXRwdXQoUyksCisJd3JpdGVfdGVybShTLCBUZXJtLCBbcXVvdGVkKHRydWUpLG51bWJlcnZhcnModHJ1ZSldKS4KKword3JpdGVxKFNfb3JfYSwgVGVybSkgOi0KKwl3cml0ZV90ZXJtKFNfb3JfYSwgVGVybSwgW3F1b3RlZCh0cnVlKSxudW1iZXJ2YXJzKHRydWUpXSkuCisKK3dyaXRlX2Nhbm9uaWNhbChUZXJtKSA6LQorCWN1cnJlbnRfb3V0cHV0KFMpLAorCXdyaXRlX3Rlcm0oUywgVGVybSwgW3F1b3RlZCh0cnVlKSxpZ25vcmVfb3BzKHRydWUpXSkuCisKK3dyaXRlX2Nhbm9uaWNhbChTX29yX2EsIFRlcm0pIDotCisJd3JpdGVfdGVybShTX29yX2EsIFRlcm0sIFtxdW90ZWQodHJ1ZSksaWdub3JlX29wcyh0cnVlKV0pLgorCit3cml0ZV90ZXJtKFRlcm0sIE9wdGlvbnMpIDotCisJY3VycmVudF9vdXRwdXQoUyksCisJd3JpdGVfdGVybShTLCBUZXJtLCBPcHRpb25zKS4KKword3JpdGVfdGVybShTX29yX2EsIFRlcm0sIE9wdGlvbnMpIDotCisJJyR3cml0ZV90ZXJtJyhTX29yX2EsIFRlcm0sIE9wdGlvbnMpLAorCWZhaWwuCit3cml0ZV90ZXJtKF8sIF8sIF8pLgorCisnJHdyaXRlX3Rlcm0nKFNfb3JfYSwgVGVybSwgT3B0aW9ucykgOi0KKwknJHdyaXRlX3Rlcm0wJyhUZXJtLCAxMjAwLCBwdW5jdCwgXywgT3B0aW9ucywgU19vcl9hKSwKKwkhLgorCisnJHdyaXRlX3Rlcm0wJyhUZXJtLCBfUHJlYywgVHlwZTAsIGFscGhhLCBfLCBTX29yX2EpIDotIAorCXZhcihUZXJtKSwgCisJISwKKwknJHdyaXRlX3NwYWNlX2lmX25lZWRlZCcoVHlwZTAsIGFscGhhLCBTX29yX2EpLAorCSckZmFzdF93cml0ZScoU19vcl9hLCBUZXJtKS4KKyckd3JpdGVfdGVybTAnKFRlcm0sIF9QcmVjLCBUeXBlMCwgYWxwaGEsIF8sIFNfb3JfYSkgOi0gCisJamF2YShUZXJtKSwgCisJISwKKwknJHdyaXRlX3NwYWNlX2lmX25lZWRlZCcoVHlwZTAsIGFscGhhLCBTX29yX2EpLAorCSckZmFzdF93cml0ZScoU19vcl9hLCBUZXJtKS4KKyckd3JpdGVfdGVybTAnKFRlcm0sIF9QcmVjLCBUeXBlMCwgYWxwaGEsIFN0eWxlLCBTX29yX2EpIDotCisJVGVybSA9ICckVkFSJyhWTiksIGludGVnZXIoVk4pLCBWTiA+PSAwLAorCSckYnVpbHRpbl9tZW1iZXInKG51bWJlcnZhcnModHJ1ZSksIFN0eWxlKSwKKwkhLAorCSckd3JpdGVfc3BhY2VfaWZfbmVlZGVkJyhUeXBlMCwgYWxwaGEsIFNfb3JfYSksCisJJyR3cml0ZV9WQVInKFZOLCBTX29yX2EpLgorJyR3cml0ZV90ZXJtMCcoVGVybSwgX1ByZWMsIFR5cGUwLCBhbHBoYSwgXywgU19vcl9hKSA6LSAKKwludW1iZXIoVGVybSksIFRlcm0gPCAwLCAKKwkhLAorCSckd3JpdGVfc3BhY2VfaWZfbmVlZGVkJyhUeXBlMCwgc3ltYm9sLCBTX29yX2EpLAorCSckZmFzdF93cml0ZScoU19vcl9hLCBUZXJtKS4KKyckd3JpdGVfdGVybTAnKFRlcm0sIF9QcmVjLCBUeXBlMCwgYWxwaGEsIF8sIFNfb3JfYSkgOi0gCisJbnVtYmVyKFRlcm0pLCAKKwkhLAorCSckd3JpdGVfc3BhY2VfaWZfbmVlZGVkJyhUeXBlMCwgYWxwaGEsIFNfb3JfYSksCisJJyRmYXN0X3dyaXRlJyhTX29yX2EsIFRlcm0pLgorJSckd3JpdGVfdGVybTAnKFRlcm0sIFByZWMsIFR5cGUwLCBwdW5jdCwgXywgU19vcl9hKSA6LQorJQlhdG9tKFRlcm0pLCAKKyUJY3VycmVudF9vcChQcmVjT3AsIE9wVHlwZSwgVGVybSksCislCShPcFR5cGUgPSBmeCA7IE9wVHlwZSA9IGZ5KSwKKyUJUHJlY09wID08IFByZWMsCislCSEsCislCSckd3JpdGVfc3BhY2VfaWZfbmVlZGVkJyhUeXBlMCwgcHVuY3QsIFNfb3JfYSksCislCXB1dF9jaGFyKFNfb3JfYSwgJygnKSwKKyUJJyR3cml0ZV9hdG9tJyhUZXJtLCBwdW5jdCwgXywgXywgU19vcl9hKSwKKyUJcHV0X2NoYXIoU19vcl9hLCAnKScpLgorJyR3cml0ZV90ZXJtMCcoVGVybSwgX1ByZWMsIFR5cGUwLCBUeXBlLCBTdHlsZSwgU19vcl9hKSA6LSAKKwlhdG9tKFRlcm0pLCAKKwkhLAorCSckd3JpdGVfYXRvbScoVGVybSwgVHlwZTAsIFR5cGUsIFN0eWxlLCBTX29yX2EpLgorJyR3cml0ZV90ZXJtMCcoVGVybSwgUHJlYywgVHlwZTAsIFR5cGUsIFN0eWxlLCBTX29yX2EpIDotCisJXCsgJyRidWlsdGluX21lbWJlcicoaWdub3JlX29wcyh0cnVlKSwgU3R5bGUpLAorCSckd3JpdGVfaXNfb3BlcmF0b3InKFRlcm0sIE9wLCBBcmdzLCBPcFR5cGUpLAorCSEsCisJJyR3cml0ZV90ZXJtX29wJyhPcCwgT3BUeXBlLCBBcmdzLCBQcmVjLCBUeXBlMCwgVHlwZSwgU3R5bGUsIFNfb3JfYSkuCisnJHdyaXRlX3Rlcm0wJyhUZXJtLCBfUHJlYywgVHlwZTAsIHB1bmN0LCBTdHlsZSwgU19vcl9hKSA6LQorCVRlcm0gPSBbX3xfXSwKKwlcKyAnJGJ1aWx0aW5fbWVtYmVyJyhpZ25vcmVfb3BzKHRydWUpLCBTdHlsZSksCisJISwKKwknJHdyaXRlX3NwYWNlX2lmX25lZWRlZCcoVHlwZTAsIHB1bmN0LCBTX29yX2EpLAorCXB1dF9jaGFyKFNfb3JfYSwgJ1snKSwKKwknJHdyaXRlX3Rlcm1fbGlzdF9hcmdzJyhUZXJtLCBwdW5jdCwgXywgU3R5bGUsIFNfb3JfYSksCisJcHV0X2NoYXIoU19vcl9hLCAnXScpLgorJyR3cml0ZV90ZXJtMCcoVGVybSwgX1ByZWMsIFR5cGUwLCBfVHlwZSwgU3R5bGUsIFNfb3JfYSkgOi0KKwlUZXJtID0ge1Rlcm0xfSwKKwlcKyAnJGJ1aWx0aW5fbWVtYmVyJyhpZ25vcmVfb3BzKHRydWUpLCBTdHlsZSksCisJISwKKwknJHdyaXRlX3NwYWNlX2lmX25lZWRlZCcoVHlwZTAsIHB1bmN0LCBTX29yX2EpLAorCXB1dF9jaGFyKFNfb3JfYSwgJ3snKSwKKwknJHdyaXRlX3Rlcm0wJyhUZXJtMSwgMTIwMCwgcHVuY3QsIF8sIFN0eWxlLCBTX29yX2EpLAorCXB1dF9jaGFyKFNfb3JfYSwgJ30nKS4KKyckd3JpdGVfdGVybTAnKFRlcm0sIF9QcmVjLCBUeXBlMCwgcHVuY3QsIFN0eWxlLCBTX29yX2EpIDotCisJVGVybSA9Li4gW0Z8QXJnc10sCisJJyR3cml0ZV9hdG9tJyhGLCBUeXBlMCwgXywgU3R5bGUsIFNfb3JfYSksCisJcHV0X2NoYXIoU19vcl9hLCAnKCcpLAorCSckd3JpdGVfdGVybV9hcmdzJyhBcmdzLCBwdW5jdCwgXywgU3R5bGUsIFNfb3JfYSksCisJcHV0X2NoYXIoU19vcl9hLCAnKScpLgorCisnJHdyaXRlX3NwYWNlX2lmX25lZWRlZCcocHVuY3QsIF8sICAgICBfICAgICApIDotICEuCisnJHdyaXRlX3NwYWNlX2lmX25lZWRlZCcoWCwgICAgIFgsICAgICBTX29yX2EpIDotICEsIHB1dF9jaGFyKFNfb3JfYSwgJyAnKS4KKyckd3JpdGVfc3BhY2VfaWZfbmVlZGVkJyhvdGhlciwgYWxwaGEsIFNfb3JfYSkgOi0gISwgcHV0X2NoYXIoU19vcl9hLCAnICcpLgorJyR3cml0ZV9zcGFjZV9pZl9uZWVkZWQnKF8sICAgICBfLCAgICAgXyAgICAgKS4KKworJyR3cml0ZV9WQVInKFZOLCBTX29yX2EpIDotIFZOIDwgMjYsICEsCisJTGV0dGVyIGlzIFZOIG1vZCAyNiArICJBIiwKKwlwdXRfY29kZShTX29yX2EsIExldHRlcikuCisnJHdyaXRlX1ZBUicoVk4sIFNfb3JfYSkgOi0KKwlMZXR0ZXIgaXMgVk4gbW9kIDI2ICsgIkEiLAorCXB1dF9jb2RlKFNfb3JfYSwgTGV0dGVyKSwKKwlSZXN0IGlzIFZOLy8yNiwKKwknJGZhc3Rfd3JpdGUnKFNfb3JfYSwgUmVzdCkuCisKKyckd3JpdGVfYXRvbScoQXRvbSwgVHlwZTAsIFR5cGUsIFN0eWxlLCBTX29yX2EpIDotIAorCSckYnVpbHRpbl9tZW1iZXInKHF1b3RlZCh0cnVlKSwgU3R5bGUpLCAKKwkhLAorCSckYXRvbV90eXBlJyhBdG9tLCBUeXBlKSwgCisJJyR3cml0ZV9zcGFjZV9pZl9uZWVkZWQnKFR5cGUwLCBUeXBlLCBTX29yX2EpLAorCSckZmFzdF93cml0ZXEnKFNfb3JfYSwgQXRvbSkuCisnJHdyaXRlX2F0b20nKEF0b20sIFR5cGUwLCBUeXBlLCBfLCBTX29yX2EpIDotCisJJyRhdG9tX3R5cGUnKEF0b20sIFR5cGUpLCAKKwknJHdyaXRlX3NwYWNlX2lmX25lZWRlZCcoVHlwZTAsIFR5cGUsIFNfb3JfYSksCisJJyRmYXN0X3dyaXRlJyhTX29yX2EsIEF0b20pLgorCisnJGF0b21fdHlwZScoWCwgYWxwaGEgKSA6LSAnJGF0b21fdHlwZTAnKFgsIDApLCAhLgorJyRhdG9tX3R5cGUnKFgsIHN5bWJvbCkgOi0gJyRhdG9tX3R5cGUwJyhYLCAxKSwgIS4KKyckYXRvbV90eXBlJyhYLCBwdW5jdCApIDotICckYXRvbV90eXBlMCcoWCwgMiksICEuCisnJGF0b21fdHlwZScoWCwgb3RoZXIgKSA6LSAnJGF0b21fdHlwZTAnKFgsIDMpLCAhLgorCisnJHdyaXRlX2lzX29wZXJhdG9yJyhUZXJtLCBPcCwgQXJncywgT3BUeXBlKSA6LQorCWZ1bmN0b3IoVGVybSwgT3AsIEFyaXR5KSwKKwknJHdyaXRlX29wX3R5cGUnKEFyaXR5LCBPcFR5cGUpLAorCWN1cnJlbnRfb3AoXywgT3BUeXBlLCBPcCksCisJVGVybSA9Li4gW198QXJnc10sCisJIS4KKworJyR3cml0ZV9vcF90eXBlJygxLCBmeCkuCisnJHdyaXRlX29wX3R5cGUnKDEsIGZ5KS4KKyckd3JpdGVfb3BfdHlwZScoMSwgeGYpLgorJyR3cml0ZV9vcF90eXBlJygxLCB5ZikuCisnJHdyaXRlX29wX3R5cGUnKDIsIHhmeCkuCisnJHdyaXRlX29wX3R5cGUnKDIsIHhmeSkuCisnJHdyaXRlX29wX3R5cGUnKDIsIHlmeCkuCisKKyckd3JpdGVfdGVybV9vcCcoT3AsIE9wVHlwZSwgQXJncywgUHJlYywgVHlwZTAsIHB1bmN0LCBTdHlsZSwgU19vcl9hKSA6LQorCWN1cnJlbnRfb3AoUHJlY09wLCBPcFR5cGUsIE9wKSwgCisJUHJlY09wID4gUHJlYywKKwkhLAorCSckd3JpdGVfc3BhY2VfaWZfbmVlZGVkJyhUeXBlMCwgcHVuY3QsIFNfb3JfYSksCisJcHV0X2NoYXIoU19vcl9hLCAnKCcpLAorCSckd3JpdGVfdGVybV9vcDEnKE9wLCBPcFR5cGUsIEFyZ3MsIFByZWNPcCwgcHVuY3QsIF8sIFN0eWxlLCBTX29yX2EpLAorCXB1dF9jaGFyKFNfb3JfYSwgJyknKS4KKyckd3JpdGVfdGVybV9vcCcoT3AsIE9wVHlwZSwgQXJncywgX1ByZWMsIFR5cGUwLCBUeXBlLCBTdHlsZSwgU19vcl9hKSA6LQorCWN1cnJlbnRfb3AoUHJlY09wLCBPcFR5cGUsIE9wKSwKKwknJHdyaXRlX3Rlcm1fb3AxJyhPcCwgT3BUeXBlLCBBcmdzLCBQcmVjT3AsIFR5cGUwLCBUeXBlLCBTdHlsZSwgU19vcl9hKS4KKworJyR3cml0ZV90ZXJtX29wMScoT3AsIGZ4LCBbQTFdLCBQcmVjT3AsIFR5cGUwLCBUeXBlLCBTdHlsZSwgU19vcl9hKSA6LSAhLAorCSckd3JpdGVfYXRvbScoT3AsIFR5cGUwLCBUeXBlMSwgU3R5bGUsIFNfb3JfYSksCisJUHJlYzEgaXMgUHJlY09wIC0gMSwKKwknJHdyaXRlX3Rlcm0wJyhBMSwgUHJlYzEsIFR5cGUxLCBUeXBlLCBTdHlsZSwgU19vcl9hKS4KKyckd3JpdGVfdGVybV9vcDEnKE9wLCBmeSwgW0ExXSwgUHJlY09wLCBUeXBlMCwgVHlwZSwgU3R5bGUsIFNfb3JfYSkgOi0gISwKKwknJHdyaXRlX2F0b20nKE9wLCBUeXBlMCwgVHlwZTEsIFN0eWxlLCBTX29yX2EpLAorCVByZWMxIGlzIFByZWNPcCwKKwknJHdyaXRlX3Rlcm0wJyhBMSwgUHJlYzEsIFR5cGUxLCBUeXBlLCBTdHlsZSwgU19vcl9hKS4KKyckd3JpdGVfdGVybV9vcDEnKE9wLCB4ZiwgW0ExXSwgUHJlY09wLCBUeXBlMCwgVHlwZSwgU3R5bGUsIFNfb3JfYSkgOi0gISwKKwlQcmVjMSBpcyBQcmVjT3AgLSAxLAorCSckd3JpdGVfdGVybTAnKEExLCBQcmVjMSwgVHlwZTAsIFR5cGUxLCBTdHlsZSwgU19vcl9hKSwKKwknJHdyaXRlX2F0b20nKE9wLCBUeXBlMSwgVHlwZSwgU3R5bGUsIFNfb3JfYSkuCisnJHdyaXRlX3Rlcm1fb3AxJyhPcCwgeWYsIFtBMV0sIFByZWNPcCwgVHlwZTAsIFR5cGUsIFN0eWxlLCBTX29yX2EpIDotICEsCisJUHJlYzEgaXMgUHJlY09wLAorCSckd3JpdGVfdGVybTAnKEExLCBQcmVjMSwgVHlwZTAsIFR5cGUxLCBTdHlsZSwgU19vcl9hKSwKKwknJHdyaXRlX2F0b20nKE9wLCBUeXBlMSwgVHlwZSwgU3R5bGUsIFNfb3JfYSkuCisnJHdyaXRlX3Rlcm1fb3AxJyhPcCwgeGZ4LCBbQTEsQTJdLCBQcmVjT3AsIFR5cGUwLCBUeXBlLCBTdHlsZSwgU19vcl9hKSA6LSAhLAorCVByZWMxIGlzIFByZWNPcCAtIDEsCisJUHJlYzIgaXMgUHJlY09wIC0gMSwKKwknJHdyaXRlX3Rlcm0wJyhBMSwgUHJlYzEsIFR5cGUwLCBUeXBlMSwgU3R5bGUsIFNfb3JfYSksCisJJyR3cml0ZV90ZXJtX2luZml4X29wJyhPcCwgVHlwZTEsIFR5cGUyLCBTdHlsZSwgU19vcl9hKSwKKwknJHdyaXRlX3Rlcm0wJyhBMiwgUHJlYzIsIFR5cGUyLCBUeXBlLCBTdHlsZSwgU19vcl9hKS4KKyckd3JpdGVfdGVybV9vcDEnKE9wLCB4ZnksIFtBMSxBMl0sIFByZWNPcCwgVHlwZTAsIFR5cGUsIFN0eWxlLCBTX29yX2EpIDotICEsCisJUHJlYzEgaXMgUHJlY09wIC0gMSwKKwlQcmVjMiBpcyBQcmVjT3AsCisJJyR3cml0ZV90ZXJtMCcoQTEsIFByZWMxLCBUeXBlMCwgVHlwZTEsIFN0eWxlLCBTX29yX2EpLAorCSckd3JpdGVfdGVybV9pbmZpeF9vcCcoT3AsIFR5cGUxLCBUeXBlMiwgU3R5bGUsIFNfb3JfYSksCisJJyR3cml0ZV90ZXJtMCcoQTIsIFByZWMyLCBUeXBlMiwgVHlwZSwgU3R5bGUsIFNfb3JfYSkuCisnJHdyaXRlX3Rlcm1fb3AxJyhPcCwgeWZ4LCBbQTEsQTJdLCBQcmVjT3AsIFR5cGUwLCBUeXBlLCBTdHlsZSwgU19vcl9hKSA6LSAhLAorCVByZWMxIGlzIFByZWNPcCwKKwlQcmVjMiBpcyBQcmVjT3AgLSAxLAorCSckd3JpdGVfdGVybTAnKEExLCBQcmVjMSwgVHlwZTAsIFR5cGUxLCBTdHlsZSwgU19vcl9hKSwKKwknJHdyaXRlX3Rlcm1faW5maXhfb3AnKE9wLCBUeXBlMSwgVHlwZTIsIFN0eWxlLCBTX29yX2EpLAorCSckd3JpdGVfdGVybTAnKEEyLCBQcmVjMiwgVHlwZTIsIFR5cGUsIFN0eWxlLCBTX29yX2EpLgorCQorJyR3cml0ZV90ZXJtX2luZml4X29wJygnLCcsIFR5cGUwLCBwdW5jdCwgXywgU19vcl9hKSA6LSAhLAorCSckd3JpdGVfc3BhY2VfaWZfbmVlZGVkJyhUeXBlMCwgcHVuY3QsIFNfb3JfYSksCisJcHV0X2NoYXIoU19vcl9hLCAnLCcpLgorJyR3cml0ZV90ZXJtX2luZml4X29wJyhPcCwgVHlwZTAsIFR5cGUsIFN0eWxlLCBTX29yX2EpIDotCisJJyR3cml0ZV9hdG9tJyhPcCwgVHlwZTAsIFR5cGUsIFN0eWxlLCBTX29yX2EpLgorCisnJHdyaXRlX3Rlcm1fbGlzdF9hcmdzJyhbQXxBc10sIFR5cGUwLCBUeXBlLCBTdHlsZSwgU19vcl9hKSA6LSAKKwlub252YXIoQXMpLCBBcyA9IFtffF9dLCAKKwkhLAorCSckd3JpdGVfdGVybTAnKEEsIDk5OSwgVHlwZTAsIFR5cGUxLCBTdHlsZSwgU19vcl9hKSwKKwknJHdyaXRlX3NwYWNlX2lmX25lZWRlZCcoVHlwZTEsIHB1bmN0LCBTX29yX2EpLAorCXB1dF9jaGFyKFNfb3JfYSwgJywnKSwKKwknJHdyaXRlX3Rlcm1fbGlzdF9hcmdzJyhBcywgcHVuY3QsIFR5cGUsIFN0eWxlLCBTX29yX2EpLgorCisnJHdyaXRlX3Rlcm1fbGlzdF9hcmdzJyhbQXxBc10sIFR5cGUwLCBUeXBlLCBTdHlsZSwgU19vcl9hKSA6LSAKKwlub252YXIoQXMpLCBBcyA9IFtdLCAKKwkhLAorCSckd3JpdGVfdGVybTAnKEEsIDk5OSwgVHlwZTAsIFR5cGUsIFN0eWxlLCBTX29yX2EpLgorCisnJHdyaXRlX3Rlcm1fbGlzdF9hcmdzJyhbQXxBc10sIFR5cGUwLCBUeXBlLCBTdHlsZSwgU19vcl9hKSA6LQorCSckd3JpdGVfdGVybTAnKEEsIDk5OSwgVHlwZTAsIFR5cGUxLCBTdHlsZSwgU19vcl9hKSwKKwknJHdyaXRlX3NwYWNlX2lmX25lZWRlZCcoVHlwZTEsIHB1bmN0LCBTX29yX2EpLAorCXB1dF9jaGFyKFNfb3JfYSwgJ3wnKSwKKwknJHdyaXRlX3Rlcm0wJyhBcywgOTk5LCBwdW5jdCwgVHlwZSwgU3R5bGUsIFNfb3JfYSkuCisKKyckd3JpdGVfdGVybV9hcmdzJyhbXSwgVHlwZSwgVHlwZSwgXywgXykgOi0gIS4KKyckd3JpdGVfdGVybV9hcmdzJyhbQV0sIFR5cGUwLCBUeXBlLCBTdHlsZSwgU19vcl9hKSA6LSAhLAorCSckd3JpdGVfdGVybTAnKEEsIDk5OSwgVHlwZTAsIFR5cGUsIFN0eWxlLCBTX29yX2EpLgorJyR3cml0ZV90ZXJtX2FyZ3MnKFtBfEFzXSwgVHlwZTAsIFR5cGUsIFN0eWxlLCBTX29yX2EpIDotICEsCisJJyR3cml0ZV90ZXJtMCcoQSwgOTk5LCBUeXBlMCwgVHlwZTEsIFN0eWxlLCBTX29yX2EpLAorCSckd3JpdGVfc3BhY2VfaWZfbmVlZGVkJyhUeXBlMSwgcHVuY3QsIFNfb3JfYSksCisJcHV0X2NoYXIoU19vcl9hLCAnLCcpLAorCSckd3JpdGVfdGVybV9hcmdzJyhBcywgcHVuY3QsIFR5cGUsIFN0eWxlLCBTX29yX2EpLgorCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCislIFRlcm0gaW5wdXQvb3V0cHV0IChvdGhlcnMpCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCis6LSBwdWJsaWMgb3AvMy4KKzotIHB1YmxpYyBjdXJyZW50X29wLzMuCis6LSBkeW5hbWljICckY3VycmVudF9vcGVyYXRvcicvMy4KKworb3AoUHJpb3JpdHksIE9wX3NwZWNpZmllciwgT3BlcmF0b3IpIDotCisJaW50ZWdlcihQcmlvcml0eSksIAorCTAgPTxQcmlvcml0eSwgUHJpb3JpdHkgPTwxMjAwLAorCSEsCisJJyRvcDEnKFByaW9yaXR5LCBPcF9zcGVjaWZpZXIsIE9wZXJhdG9yKS4KK29wKFByaW9yaXR5LCBPcF9zcGVjaWZpZXIsIE9wZXJhdG9yKSA6LQorICAgICAgICBpbGxhcmcoZG9tYWluKGludGVnZXIsMC0xMjAwKSwgb3AoUHJpb3JpdHksT3Bfc3BlY2lmaWVyLE9wZXJhdG9yKSwgMSkuCisKKyckb3AxJyhQcmlvcml0eSwgT3Bfc3BlY2lmaWVyLCBPcGVyYXRvcikgOi0gCisJbm9udmFyKE9wX3NwZWNpZmllciksCisJJyRvcF9zcGVjaWZpZXInKE9wX3NwZWNpZmllciwgXyksCisJISwKKwknJG9wMicoUHJpb3JpdHksIE9wX3NwZWNpZmllciwgT3BlcmF0b3IpLgorJyRvcDEnKFByaW9yaXR5LCBPcF9zcGVjaWZpZXIsIE9wZXJhdG9yKSA6LSAKKyAgICAgICAgZmluZGFsbChYLCAnJG9wX3NwZWNpZmllcicoWCxfKSwgRG9tYWluKSwgCisJaWxsYXJnKGRvbWFpbih0ZXJtLERvbWFpbiksIG9wKFByaW9yaXR5LE9wX3NwZWNpZmllcixPcGVyYXRvciksIDIpLgorCisnJG9wMicoUHJpb3JpdHksIE9wX3NwZWNpZmllciwgT3BlcmF0b3IpIDotIAorCWF0b20oT3BlcmF0b3IpLCAKKwkhLAorCSckYWRkX29wZXJhdG9ycycoW09wZXJhdG9yXSwgUHJpb3JpdHksIE9wX3NwZWNpZmllcikuCisnJG9wMicoUHJpb3JpdHksIE9wX3NwZWNpZmllciwgT3BlcmF0b3IpIDotIAorCSckb3BfYXRvbV9saXN0JyhPcGVyYXRvciwgQXRvbXMpLAorCSEsCisJJyRhZGRfb3BlcmF0b3JzJyhBdG9tcywgUHJpb3JpdHksIE9wX3NwZWNpZmllcikuCisnJG9wMicoUHJpb3JpdHksIE9wX3NwZWNpZmllciwgT3BlcmF0b3IpIDotIAorICAgICAgICBpbGxhcmcodHlwZShsaXN0KGF0b20pKSwgb3AoUHJpb3JpdHksT3Bfc3BlY2lmaWVyLE9wZXJhdG9yKSwgMykuCisKKyckYWRkX29wZXJhdG9ycycoW10sIF8sIF8pIDotICEuCisnJGFkZF9vcGVyYXRvcnMnKFtBfEFzXSwgUHJpb3JpdHksIE9wX3NwZWNpZmllcikgOi0gCisJJyRhZGRfb3AnKEEsIFByaW9yaXR5LCBPcF9zcGVjaWZpZXIpLAorCSckYWRkX29wZXJhdG9ycycoQXMsIFByaW9yaXR5LCBPcF9zcGVjaWZpZXIpLgorCisnJGFkZF9vcCcoJywnLCBQcmlvcml0eSwgT3Bfc3BlY2lmaWVyKSA6LSAhLAorCWlsbGFyZyhwZXJtaXNzaW9uKG1vZGlmeSxvcGVyYXRvciwnLCcsXyksIG9wKFByaW9yaXR5LE9wX3NwZWNpZmllciwnLCcpLCAzKS4KKyckYWRkX29wJyhBLCBfLCBPcF9zcGVjaWZpZXIpIDotCisJY2xhdXNlKCckY3VycmVudF9vcGVyYXRvcicoXyxPcF9zcGVjaWZpZXIwLEEpLCBfKSwKKwknJG9wX3NwZWNpZmllcicoT3Bfc3BlY2lmaWVyLCBDbGFzcyksCisJJyRvcF9zcGVjaWZpZXInKE9wX3NwZWNpZmllcjAsIENsYXNzMCksCisJQ2xhc3MgPSBDbGFzczAsCisJcmV0cmFjdCgnJGN1cnJlbnRfb3BlcmF0b3InKF8sT3Bfc3BlY2lmaWVyMCxBKSksCisJZmFpbC4KKyckYWRkX29wJyhfLCAwLCBfKSA6LSAhLgorJyRhZGRfb3AnKEEsIFByaW9yaXR5LCBPcF9zcGVjaWZpZXIpIDotCisJYXNzZXJ0eignJGN1cnJlbnRfb3BlcmF0b3InKFByaW9yaXR5LE9wX3NwZWNpZmllcixBKSkuCisKKyckb3Bfc3BlY2lmaWVyJyggZngsIHByZWZpeCkuCisnJG9wX3NwZWNpZmllcicoIGZ5LCBwcmVmaXgpLgorJyRvcF9zcGVjaWZpZXInKHhmeCwgaW5maXgpLgorJyRvcF9zcGVjaWZpZXInKHhmeSwgaW5maXgpLgorJyRvcF9zcGVjaWZpZXInKHlmeCwgaW5maXgpLgorJyRvcF9zcGVjaWZpZXInKCB4ZiwgcG9zdGZpeCkuCisnJG9wX3NwZWNpZmllcicoIHlmLCBwb3N0Zml4KS4KKworJyRvcF9hdG9tX2xpc3QnKFgsIF8pIDotIHZhcihYKSwgISwgZmFpbC4KKyckb3BfYXRvbV9saXN0JyhbXSwgW10pIDotICEuCisnJG9wX2F0b21fbGlzdCcoW1h8WHNdLCBbWHxBc10pIDotIGF0b20oWCksICEsCisJJyRvcF9hdG9tX2xpc3QnKFhzLCBBcykuCisKK2N1cnJlbnRfb3AoUHJpb3JpdHksIE9wX3NwZWNpZmllciwgT3BlcmF0b3IpIDotCisJY2xhdXNlKCckY3VycmVudF9vcGVyYXRvcicoUHJpb3JpdHksT3Bfc3BlY2lmaWVyLE9wZXJhdG9yKSwgXykuCisKKyckY3VycmVudF9vcGVyYXRvcicoIDEyMDAsIHhmeCwgKDotKSkuCisnJGN1cnJlbnRfb3BlcmF0b3InKCAxMjAwLCB4ZngsICgtLT4pKS4KKyckY3VycmVudF9vcGVyYXRvcicoIDEyMDAsICBmeCwgKDotKSkuCisnJGN1cnJlbnRfb3BlcmF0b3InKCAxMjAwLCAgZngsICg/LSkpLgorJyRjdXJyZW50X29wZXJhdG9yJyggMTE1MCwgIGZ4LCAocGFja2FnZSkpLgorJyRjdXJyZW50X29wZXJhdG9yJyggMTE1MCwgIGZ4LCAoaW1wb3J0KSkuCisnJGN1cnJlbnRfb3BlcmF0b3InKCAxMTUwLCAgZngsIChwdWJsaWMpKS4KKyckY3VycmVudF9vcGVyYXRvcicoIDExNTAsICBmeCwgKGR5bmFtaWMpKS4KKyckY3VycmVudF9vcGVyYXRvcicoIDExNTAsICBmeCwgKG1ldGFfcHJlZGljYXRlKSkuCisnJGN1cnJlbnRfb3BlcmF0b3InKCAxMTUwLCAgZngsIChtb2RlKSkuCisnJGN1cnJlbnRfb3BlcmF0b3InKCAxMTUwLCAgZngsIChtdWx0aWZpbGUpKS4KKyckY3VycmVudF9vcGVyYXRvcicoIDExNTAsICBmeCwgKGJsb2NrKSkuCisnJGN1cnJlbnRfb3BlcmF0b3InKCAxMTAwLCB4ZnksICg7KSkuCisnJGN1cnJlbnRfb3BlcmF0b3InKCAxMDUwLCB4ZnksICgtPikpLgorJyRjdXJyZW50X29wZXJhdG9yJyggMTAwMCwgeGZ5LCAoJywnKSkuCisnJGN1cnJlbnRfb3BlcmF0b3InKCAgOTAwLCAgZnksIChcKykpLgorJyRjdXJyZW50X29wZXJhdG9yJyggIDcwMCwgeGZ4LCAoPSkpLgorJyRjdXJyZW50X29wZXJhdG9yJyggIDcwMCwgeGZ4LCAoXD0pKS4KKyckY3VycmVudF9vcGVyYXRvcicoICA3MDAsIHhmeCwgKD09KSkuCisnJGN1cnJlbnRfb3BlcmF0b3InKCAgNzAwLCB4ZngsIChcPT0pKS4KKyckY3VycmVudF9vcGVyYXRvcicoICA3MDAsIHhmeCwgKEA8KSkuCisnJGN1cnJlbnRfb3BlcmF0b3InKCAgNzAwLCB4ZngsIChAPikpLgorJyRjdXJyZW50X29wZXJhdG9yJyggIDcwMCwgeGZ4LCAoQD08KSkuCisnJGN1cnJlbnRfb3BlcmF0b3InKCAgNzAwLCB4ZngsIChAPj0pKS4KKyckY3VycmVudF9vcGVyYXRvcicoICA3MDAsIHhmeCwgKD0uLikpLgorJyRjdXJyZW50X29wZXJhdG9yJyggIDcwMCwgeGZ4LCAoaXMpKS4KKyckY3VycmVudF9vcGVyYXRvcicoICA3MDAsIHhmeCwgKD06PSkpLgorJyRjdXJyZW50X29wZXJhdG9yJyggIDcwMCwgeGZ4LCAoPVw9KSkuCisnJGN1cnJlbnRfb3BlcmF0b3InKCAgNzAwLCB4ZngsICg8KSkuCisnJGN1cnJlbnRfb3BlcmF0b3InKCAgNzAwLCB4ZngsICg+KSkuCisnJGN1cnJlbnRfb3BlcmF0b3InKCAgNzAwLCB4ZngsICg9PCkpLgorJyRjdXJyZW50X29wZXJhdG9yJyggIDcwMCwgeGZ4LCAoPj0pKS4KKyckY3VycmVudF9vcGVyYXRvcicoICA1NTAsIHhmeSwgKDopKS4KKyckY3VycmVudF9vcGVyYXRvcicoICA1MDAsIHlmeCwgKCspKS4KKyckY3VycmVudF9vcGVyYXRvcicoICA1MDAsIHlmeCwgKC0pKS4KKyckY3VycmVudF9vcGVyYXRvcicoICA1MDAsIHlmeCwgKCMpKS4KKyckY3VycmVudF9vcGVyYXRvcicoICA1MDAsIHlmeCwgKC9cKSkuCisnJGN1cnJlbnRfb3BlcmF0b3InKCAgNTAwLCB5ZngsIChcLykpLgorJyRjdXJyZW50X29wZXJhdG9yJyggIDUwMCwgIGZ4LCAoKykpLgorJyRjdXJyZW50X29wZXJhdG9yJyggIDQwMCwgeWZ4LCAoKikpLgorJyRjdXJyZW50X29wZXJhdG9yJyggIDQwMCwgeWZ4LCAoLykpLgorJyRjdXJyZW50X29wZXJhdG9yJyggIDQwMCwgeWZ4LCAoLy8pKS4KKyckY3VycmVudF9vcGVyYXRvcicoICA0MDAsIHlmeCwgKG1vZCkpLgorJyRjdXJyZW50X29wZXJhdG9yJyggIDQwMCwgeWZ4LCAocmVtKSkuCisnJGN1cnJlbnRfb3BlcmF0b3InKCAgNDAwLCB5ZngsICg8PCkpLgorJyRjdXJyZW50X29wZXJhdG9yJyggIDQwMCwgeWZ4LCAoPj4pKS4KKyckY3VycmVudF9vcGVyYXRvcicoICAzMDAsIHhmeCwgKH4pKS4KKyckY3VycmVudF9vcGVyYXRvcicoICAyMDAsIHhmeCwgKCoqKSkuCisnJGN1cnJlbnRfb3BlcmF0b3InKCAgMjAwLCB4ZnksICheKSkuCisnJGN1cnJlbnRfb3BlcmF0b3InKCAgMjAwLCAgZnksIChcKSkuCisnJGN1cnJlbnRfb3BlcmF0b3InKCAgMjAwLCAgZnksICgtKSkuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUgTG9naWMgYW5kIGNvbnRyb2wKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKzotIHB1YmxpYyAoXCspLzEuCis6LSBwdWJsaWMgb25jZS8xLgorOi0gcHVibGljIHJlcGVhdC8wLgorCitcKyhHKSA6LSBjYWxsKEcpLCAhLCBmYWlsLgorXCsoXykuCisKK3JlcGVhdC4KK3JlcGVhdCA6LSByZXBlYXQuCisKK29uY2UoRykgOi0gY2FsbChHKSwgIS4KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSBBdG9taWMgdGVybSBwcm9jZXNzaW5nCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCislOi0gcHVibGljIGF0b21fbGVuZ3RoLzIuICAgICAgICAgICAgICAgICAgd3JpdHRlbiBpbiBKYXZhCislOi0gcHVibGljIGF0b21fY29uY2F0LzMuICAgICAgICAgICAgICAgICAgd3JpdHRlbiBpbiBKYXZhCis6LSBwdWJsaWMgc3ViX2F0b20vNS4KKyU6LSBwdWJsaWMgYXRvbV9jaGFycy8yLCBhdG9tX2NvZGVzLzIuICAgICB3cml0dGVuIGluIEphdmEKKyU6LSBwdWJsaWMgY2hhcl9jb2RlLzIuICAgICAgICAgICAgICAgICAgICB3cml0dGVuIGluIEphdmEKKyU6LSBwdWJsaWMgbnVtYmVyX2NoYXJzLzIsIG51bWJlcl9jb2Rlcy8yLiB3cml0dGVuIGluIEphdmEKKzotIHB1YmxpYyBuYW1lLzIuCisKK3N1Yl9hdG9tKEF0b20sIEJlZm9yZSwgTGVuZ3RoLCBBZnRlciwgU3ViX2F0b20pIDotCisgICAgYXRvbV9jb25jYXQoQXRvbUwsIFgsIEF0b20pLAorICAgIGF0b21fbGVuZ3RoKEF0b21MLCBCZWZvcmUpLAorICAgIGF0b21fY29uY2F0KFN1Yl9hdG9tLCBBdG9tUiwgWCksCisgICAgYXRvbV9sZW5ndGgoU3ViX2F0b20sIExlbmd0aCksCisgICAgYXRvbV9sZW5ndGgoQXRvbVIsIEFmdGVyKS4KKworbmFtZShDb25zdGFudCwgQ2hhcnMpIDotCisJbm9udmFyKENvbnN0YW50KSwKKwkoICAgbnVtYmVyKENvbnN0YW50KSAtPiBudW1iZXJfY29kZXMoQ29uc3RhbnQsIENoYXJzKQorCTsgICBhdG9taWMoQ29uc3RhbnQpIC0+IGF0b21fY29kZXMoQ29uc3RhbnQsIENoYXJzKQorCTsgICBpbGxhcmcodHlwZShhdG9taWMpLCBuYW1lKENvbnN0YW50LENoYXJzKSwgMSkKKwkpLgorbmFtZShDb25zdGFudCwgQ2hhcnMpIDotCisJdmFyKENvbnN0YW50KSwKKwkoICAgbnVtYmVyX2NvZGVzKENvbnN0YW50MCwgQ2hhcnMpIC0+IENvbnN0YW50ID0gQ29uc3RhbnQwCisJOyAgIGF0b21fY29kZXMoQ29uc3RhbnQwLCBDaGFycykgLT4gQ29uc3RhbnQgPSBDb25zdGFudDAKKwk7ICAgaWxsYXJnKHR5cGUobGlzdChjaGFyKSksIG5hbWUoQ29uc3RhbnQsQ2hhcnMpLCAyKQorCSkuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUgSW1wbGVtZW50YXRpb24gZGVmaW5lZCBob29rcworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorOi0gcHVibGljIHNldF9wcm9sb2dfZmxhZy8yLgorOi0gcHVibGljIGN1cnJlbnRfcHJvbG9nX2ZsYWcvMi4KKworc2V0X3Byb2xvZ19mbGFnKEZsYWcsIFZhbHVlKSA6LSB2YXIoRmxhZyksICEsIAorCWlsbGFyZyh2YXIsIHNldF9wcm9sb2dfZmxhZyhGbGFnLFZhbHVlKSwgMSkuCitzZXRfcHJvbG9nX2ZsYWcoRmxhZywgVmFsdWUpIDotIHZhcihWYWx1ZSksICEsIAorCWlsbGFyZyh2YXIsIHNldF9wcm9sb2dfZmxhZyhGbGFnLFZhbHVlKSwgMikuCitzZXRfcHJvbG9nX2ZsYWcoRmxhZywgVmFsdWUpIDotIGF0b20oRmxhZyksICEsIAorCSckc2V0X3Byb2xvZ19mbGFnMCcoRmxhZywgVmFsdWUpLgorc2V0X3Byb2xvZ19mbGFnKEZsYWcsIFZhbHVlKSA6LSAKKwlpbGxhcmcodHlwZShhdG9tKSwgc2V0X3Byb2xvZ19mbGFnKEZsYWcsVmFsdWUpLCAxKS4KKworJyRzZXRfcHJvbG9nX2ZsYWcwJyhGbGFnLCBWYWx1ZSkgOi0gCisJJyRwcm9sb2dfaW1wbF9mbGFnJyhGbGFnLCBNb2RlLCBjaGFuZ2VhYmxlKFlOKSksCisJISwKKwknJHNldF9wcm9sb2dfZmxhZzAnKFlOLCBGbGFnLCBWYWx1ZSwgTW9kZSkuCisnJHNldF9wcm9sb2dfZmxhZzAnKEZsYWcsIFZhbHVlKSA6LSAKKwlpbGxhcmcoZG9tYWluKGF0b20scHJvbG9nX2ZsYWcpLCBzZXRfcHJvbG9nX2ZsYWcoRmxhZyxWYWx1ZSksIDEpLgorCisnJHNldF9wcm9sb2dfZmxhZzAnKG5vLCBGbGFnLCBWYWx1ZSwgXykgOi0gISwKKyAgICAgICAgaWxsYXJnKHBlcm1pc3Npb24obW9kaWZ5LGZsYWcsRmxhZyxfKSwgc2V0X3Byb2xvZ19mbGFnKEZsYWcsVmFsdWUpLCBfKS4KKyckc2V0X3Byb2xvZ19mbGFnMCcoXywgRmxhZywgVmFsdWUsIE1vZGUpIDotCisJJyRidWlsdGluX21lbWJlcicoVmFsdWUsIE1vZGUpLAorCSEsCisJJyRzZXRfcHJvbG9nX2ltcGxfZmxhZycoRmxhZywgVmFsdWUpLgorJyRzZXRfcHJvbG9nX2ZsYWcwJyhfLCBGbGFnLCBWYWx1ZSwgXykgOi0KKwlpbGxhcmcoZG9tYWluKGF0b20sZmxhZ192YWx1ZSksIHNldF9wcm9sb2dfZmxhZyhGbGFnLFZhbHVlKSwgMikuCisKK2N1cnJlbnRfcHJvbG9nX2ZsYWcoRmxhZywgVGVybSkgOi0gdmFyKEZsYWcpLCAhLAorCSckcHJvbG9nX2ltcGxfZmxhZycoRmxhZywgXywgXyksCisJJyRnZXRfcHJvbG9nX2ltcGxfZmxhZycoRmxhZywgVGVybSkuCitjdXJyZW50X3Byb2xvZ19mbGFnKEZsYWcsIFRlcm0pIDotIGF0b20oRmxhZyksICEsCisJKCAgICckcHJvbG9nX2ltcGxfZmxhZycoRmxhZywgXywgXykgLT4gJyRnZXRfcHJvbG9nX2ltcGxfZmxhZycoRmxhZywgVGVybSkKKyAgICAgICAgOyAgIGlsbGFyZyhkb21haW4oYXRvbSxwcm9sb2dfZmxhZyksIGN1cnJlbnRfcHJvbG9nX2ZsYWcoRmxhZyxUZXJtKSwgMSkKKyAgICAgICAgKS4KK2N1cnJlbnRfcHJvbG9nX2ZsYWcoRmxhZywgVGVybSkgOi0gCisJaWxsYXJnKHR5cGUoYXRvbSksIGN1cnJlbnRfcHJvbG9nX2ZsYWcoRmxhZyxUZXJtKSwgMSkuCisKKyUgJyRwcm9sb2dfaW1wbF9mbGFnJyhib3VuZGVkLCAgICAgXywgY2hhbmdlYWJsZShubykpLiAKKyckcHJvbG9nX2ltcGxfZmxhZycobWF4X2ludGVnZXIsIF8sIGNoYW5nZWFibGUobm8pKS4KKyckcHJvbG9nX2ltcGxfZmxhZycobWluX2ludGVnZXIsIF8sIGNoYW5nZWFibGUobm8pKS4KKyUgJyRwcm9sb2dfaW1wbF9mbGFnJyhpbnRlZ2VyX3JvdW5kaW5nX2Z1bmN0aW9uLCBbZG93bix0b3dhcmRfemVyb10sIGNoYW5nZWFibGUobm8pKS4KKyUgJyRwcm9sb2dfaW1wbF9mbGFnJyhjaGFyX2NvbnZlcnNpb24sIFtvbixvZmZdLCBjaGFuZ2VhYmxlKG5vKSkuCisnJHByb2xvZ19pbXBsX2ZsYWcnKGRlYnVnLCBbb24sb2ZmXSwgY2hhbmdlYWJsZSh5ZXMpKS4KKyckcHJvbG9nX2ltcGxfZmxhZycobWF4X2FyaXR5LCBfLCBjaGFuZ2VhYmxlKG5vKSkuCisnJHByb2xvZ19pbXBsX2ZsYWcnKHVua25vd24sIFtlcnJvcixmYWlsLHdhcm5pbmddLCBjaGFuZ2VhYmxlKHllcykpLgorJyRwcm9sb2dfaW1wbF9mbGFnJyhkb3VibGVfcXVvdGVzLCBbY2hhcnMsY29kZXMsYXRvbV0sIGNoYW5nZWFibGUobm8pKS4KKyckcHJvbG9nX2ltcGxfZmxhZycocHJpbnRfc3RhY2tfdHJhY2UsIFtvbixvZmZdLCBjaGFuZ2VhYmxlKHllcykpLgorCis6LSBwdWJsaWMgaGFsdC8wLgorJTotIHB1YmxpYyBoYWx0LzEuICh3cml0dGVuIGluIEphdmEpCis6LSBwdWJsaWMgYWJvcnQvMC4KKworaGFsdCA6LSBoYWx0KDEpLgorCithYm9ydCA6LSByYWlzZV9leGNlcHRpb24oJ0V4ZWN1dGlvbiBhYm9ydGVkJykuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUgRENHCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCis6LSBwdWJsaWMgJ0MnLzMsIGV4cGFuZF90ZXJtLzIuCisKKydDJyhbWHxTXSwgWCwgUykuCisKK2V4cGFuZF90ZXJtKERjZywgQ2wpIDotIHZhcihEY2cpLCAhLCBEY2cgPSBDbC4KK2V4cGFuZF90ZXJtKERjZywgQ2wpIDotICckZGNnX2V4cGFuc2lvbicoRGNnLCBDbDApLCAhLCBDbDAgPSBDbC4KK2V4cGFuZF90ZXJtKERjZywgRGNnKS4KKworJyRkY2dfZXhwYW5zaW9uJyhEY2csIENsKSA6LSB2YXIoRGNnKSwgISwgRGNnID0gQ2wuCisnJGRjZ19leHBhbnNpb24nKChIZWFkIC0tPiBCKSwgKEgxIDotIEcxLCBHMikpIDotCisJbm9udmFyKEhlYWQpLAorCUhlYWQgPSAoSCwgTGlzdCksCisJTGlzdCA9IFtffF9dLAorCSEsCisJJyRkY2dfdHJhbnNsYXRpb25fYXRvbScoSCwgSDEsIFMwLCBTMSksCisJJyRkY2dfdHJhbnNsYXRpb24nKEIsIEcxLCBTMCwgUyksCisJJyRkY2dfdHJhbnNsYXRpb24nKExpc3QsIEcyLCBTMSwgUykuCisnJGRjZ19leHBhbnNpb24nKChIIC0tPiBCKSwgKEgxIDotIEIxKSkgOi0KKwknJGRjZ190cmFuc2xhdGlvbl9hdG9tJyhILCBIMSwgUzAsIFMpLAorCSckZGNnX3RyYW5zbGF0aW9uJyhCLCBCMSwgUzAsIFMpLgorCisnJGRjZ190cmFuc2xhdGlvbl9hdG9tJyhYLCBwaHJhc2UoWCxTMCxTKSwgUzAsIFMpIDotIAorCXZhcihYKSwKKwkhLgorJyRkY2dfdHJhbnNsYXRpb25fYXRvbScoTTpYLCBNOlgxLCBTMCwgUykgOi0gISwKKwknJGRjZ190cmFuc2xhdGlvbl9hdG9tJyhYLCBYMSwgUzAsIFMpLgorJyRkY2dfdHJhbnNsYXRpb25fYXRvbScoWCwgWDEsIFMwLCBTKSA6LQorCVggPS4uIFtGfEFzXSwKKwknJGJ1aWx0aW5fYXBwZW5kJyhBcywgW1MwLFNdLCBBczEpLAorCVgxID0uLiBbRnxBczFdLgorCisnJGRjZ190cmFuc2xhdGlvbicoWCwgWSwgUzAsIFMpIDotCisJJyRkY2dfdHJhbnMnKFgsIFkwLCBULCBTMCwgUyksCisJJyRkY2dfdHJhbnMwJyhZMCwgWSwgVCwgUzAsIFMpLgorCisnJGRjZ190cmFuczAnKFksIFksIFQsIFMwLCBUKSA6LSBUIFw9PSBTMCwgIS4KKyckZGNnX3RyYW5zMCcoWTAsIFksIFQsIF8sIFMpIDotICckZGNnX2NvbmNhdCcoWTAsIFM9VCwgWSkuCisKKyckZGNnX2NvbmNhdCcoWCwgWSwgWikgOi0gWCA9PSB0cnVlLCAhLCBaID0gWS4KKyckZGNnX2NvbmNhdCcoWCwgWSwgWikgOi0gWSA9PSB0cnVlLCAhLCBaID0gWC4KKyckZGNnX2NvbmNhdCcoWCwgWSwgKFgsWSkpLgorCisnJGRjZ190cmFucycoWCwgWDEsIFMsIFMwLCBTKSA6LSB2YXIoWCksICEsCisJJyRkY2dfdHJhbnNsYXRpb25fYXRvbScoWCwgWDEsIFMwLCBTKS4KKyckZGNnX3RyYW5zJyhNOlgsIE06WSwgVCwgUzAsIFMpIDotICEsCisJJyRkY2dfdHJhbnMnKFgsIFksIFQsIFMwLCBTKS4KKyckZGNnX3RyYW5zJyhbXSwgdHJ1ZSwgUzAsIFMwLCBfKSA6LSAhLgorJyRkY2dfdHJhbnMnKFtYfFldLCBaLCBULCBTMCwgUykgOi0gISwKKwknJGRjZ190cmFucycoWSwgWTEsIFQsIFMxLCBTKSwKKwknJGRjZ19jb25jYXQnKCdDJyhTMCxYLFMxKSwgWTEsIFopLgorJyRkY2dfdHJhbnMnKFwrWCwgKFgxIC0+IGZhaWw7IFM9UzApLCBTLCBTMCwgUykgOi0gISwKKwknJGRjZ190cmFucycoWCwgWDEsIFMxLCBTMCwgUzEpLgorJyRkY2dfdHJhbnMnKChYLFkpLCBaLCBULCBTMCwgUykgOi0gISwKKwknJGRjZ190cmFucycoWCwgWDEsIFMxLCBTMCwgUzEpLAorCSckZGNnX3RyYW5zJyhZLCBZMSwgVCwgUzEsIFMpLAorCSckZGNnX2NvbmNhdCcoWDEsIFkxLCBaKS4KKyckZGNnX3RyYW5zJygoWC0+WSksIChYMS0+WTEpLCBULCBTMCwgUykgOi0gISwKKwknJGRjZ190cmFucycoWCwgWDEsIFMxLCBTMCwgUzEpLAorCSckZGNnX3RyYW5zJyhZLCBZMSwgVCwgUzEsIFMpLgorJyRkY2dfdHJhbnMnKChYO1kpLCAoWDE7WTEpLCBTLCBTMCwgUykgOi0gISwKKwknJGRjZ190cmFuc2xhdGlvbicoWCwgWDEsIFMwLCBTKSwKKwknJGRjZ190cmFuc2xhdGlvbicoWSwgWTEsIFMwLCBTKS4KKyckZGNnX3RyYW5zJyghLCAhLCBTMCwgUzAsIF8pIDotICEuCisnJGRjZ190cmFucycoe0d9LCBjYWxsKEcpLCBTMCwgUzAsIF8pIDotIHZhcihHKSwgIS4KKyckZGNnX3RyYW5zJyh7R30sIEcsIFMwLCBTMCwgXykgOi0gIS4KKyckZGNnX3RyYW5zJyhYLCBYMSwgUywgUzAsIFMpIDotCisJJyRkY2dfdHJhbnNsYXRpb25fYXRvbScoWCwgWDEsIFMwLCBTKS4KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSBIYXNoIGNyZWF0aW9uIGFuZCBjb250cm9sCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCis6LSBwdWJsaWMgbmV3X2hhc2gvMS4KKyU6LSBwdWJsaWMgbmV3X2hhc2gvMi4gICAgICAgICAgd3JpdHRlbiBpbiBKYXZhCislOi0gcHVibGljIGhhc2hfY2xlYXIvMS4gICAgICAgIHdyaXR0ZW4gaW4gSmF2YQorJTotIHB1YmxpYyBoYXNoX2NvbnRhaW5zX2tleS8yLiB3cml0dGVuIGluIEphdmEKKyU6LSBwdWJsaWMgaGFzaF9nZXQvMy4gICAgICAgICAgd3JpdHRlbiBpbiBKYXZhCislOi0gcHVibGljIGhhc2hfaXNfZW1wdHkvMS4gICAgIHdyaXR0ZW4gaW4gSmF2YQorJTotIHB1YmxpYyBoYXNoX2tleXMvMi4gICAgICAgICB3cml0dGVuIGluIEphdmEKKzotIHB1YmxpYyBoYXNoX21hcC8yLgorJTotIHB1YmxpYyBoYXNoX3B1dC8zLiAgICAgICAgICB3cml0dGVuIGluIEphdmEKKyU6LSBwdWJsaWMgaGFzaF9yZW1vdmUvMi4gICAgICAgd3JpdHRlbiBpbiBKYXZhCislOi0gcHVibGljIGhhc2hfc2l6ZS8yLiAgICAgICAgIHdyaXR0ZW4gaW4gSmF2YQorJTotIHB1YmxpYyAnJGdldF9oYXNoX21hbmFnZXInLzEuICB3cml0dGVuIGluIEphdmEKKworbmV3X2hhc2goSGFzaCkgOi0gbmV3X2hhc2goSGFzaCwgW10pLgorCitoYXNoX21hcChIX29yX2EsIExpc3QpIDotCisJaGFzaF9rZXlzKEhfb3JfYSwgS3MwKSwKKwlzb3J0KEtzMCwgS3MpLAorCWhhc2hfbWFwKEtzLCBMaXN0LCBIX29yX2EpLgorCitoYXNoX21hcChbXSwgW10sIF8pIDotICEuCitoYXNoX21hcChbS3xLc10sIFsoSyxWKXxMc10sIEhfb3JfYSkgOi0KKwloYXNoX2dldChIX29yX2EsIEssIFYpLAorCWhhc2hfbWFwKEtzLCBMcywgSF9vcl9hKS4KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSBKYXZhIGludGVyb3BlcmF0aW9uCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCislOi0gcHVibGljIGphdmFfY29uc3RydWN0b3IwLzIuICAgICAgICAgICAgKHdyaXR0ZW4gaW4gSmF2YSkKKyU6LSBwdWJsaWMgamF2YV9kZWNsYXJlZF9jb25zdHJ1Y3RvcjAvMi4gICAod3JpdHRlbiBpbiBKYXZhKQorJTotIHB1YmxpYyBqYXZhX21ldGhvZDAvMy4gICAgICAgICAgICAgICAgICh3cml0dGVuIGluIEphdmEpCislOi0gcHVibGljIGphdmFfZGVjbGFyZWRfbWV0aG9kMC8zLiAgICAgICAgKHdyaXR0ZW4gaW4gSmF2YSkKKyU6LSBwdWJsaWMgamF2YV9nZXRfZmllbGQwLzMuICAgICAgICAgICAgICAod3JpdHRlbiBpbiBKYXZhKQorJTotIHB1YmxpYyBqYXZhX2dldF9kZWNsYXJlZF9maWVsZDAvMy4gICAgICh3cml0dGVuIGluIEphdmEpCislOi0gcHVibGljIGphdmFfc2V0X2ZpZWxkMC8zLiAgICAgICAgICAgICAgKHdyaXR0ZW4gaW4gSmF2YSkKKyU6LSBwdWJsaWMgamF2YV9zZXRfZGVjbGFyZWRfZmllbGQwLzMuICAgICAod3JpdHRlbiBpbiBKYXZhKQorJTotIHB1YmxpYyBqYXZhX2NvbnZlcnNpb24vMi4gICAgICAgICAgICAgICh3cml0dGVuIGluIEphdmEpCis6LSBwdWJsaWMgamF2YV9jb25zdHJ1Y3Rvci8yLgorOi0gcHVibGljIGphdmFfZGVjbGFyZWRfY29uc3RydWN0b3IvMi4KKzotIHB1YmxpYyBqYXZhX21ldGhvZC8zLgorOi0gcHVibGljIGphdmFfZGVjbGFyZWRfbWV0aG9kLzMuCis6LSBwdWJsaWMgamF2YV9nZXRfZmllbGQvMy4KKzotIHB1YmxpYyBqYXZhX2dldF9kZWNsYXJlZF9maWVsZC8zLgorOi0gcHVibGljIGphdmFfc2V0X2ZpZWxkLzMuCis6LSBwdWJsaWMgamF2YV9zZXRfZGVjbGFyZWRfZmllbGQvMy4KKzotIHB1YmxpYyBzeW5jaHJvbml6ZWQvMi4KKworamF2YV9jb25zdHJ1Y3RvcihDb25zdHIsIEluc3RhbmNlKSA6LQorCUNvbnN0ciA9Li4gW0Z8QXNdLAorCWJ1aWx0aW5famF2YV9jb252ZXJ0X2FyZ3MoQXMsIEFzMSksCisJQ29uc3RyMSA9Li4gW0Z8QXMxXSwKKwlqYXZhX2NvbnN0cnVjdG9yMChDb25zdHIxLCBJbnN0YW5jZTEpLAorCUluc3RhbmNlID0gSW5zdGFuY2UxLgorCitqYXZhX2RlY2xhcmVkX2NvbnN0cnVjdG9yKENvbnN0ciwgSW5zdGFuY2UpIDotCisJQ29uc3RyID0uLiBbRnxBc10sCisJYnVpbHRpbl9qYXZhX2NvbnZlcnRfYXJncyhBcywgQXMxKSwKKwlDb25zdHIxID0uLiBbRnxBczFdLAorCWphdmFfZGVjbGFyZWRfY29uc3RydWN0b3IwKENvbnN0cjEsIEluc3RhbmNlMSksCisJSW5zdGFuY2UgPSBJbnN0YW5jZTEuCisKK2phdmFfbWV0aG9kKENsYXNzX29yX0luc3RhbmNlLCBNZXRob2QsIFZhbHVlKSA6LSAKKwlNZXRob2QgPS4uIFtGfEFzXSwKKwlidWlsdGluX2phdmFfY29udmVydF9hcmdzKEFzLCBBczEpLAorCU1ldGhvZDEgPS4uIFtGfEFzMV0sCisJamF2YV9tZXRob2QwKENsYXNzX29yX0luc3RhbmNlLCBNZXRob2QxLCBWYWx1ZTEpLAorCWphdmFfY29udmVyc2lvbihWYWx1ZTIsIFZhbHVlMSksCisJVmFsdWUgPSBWYWx1ZTIuCisKK2phdmFfZGVjbGFyZWRfbWV0aG9kKENsYXNzX29yX0luc3RhbmNlLCBNZXRob2QsIFZhbHVlKSA6LQorCU1ldGhvZCA9Li4gW0Z8QXNdLAorCWJ1aWx0aW5famF2YV9jb252ZXJ0X2FyZ3MoQXMsIEFzMSksCisJTWV0aG9kMSA9Li4gW0Z8QXMxXSwKKwlqYXZhX2RlY2xhcmVkX21ldGhvZDAoQ2xhc3Nfb3JfSW5zdGFuY2UsIE1ldGhvZDEsIFZhbHVlMSksCisJamF2YV9jb252ZXJzaW9uKFZhbHVlMiwgVmFsdWUxKSwKKwlWYWx1ZSA9IFZhbHVlMi4KKworamF2YV9nZXRfZmllbGQoQ2xhc3Nfb3JfSW5zdGFuY2UsIEZpZWxkLCBWYWx1ZSkgOi0KKwlqYXZhX2dldF9maWVsZDAoQ2xhc3Nfb3JfSW5zdGFuY2UsIEZpZWxkLCBWYWx1ZTEpLAorCWphdmFfY29udmVyc2lvbihWYWx1ZTIsIFZhbHVlMSksCisJVmFsdWUgPSBWYWx1ZTIuCisKK2phdmFfZ2V0X2RlY2xhcmVkX2ZpZWxkKENsYXNzX29yX0luc3RhbmNlLCBGaWVsZCwgVmFsdWUpIDotCisJamF2YV9nZXRfZGVjbGFyZWRfZmllbGQwKENsYXNzX29yX0luc3RhbmNlLCBGaWVsZCwgVmFsdWUxKSwKKwlqYXZhX2NvbnZlcnNpb24oVmFsdWUyLCBWYWx1ZTEpLAorCVZhbHVlID0gVmFsdWUyLgorCitqYXZhX3NldF9maWVsZChDbGFzc19vcl9JbnN0YW5jZSwgRmllbGQsIFZhbHVlKSA6LQorCWphdmFfY29udmVyc2lvbihWYWx1ZSwgVmFsdWUxKSwKKwlqYXZhX3NldF9maWVsZDAoQ2xhc3Nfb3JfSW5zdGFuY2UsIEZpZWxkLCBWYWx1ZTEpLgorCitqYXZhX3NldF9kZWNsYXJlZF9maWVsZChDbGFzc19vcl9JbnN0YW5jZSwgRmllbGQsIFZhbHVlKSA6LQorCWphdmFfY29udmVyc2lvbihWYWx1ZSwgVmFsdWUxKSwKKwlqYXZhX3NldF9kZWNsYXJlZF9maWVsZDAoQ2xhc3Nfb3JfSW5zdGFuY2UsIEZpZWxkLCBWYWx1ZTEpLgorCitidWlsdGluX2phdmFfY29udmVydF9hcmdzKFtdLCBbXSkgOi0gIS4KK2J1aWx0aW5famF2YV9jb252ZXJ0X2FyZ3MoW1h8WHNdLCBbWXxZc10pIDotCisJamF2YV9jb252ZXJzaW9uKFgsIFkpLAorCWJ1aWx0aW5famF2YV9jb252ZXJ0X2FyZ3MoWHMsIFlzKS4KKworc3luY2hyb25pemVkKE9iamVjdCwgR29hbCkgOi0gCisJJyRiZWdpbl9zeW5jJyhPYmplY3QsIFJlZiksIAorCWNhbGwoR29hbCksIAorCSckZW5kX3N5bmMnKFJlZikuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUgUHJvbG9nIGludGVycHJldGVyCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCis6LSBvcCgxMTcwLCB4ZngsICg6LSkpLgorOi0gb3AoMTE3MCwgeGZ4LCAoLS0+KSkuCis6LSBvcCgxMTcwLCAgZngsICg6LSkpLgorOi0gb3AoMTE3MCwgIGZ4LCAoPy0pKS4KKworOi0gb3AoMTE1MCwgIGZ4LCAocGFja2FnZSkpLgorOi0gb3AoMTE1MCwgIGZ4LCAoaW1wb3J0KSkuCis6LSBvcCgxMTUwLCAgZngsIChwdWJsaWMpKS4KKzotIG9wKDExNTAsICBmeCwgKGR5bmFtaWMpKS4KKzotIG9wKDExNTAsICBmeCwgKG1ldGFfcHJlZGljYXRlKSkuCis6LSBvcCgxMTUwLCAgZngsIChtb2RlKSkuCis6LSBvcCgxMTUwLCAgZngsIChtdWx0aWZpbGUpKS4KKzotIG9wKDExNTAsICBmeCwgKGJsb2NrKSkuCisKKzotIHB1YmxpYyBjYWZldGVyaWEvMC4KKzotIHB1YmxpYyBjb25zdWx0LzEuCis6LSBwdWJsaWMgdHJhY2UvMCwgbm90cmFjZS8wLgorOi0gcHVibGljIGRlYnVnLzAsIG5vZGVidWcvMC4KKzotIHB1YmxpYyBsZWFzaC8xLgorOi0gcHVibGljIHNweS8xLCBub3NweS8xLCBub3NweWFsbC8wLgorOi0gcHVibGljIGxpc3RpbmcvMC4KKzotIHB1YmxpYyBsaXN0aW5nLzEuCisKKzotIGR5bmFtaWMgJyRjdXJyZW50X2xlYXNoJy8xLgorOi0gZHluYW1pYyAnJGN1cnJlbnRfc3B5cG9pbnQnLzMuCis6LSBkeW5hbWljICckbGVhcF9mbGFnJy8xLgorOi0gZHluYW1pYyAnJGNvbnN1bHRlZF9maWxlJy8xLgorOi0gZHluYW1pYyAnJGNvbnN1bHRlZF9wYWNrYWdlJy8xLgorOi0gZHluYW1pYyAnJGNvbnN1bHRlZF9wcmVkaWNhdGUnLzMuCisKKyUlJSBNYWluCitjYWZldGVyaWEgOi0KKwknJGNhZmV0ZXJpYV9pbml0JywKKwlyZXBlYXQsCisJICAgICckdG9wbHZlbF9sb29wJywKKwkgICAgb25fZXhjZXB0aW9uKE1zZywgJyRjYWZldGVyaWEnKEdvYWwpLCBwcmludF9tZXNzYWdlKGVycm9yLCBNc2cpKSwKKwkgICAgR29hbCA9PSBlbmRfb2ZfZmlsZSwKKwkgICAgISwKKwlubCwgJyRmYXN0X3dyaXRlJyhieWUpLCBubC4KKworJyRjYWZldGVyaWFfaW5pdCcgOi0gCisJcmV0cmFjdGFsbCgnJGxlYXBfZmxhZycoXykpLAorCXJldHJhY3RhbGwoJyRjdXJyZW50X2xlYXNoJyhfKSksCisJcmV0cmFjdGFsbCgnJGN1cnJlbnRfc3B5cG9pbnQnKF8sXyxfKSksCisJcmV0cmFjdGFsbCgnJGNvbnN1bHRlZF9maWxlJyhfKSksCisJcmV0cmFjdGFsbCgnJGNvbnN1bHRlZF9wYWNrYWdlJyhfKSksCisJcmV0cmFjdGFsbCgnJGNvbnN1bHRlZF9wcmVkaWNhdGUnKF8sXyxfKSksCisJYXNzZXJ0eignJGxlYXBfZmxhZycobm8pKSwKKwlhc3NlcnR6KCckY3VycmVudF9sZWFzaCcoY2FsbCkpLAorCWFzc2VydHooJyRjdXJyZW50X2xlYXNoJyhleGl0KSksCisJYXNzZXJ0eignJGN1cnJlbnRfbGVhc2gnKHJlZG8pKSwKKwlhc3NlcnR6KCckY3VycmVudF9sZWFzaCcoZmFpbCkpLAorCSEuCisKKyckdG9wbHZlbF9sb29wJyA6LQorCWN1cnJlbnRfcHJvbG9nX2ZsYWcoZGVidWcsIE1vZGUpLAorCShNb2RlID09IG9mZiAtPiB0cnVlIDsgcHJpbnRfbWVzc2FnZShpbmZvLFtkZWJ1Z10pKSwKKwknJGZhc3Rfd3JpdGUnKCd8ID8tICcpLCAKKwlmbHVzaF9vdXRwdXQuCisKKyckY2FmZXRlcmlhJyhHb2FsKSA6LQorCXJlYWRfd2l0aF92YXJpYWJsZXMoR29hbCwgVmFycyksCisJJyRwcm9jZXNzX29yZGVyJyhHb2FsLCBWYXJzKS4KKworJyRwcm9jZXNzX29yZGVyJyhHLCAgICAgICAgICAgICAgIF8pIDotIHZhcihHKSwgISwgaWxsYXJnKHZhciwgKD8tIEcpLCAxKS4KKyckcHJvY2Vzc19vcmRlcicoZW5kX29mX2ZpbGUsICAgICBfKSA6LSAhLgorJyRwcm9jZXNzX29yZGVyJyhbRmlsZXxGaWxlc10sICAgIF8pIDotICEsIGNvbnN1bHQoW0ZpbGV8RmlsZXNdKS4KKyckcHJvY2Vzc19vcmRlcicoRywgICAgICAgICAgICBWYXJzKSA6LSAKKwljdXJyZW50X3Byb2xvZ19mbGFnKGRlYnVnLCBNb2RlKSwKKwkoICAgTW9kZSA9PSBvZmYgLT4gY2FsbCh1c2VyOkcpIDsgJyR0cmFjZV9nb2FsJyh1c2VyOkcpICAgKSwgbmwsIAorCSckcm1fcmVkdW5kYW50X3ZhcnMnKFZhcnMsIFZhcnMxKSwJCisJJyRnaXZlX2Fuc3dlcnNfd2l0aF9wcm9tcHQnKFZhcnMxKSwKKwkhLCAKKwknJGZhc3Rfd3JpdGUnKHllcyksIG5sLgorJyRwcm9jZXNzX29yZGVyJyhfLCBfKSA6LSBubCwgJyRmYXN0X3dyaXRlJyhubyksIG5sLgorCisnJHJtX3JlZHVuZGFudF92YXJzJyhbXSwgW10pIDotICEuCisnJHJtX3JlZHVuZGFudF92YXJzJyhbJ18nPV98WHNdLCBWcykgIDotICEsCisJJyRybV9yZWR1bmRhbnRfdmFycycoWHMsIFZzKS4KKyckcm1fcmVkdW5kYW50X3ZhcnMnKFtYfFhzXSwgW1h8VnNdKSA6LQorCSckcm1fcmVkdW5kYW50X3ZhcnMnKFhzLCBWcykuCisKKyckZ2l2ZV9hbnN3ZXJzX3dpdGhfcHJvbXB0JyhbXSkgOi0gIS4KKyckZ2l2ZV9hbnN3ZXJzX3dpdGhfcHJvbXB0JyhWcykgOi0KKwknJGdpdmVfYW5fYW5zd2VyJyhWcyksCisJJyRmYXN0X3dyaXRlJygnID8gJyksIGZsdXNoX291dHB1dCwgCisJcmVhZF9saW5lKFN0ciksIAorCVN0ciBcPT0gIjsiLCAKKwlubC4KKworJyRnaXZlX2FuX2Fuc3dlcicoW10pICA6LSAhLCAnJGZhc3Rfd3JpdGUnKHRydWUpLgorJyRnaXZlX2FuX2Fuc3dlcicoW1hdKSA6LSAhLCAnJHByaW50X2FuIGFuc3dlcicoWCkuCisnJGdpdmVfYW5fYW5zd2VyJyhbWHxYc10pIDotCisJJyRwcmludF9hbiBhbnN3ZXInKFgpLCAnJGZhc3Rfd3JpdGUnKCcsJyksIG5sLAorCSckZ2l2ZV9hbl9hbnN3ZXInKFhzKS4KKworJyRwcmludF9hbiBhbnN3ZXInKE4gPSBWKSA6LSAKKwl3cml0ZShOKSwgJyRmYXN0X3dyaXRlJygnID0gJyksIHdyaXRlcShWKS4KKworJSUlIFJlYWQgUHJvZ3JhbQorY29uc3VsdChGaWxlcykgOi0gdmFyKEZpbGVzKSwgISwgaWxsYXJnKHZhciwgY29uc3VsdChGaWxlcyksIDEpLgorY29uc3VsdChbXSkgOi0gIS4KK2NvbnN1bHQoW0ZpbGV8RmlsZXNdKSA6LSAhLCBjb25zdWx0KEZpbGUpLCBjb25zdWx0KEZpbGVzKS4KK2NvbnN1bHQoRmlsZSkgOi0gYXRvbShGaWxlKSwgISwgJyRjb25zdWx0JyhGaWxlKS4KKworJyRjb25zdWx0JyhGKSA6LQorCSckcHJvbG9nX2ZpbGVfbmFtZScoRiwgUEYpLAorCW9wZW4oUEYsIHJlYWQsIEluKSwKKwlzdHJlYW1fcHJvcGVydHkoSW4sIGZpbGVfbmFtZShGaWxlKSksCisJcHJpbnRfbWVzc2FnZShpbmZvLCBbY29uc3VsdGluZyxGaWxlLCcuLi4nXSksCisJc3RhdGlzdGljcyhydW50aW1lLCBfKSwKKwknJGNvbnN1bHRfaW5pdCcoRmlsZSksCisJcmVwZWF0LAorCSAgICByZWFkKEluLCBDbCksCisJICAgICckY29uc3VsdF9jbGF1c2UnKENsKSwKKwkgICAgQ2wgPT0gZW5kX29mX2ZpbGUsCisJICAgICEsCisJc3RhdGlzdGljcyhydW50aW1lLCBbXyxUXSksCisJcHJpbnRfbWVzc2FnZShpbmZvLCBbRmlsZSwnY29uc3VsdGVkLCcsVCxtc2VjXSksCisJY2xvc2UoSW4pLgorCislJyRwcm9sb2dfZmlsZV9uYW1lJyhGaWxlLCAgRmlsZSkgOi0gc3ViX2F0b20oRmlsZSwgXywgMywgMCwgJy5wbCcpLCAhLgorJSckcHJvbG9nX2ZpbGVfbmFtZScoRmlsZSwgIEZpbGUpIDotIHN1Yl9hdG9tKEZpbGUsIF8sIDQsIDAsICcucHJvJyksICEuCisnJHByb2xvZ19maWxlX25hbWUnKEZpbGUsICBGaWxlKSA6LSBzdWJfYXRvbShGaWxlLCBfLCBfLCBBZnRlciwgJy4nKSwgQWZ0ZXIgPiAwLCAhLgorJyRwcm9sb2dfZmlsZV9uYW1lJyhGaWxlMCwgRmlsZSkgOi0gYXRvbV9jb25jYXQoRmlsZTAsICcucGwnLCBGaWxlKS4KKworJyRjb25zdWx0X2luaXQnKEZpbGUpIDotCisJcmV0cmFjdGFsbCgnJGNvbnN1bHRlZF9maWxlJyhfKSksCisJcmV0cmFjdGFsbCgnJGNvbnN1bHRlZF9wYWNrYWdlJyhfKSksCisJcmV0cmFjdCgnJGNvbnN1bHRlZF9wcmVkaWNhdGUnKFAsUEksRmlsZSkpLAorCWFib2xpc2goUDpQSSksCisJZmFpbC4KKyckY29uc3VsdF9pbml0JyhGaWxlKSA6LQorCWFzc2VydHooJyRjb25zdWx0ZWRfZmlsZScoRmlsZSkpLAorCWFzc2VydHooJyRjb25zdWx0ZWRfcGFja2FnZScodXNlcikpLgorCisnJGNvbnN1bHRfY2xhdXNlJyhlbmRfb2ZfZmlsZSAgICAgICAgICApIDotICEuCisnJGNvbnN1bHRfY2xhdXNlJygoOi0gbW9kdWxlKFAsXykpICAgICApIDotICEsICckYXNzZXJ0X2NvbnN1bHRlZF9wYWNrYWdlJyhQKS4KKyckY29uc3VsdF9jbGF1c2UnKCg6LSBwYWNrYWdlIFApICAgICAgICkgOi0gISwgJyRhc3NlcnRfY29uc3VsdGVkX3BhY2thZ2UnKFApLgorJyRjb25zdWx0X2NsYXVzZScoKDotIGltcG9ydCBfKSAgICAgICAgKSA6LSAhLgorJyRjb25zdWx0X2NsYXVzZScoKDotIGR5bmFtaWMgXykgICAgICAgKSA6LSAhLgorJyRjb25zdWx0X2NsYXVzZScoKDotIHB1YmxpYyBfKSAgICAgICAgKSA6LSAhLgorJyRjb25zdWx0X2NsYXVzZScoKDotIG1ldGFfcHJlZGljYXRlIF8pKSA6LSAhLgorJyRjb25zdWx0X2NsYXVzZScoKDotIG1vZGUgXykgICAgICAgICAgKSA6LSAhLgorJyRjb25zdWx0X2NsYXVzZScoKDotIG11bHRpZmlsZSBfKSAgICAgKSA6LSAhLgorJyRjb25zdWx0X2NsYXVzZScoKDotIGJsb2NrIF8pICAgICAgICAgKSA6LSAhLgorJSckY29uc3VsdF9jbGF1c2UnKCg6LSBHKSAgICAgICAgICAgICAgICkgOi0gISwgY2xhdXNlKCckY29uc3VsdGVkX3BhY2thZ2UnKFApLCBfKSwgY2FsbChQOkcpLgorJyRjb25zdWx0X2NsYXVzZScoKDotIEcpICAgICAgICAgICAgICAgKSA6LSAhLCBjbGF1c2UoJyRjb25zdWx0ZWRfcGFja2FnZScoUCksIF8pLCBvbmNlKFA6RykuCisnJGNvbnN1bHRfY2xhdXNlJyhDbGF1c2UwKSA6LSAKKwknJGNvbnN1bHRfcHJlcHJvY2VzcycoQ2xhdXNlMCwgQ2xhdXNlKSwgCisJJyRjb25zdWx0X2NscycoQ2xhdXNlKS4KKworJyRhc3NlcnRfY29uc3VsdGVkX3BhY2thZ2UnKFApIDotCisJY2xhdXNlKCckY29uc3VsdGVkX3BhY2thZ2UnKFApLCBfKSwKKwkhLgorJyRhc3NlcnRfY29uc3VsdGVkX3BhY2thZ2UnKFApIDotCisJcmV0cmFjdGFsbCgnJGNvbnN1bHRlZF9wYWNrYWdlJyhfKSksCisJYXNzZXJ0eignJGNvbnN1bHRlZF9wYWNrYWdlJyhQKSkuCisKKyckY29uc3VsdF9wcmVwcm9jZXNzJyhDbGF1c2UwLCBDbGF1c2UpIDotCisJZXhwYW5kX3Rlcm0oQ2xhdXNlMCwgQ2xhdXNlKS4KKworJyRjb25zdWx0X2NscycoKEggOi0gRykpIDotICEsICckYXNzZXJ0X2NvbnN1bHRlZF9jbGF1c2UnKChIIDotIEcpKS4KKyckY29uc3VsdF9jbHMnKEgpIDotICckYXNzZXJ0X2NvbnN1bHRlZF9jbGF1c2UnKChIIDotIHRydWUpKS4KKworJyRhc3NlcnRfY29uc3VsdGVkX2NsYXVzZScoQ2xhdXNlKSA6LQorCUNsYXVzZSA9IChIIDotIF8pLAorCWZ1bmN0b3IoSCwgRiwgQSksCisJY2xhdXNlKCckY29uc3VsdGVkX2ZpbGUnKEZpbGUpLCBfKSwKKwljbGF1c2UoJyRjb25zdWx0ZWRfcGFja2FnZScoUCksIF8pLAorCWFzc2VydHooUDpDbGF1c2UpLAorCWFzc2VydHooJyRjb25zdWx0ZWRfcHJlZGljYXRlJyhQLEYvQSxGaWxlKSksCisJIS4KKworJSUlIFRyYWNlCit0cmFjZSA6LSBjdXJyZW50X3Byb2xvZ19mbGFnKGRlYnVnLCBvbiksICEuCit0cmFjZSA6LSAKKwlzZXRfcHJvbG9nX2ZsYWcoZGVidWcsIG9uKSwKKwknJHRyYWNlX2luaXQnLAorCSckZmFzdF93cml0ZScoJ3tTbWFsbCBkZWJ1Z2dlciBpcyBzd2l0Y2ggb259JyksCisJbmwsICEuCisKKyckdHJhY2VfaW5pdCcgOi0gCisJcmV0cmFjdGFsbCgnJGxlYXBfZmxhZycoXykpLAorCXJldHJhY3RhbGwoJyRjdXJyZW50X2xlYXNoJyhfKSksCisJcmV0cmFjdGFsbCgnJGN1cnJlbnRfc3B5cG9pbnQnKF8sXyxfKSksCisJYXNzZXJ0eignJGxlYXBfZmxhZycobm8pKSwKKwlhc3NlcnR6KCckY3VycmVudF9sZWFzaCcoY2FsbCkpLAorCWFzc2VydHooJyRjdXJyZW50X2xlYXNoJyhleGl0KSksCisJYXNzZXJ0eignJGN1cnJlbnRfbGVhc2gnKHJlZG8pKSwKKwlhc3NlcnR6KCckY3VycmVudF9sZWFzaCcoZmFpbCkpLAorCSEuCisKK25vdHJhY2UgOi0gY3VycmVudF9wcm9sb2dfZmxhZyhkZWJ1Zywgb2ZmKSwgIS4KK25vdHJhY2UgOi0KKwlzZXRfcHJvbG9nX2ZsYWcoZGVidWcsIG9mZiksCisJJyRmYXN0X3dyaXRlJygne1NtYWxsIGRlYnVnZ2VyIGlzIHN3aXRjaCBvZmZ9JyksIAorCW5sLCAhLgorCitkZWJ1ZyA6LSB0cmFjZS4KK25vZGVidWcgOi0gbm90cmFjZS4KKworJSUlIFNweS1Qb2ludHMKK3NweShUKSA6LSAKKwknJHRlcm1fdG9fcHJlZGljYXRlaW5kaWNhdG9yJyhULCBQSSwgc3B5KFQpKSwKKwl0cmFjZSwKKwknJGFzc2VydF9zcHlwb2ludCcoUEkpLAorCSckc2V0X2RlYnVnX2ZsYWcnKGxlYXAsIHllcyksCisJIS4KKworJyRhc3NlcnRfc3B5cG9pbnQnKFA6Ri9BKSA6LSAKKwljbGF1c2UoJyRjdXJyZW50X3NweXBvaW50JyhQLEYsQSksIF8pLCAKKwlwcmludF9tZXNzYWdlKGluZm8sIFtzcHlwb2ludCxQOkYvQSxpcyxhbHJlYWR5LGFkZGVkXSksCisJIS4KKyckYXNzZXJ0X3NweXBvaW50JyhQOkYvQSkgOi0gCisJY2xhdXNlKCckY29uc3VsdGVkX3ByZWRpY2F0ZScoUCxGL0EsXyksIF8pLAorCWFzc2VydHooJyRjdXJyZW50X3NweXBvaW50JyhQLEYsQSkpLAorCXByaW50X21lc3NhZ2UoaW5mbywgW3NweXBvaW50LFA6Ri9BLGlzLGFkZGVkXSksCisJIS4KKyckYXNzZXJ0X3NweXBvaW50JyhQOkYvQSkgOi0gCisJcHJpbnRfbWVzc2FnZSh3YXJuaW5nLCBbbm8sbWF0Y2hpbmcscHJlZGljYXRlLGZvcixzcHksUDpGL0FdKS4KKworbm9zcHkoVCkgOi0gCisJJyR0ZXJtX3RvX3ByZWRpY2F0ZWluZGljYXRvcicoVCwgUEksIG5vc3B5KFQpKSwKKwknJHJldHJhY3Rfc3B5cG9pbnQnKFBJKSwKKwknJHNldF9kZWJ1Z19mbGFnJyhsZWFwLCBubyksCisJIS4KKworJyRyZXRyYWN0X3NweXBvaW50JyhQOkYvQSkgOi0KKwlyZXRyYWN0KCckY3VycmVudF9zcHlwb2ludCcoUCxGLEEpKSwKKwlwcmludF9tZXNzYWdlKGluZm8sIFtzcHlwb2ludCxQOkYvQSxpcyxyZW1vdmVkXSksCisJIS4KKyckcmV0cmFjdF9zcHlwb2ludCcoXykuCisKK25vc3B5YWxsIDotICAKKwlyZXRyYWN0YWxsKCckY3VycmVudF9zcHlwb2ludCcoXyxfLF8pKSwKKwknJHNldF9kZWJ1Z19mbGFnJyhsZWFwLCBubykuCisKKyUlJSBMZWFzaAorbGVhc2goTCkgOi0gbm9udmFyKEwpLCAnJGxlYXNoJyhMKSwgIS4KK2xlYXNoKEwpIDotIGlsbGFyZyh0eXBlKCdsZWFzaF9zcGVjaWZpZXInKSwgbGVhc2goTCksIDEpLgorCisnJGxlYXNoJyhbXSkgOi0gISwgCisJcmV0cmFjdGFsbCgnJGN1cnJlbnRfbGVhc2gnKF8pKSwKKwlwcmludF9tZXNzYWdlKGluZm8sIFtubyxsZWFzaGluZ10pLgorJyRsZWFzaCcoTXMpIDotCisJcmV0cmFjdGFsbCgnJGN1cnJlbnRfbGVhc2gnKF8pKSwKKwknJGFzc2VydF9sZWFzaCcoTXMpLAorCXByaW50X21lc3NhZ2UoaW5mbyxbbGVhc2hpbmcsc3RvcHBpbmcsb24sTXNdKS4KKworJyRhc3NlcnRfbGVhc2gnKFtdKSA6LSAhLgorJyRhc3NlcnRfbGVhc2gnKFtYfFhzXSkgOi0gCisJJyRsZWFzaF9zcGVjaWZpZXInKFgpLAorCWFzc2VydHooJyRjdXJyZW50X2xlYXNoJyhYKSksIAorCSckYXNzZXJ0X2xlYXNoJyhYcykuCisKKyckbGVhc2hfc3BlY2lmaWVyJyhjYWxsKS4KKyckbGVhc2hfc3BlY2lmaWVyJyhleGl0KS4KKyckbGVhc2hfc3BlY2lmaWVyJyhyZWRvKS4KKyckbGVhc2hfc3BlY2lmaWVyJyhmYWlsKS4KKyUnJGxlYXNoX3NwZWNpZmllcicoZXhjZXB0aW9uKS4KKworJSUlIFRyYWNlIGEgR29hbAorJyR0cmFjZV9nb2FsJyhUZXJtKSA6LSAKKwknJHNldF9kZWJ1Z19mbGFnJyhsZWFwLCBubyksCisJJyRnZXRfbGV2ZWwnKEN1dCksIAorCSckbWV0YV9jYWxsJyhUZXJtLCB1c2VyLCBDdXQsIDAsIHRyYWNlKS4KKworJyR0cmFjZV9nb2FsJyhYLCBQLCBGQSwgRGVwdGgpIDotIAorCXByaW50X3Byb2NlZHVyZV9ib3goY2FsbCwgWCwgUCwgRkEsIERlcHRoKSwKKwknJGNhbGxfaW50ZXJuYWwnKFgsIFAsIEZBLCBEZXB0aCwgdHJhY2UpLAorCXByaW50X3Byb2NlZHVyZV9ib3goZXhpdCwgWCwgUCwgRkEsIERlcHRoKSwKKwlyZWRvX3Byb2NlZHVyZV9ib3goWCwgUCwgRkEsIERlcHRoKS4KKyckdHJhY2VfZ29hbCcoWCwgUCwgRkEsIERlcHRoKSA6LSAKKwlwcmludF9wcm9jZWR1cmVfYm94KGZhaWwsIFgsIFAsIEZBLCBEZXB0aCksCisJZmFpbC4KKworcHJpbnRfcHJvY2VkdXJlX2JveChNb2RlLCBHLCBQLCBGL0EsIERlcHRoKSA6LSAKKwljbGF1c2UoJyRjdXJyZW50X3NweXBvaW50JyhQLCBGLCBBKSwgXyksCisJISwKKwknJGJ1aWx0aW5fbWVzc2FnZScoWycrJyxEZXB0aCxNb2RlLCc6JyxQOkddKSwgCisJJyRyZWFkX2Jsb2NrZWQnKHByaW50X3Byb2NlZHVyZV9ib3goTW9kZSxHLFAsRi9BLERlcHRoKSkuCitwcmludF9wcm9jZWR1cmVfYm94KE1vZGUsIEcsIFAsIEZBLCBEZXB0aCkgOi0gCisJY2xhdXNlKCckbGVhcF9mbGFnJyhubyksIF8pLAorCSEsCisJJyRidWlsdGluX21lc3NhZ2UnKFsnICcsRGVwdGgsTW9kZSwnOicsUDpHXSksIAorCSggICAgY2xhdXNlKCckY3VycmVudF9sZWFzaCcoTW9kZSksIF8pIAorICAgICAgICAgICAgIC0+IAorCSAgICAgJyRyZWFkX2Jsb2NrZWQnKHByaW50X3Byb2NlZHVyZV9ib3goTW9kZSxHLFAsRkEsRGVwdGgpKQorCSAgICAgOyAKKwkgICAgIG5sCisJICkuCitwcmludF9wcm9jZWR1cmVfYm94KF8sIF8sIF8sIF8sIF8pLgorCityZWRvX3Byb2NlZHVyZV9ib3goXywgXywgXywgXykuCityZWRvX3Byb2NlZHVyZV9ib3goWCwgUCwgRkEsIERlcHRoKSA6LSAKKwlwcmludF9wcm9jZWR1cmVfYm94KHJlZG8sIFgsIFAsIEZBLCBEZXB0aCksCisJZmFpbC4KKworJyRyZWFkX2Jsb2NrZWQnKEcpIDotCisJJyRmYXN0X3dyaXRlJygnID8gJyksCisJZmx1c2hfb3V0cHV0LCAKKwlyZWFkX2xpbmUoQyksCisJKEMgPT0gW10gLT4gRE9QID0gOTkgOyBDID0gW0RPUHxfXSksCisJJyRkZWJ1Z19vcHRpb24nKERPUCwgRykuCisKKyckZGVidWdfb3B0aW9uJyg5NywgIF8pIDotICEsIG5vdHJhY2UsIGFib3J0LiAgICAgICAgICAgICAgICUgYSBmb3IgYWJvcnQKKyckZGVidWdfb3B0aW9uJyg5OSwgIF8pIDotICEsICckc2V0X2RlYnVnX2ZsYWcnKGxlYXAsIG5vKS4gICUgYyBmb3IgY3JlZXAKKyckZGVidWdfb3B0aW9uJygxMDgsIF8pIDotICEsICckc2V0X2RlYnVnX2ZsYWcnKGxlYXAsIHllcykuICUgbCBmb3IgbGVhcAorJyRkZWJ1Z19vcHRpb24nKDQzLCAgcHJpbnRfcHJvY2VkdXJlX2JveChNb2RlLEcsUCxGQSxEZXB0aCkpIDotICEsICUgKyBmb3Igc3B5IHRoaXMKKwlzcHkoUDpGQSksCisJY2FsbChwcmludF9wcm9jZWR1cmVfYm94KE1vZGUsRyxQLEZBLERlcHRoKSkuCisnJGRlYnVnX29wdGlvbicoNDUsICBwcmludF9wcm9jZWR1cmVfYm94KE1vZGUsRyxQLEZBLERlcHRoKSkgOi0gISwgJSAtIGZvciBub3NweSB0aGlzCisJbm9zcHkoUDpGQSksCisJY2FsbChwcmludF9wcm9jZWR1cmVfYm94KE1vZGUsRyxQLEZBLERlcHRoKSkuCisnJGRlYnVnX29wdGlvbicoNjMsICBHKSA6LSAhLCAnJHNob3dfZGVidWdfb3B0aW9uJywgY2FsbChHKS4KKyckZGVidWdfb3B0aW9uJygxMDQsIEcpIDotICEsICckc2hvd19kZWJ1Z19vcHRpb24nLCBjYWxsKEcpLgorJyRkZWJ1Z19vcHRpb24nKF8sIF8pLgorCisnJHNob3dfZGVidWdfb3B0aW9uJyA6LQorCXRhYig0KSwgJyRmYXN0X3dyaXRlJygnRGVidWdnaW4gb3B0aW9uczonKSwgbmwsCisJdGFiKDQpLCAnJGZhc3Rfd3JpdGUnKCdhICAgICAgYWJvcnQnKSwgbmwsCisJdGFiKDQpLCAnJGZhc3Rfd3JpdGUnKCdSRVQgICAgY3JlZXAnKSwgbmwsCisJdGFiKDQpLCAnJGZhc3Rfd3JpdGUnKCdjICAgICAgY3JlZXAnKSwgbmwsCisJdGFiKDQpLCAnJGZhc3Rfd3JpdGUnKCdsICAgICAgbGVhcCcpLCBubCwKKwl0YWIoNCksICckZmFzdF93cml0ZScoJysgICAgICBzcHkgdGhpcycpLCBubCwKKwl0YWIoNCksICckZmFzdF93cml0ZScoJy0gICAgICBub3NweSB0aGlzJyksIG5sLAorCXRhYig0KSwgJyRmYXN0X3dyaXRlJygnPyAgICAgIGhlbHAnKSwgbmwsCisJdGFiKDQpLCAnJGZhc3Rfd3JpdGUnKCdoICAgICAgaGVscCcpLCBubC4KKworJyRzZXRfZGVidWdfZmxhZycobGVhcCwgRmxhZykgOi0KKwljbGF1c2UoJyRsZWFwX2ZsYWcnKEZsYWcpLCBfKSwKKwkhLgorJyRzZXRfZGVidWdfZmxhZycobGVhcCwgRmxhZykgOi0KKwlyZXRyYWN0YWxsKCckbGVhcF9mbGFnJyhfKSksCisJYXNzZXJ0eignJGxlYXBfZmxhZycoRmxhZykpLgorCislJSUgTGlzdGluZworbGlzdGluZyA6LSAnJGxpc3RpbmcnKF8sIHVzZXIpLgorCitsaXN0aW5nKFQpIDotIHZhcihUKSwgISwgaWxsYXJnKHZhciwgbGlzdGluZyhUKSwgMSkuCitsaXN0aW5nKFApIDotIGF0b20oUCksICEsICckbGlzdGluZycoXywgUCkuCitsaXN0aW5nKEYvQSkgOi0gISwgJyRsaXN0aW5nJyhGL0EsIHVzZXIpLgorbGlzdGluZyhQOlBJKSA6LSBhdG9tKFApLCAhLCAnJGxpc3RpbmcnKFBJLCBQKS4KK2xpc3RpbmcoVCkgOi0gaWxsYXJnKHR5cGUocHJlZGljYXRlX2luZGljYXRvciksIGxpc3RpbmcoVCksIDEpLgorCisnJGxpc3RpbmcnKFBJLCBQKSA6LSB2YXIoUEkpLCAhLAorCSckbGlzdGluZ19keW5hbWljX2NsYXVzZScoUCwgXykuCisnJGxpc3RpbmcnKEYvQSwgUCkgOi0gYXRvbShGKSwgaW50ZWdlcihBKSwgISwKKwknJGxpc3RpbmdfZHluYW1pY19jbGF1c2UnKFAsIEYvQSkuCisnJGxpc3RpbmcnKFBJLCBQKSA6LSBpbGxhcmcodHlwZShwcmVkaWNhdGVfaW5kaWNhdG9yKSwgbGlzdGluZyhQOlBJKSwgMSkuCisKKyckbGlzdGluZ19keW5hbWljX2NsYXVzZScoUCwgUEkpIDotIAorCSckbmV3X2ludGVybmFsX2RhdGFiYXNlJyhQKSwKKwloYXNoX2tleXMoUCwgS2V5cyksCisJJyRidWlsdGluX21lbWJlcicoUEksIEtleXMpLAorCVBJID0gRi9BLAorCWZ1bmN0b3IoSCwgRiwgQSksCisJJyRjbGF1c2VfaW50ZXJuYWwnKFAsIFBJLCBILCBDbCwgXyksCisJJyR3cml0ZV9keW5hbWljX2NsYXVzZScoUCwgQ2wpLAorCWZhaWwuCisnJGxpc3RpbmdfZHluYW1pY19jbGF1c2UnKF8sIF8pLgorCisnJHdyaXRlX2R5bmFtaWNfY2xhdXNlJyhfLCBDbCkgOi0gdmFyKENsKSwgISwgZmFpbC4KKyckd3JpdGVfZHluYW1pY19jbGF1c2UnKFAsIChIIDotIHRydWUpKSA6LSAhLAorCW51bWJlcnZhcnMoSCwgMCwgXyksCisJJyR3cml0ZV9keW5hbWljX2hlYWQnKFAsIEgpLAorCXdyaXRlKCcuJyksIG5sLgorJyR3cml0ZV9keW5hbWljX2NsYXVzZScoUCwgKEggOi0gQikpIDotICEsCisJbnVtYmVydmFycygoSCA6LSBCKSwgMCwgXyksCisJJyR3cml0ZV9keW5hbWljX2hlYWQnKFAsIEgpLAorCXdyaXRlKCcgOi0nKSwgbmwsCisJJyR3cml0ZV9keW5hbWljX2JvZHknKEIsIDgpLAorCXdyaXRlKCcuJyksIG5sLgorCisnJHdyaXRlX2R5bmFtaWNfaGVhZCcodXNlciwgSCkgOi0gISwgd3JpdGVxKEgpLgorJyR3cml0ZV9keW5hbWljX2hlYWQnKFAsIEgpIDotIAorCXdyaXRlKFApLCB3cml0ZSgnOicpLCB3cml0ZXEoSCkuCisKKyckd3JpdGVfZHluYW1pY19ib2R5JygoRzEsRzIpLCBOKSA6LSAhLAorCSckd3JpdGVfZHluYW1pY19ib2R5JyhHMSwgTiksIHdyaXRlKCcsJyksIG5sLAorCSckd3JpdGVfZHluYW1pY19ib2R5JyhHMiwgTikuCisnJHdyaXRlX2R5bmFtaWNfYm9keScoKEcxO0cyKSwgTikgOi0gISwKKwlOMSBpcyBOKzQsCisJdGFiKE4pLCB3cml0ZSgnKCcpLCBubCwKKwknJHdyaXRlX2R5bmFtaWNfYm9keScoRzEsIE4xKSwgbmwsCisJdGFiKE4pLCB3cml0ZSgnOycpLCBubCwKKwknJHdyaXRlX2R5bmFtaWNfYm9keScoRzIsIE4xKSwgbmwsCisJdGFiKE4pLCB3cml0ZSgnKScpLgorJyR3cml0ZV9keW5hbWljX2JvZHknKChHMS0+RzIpLCBOKSA6LSAhLAorCU4xIGlzIE4rNCwKKwl0YWIoTiksIHdyaXRlKCcoJyksIG5sLAorCSckd3JpdGVfZHluYW1pY19ib2R5JyhHMSwgTjEpLCBubCwKKwl0YWIoTiksIHdyaXRlKCctPicpLCBubCwKKwknJHdyaXRlX2R5bmFtaWNfYm9keScoRzIsIE4xKSwgbmwsCisJdGFiKE4pLCB3cml0ZSgnKScpLgorJyR3cml0ZV9keW5hbWljX2JvZHknKEIsIE4pIDotCisJdGFiKE4pLCB3cml0ZXEoQikuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUgTWlzYworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorOi0gcHVibGljIGxlbmd0aC8yLgorOi0gcHVibGljIG51bWJlcnZhcnMvMy4KKzotIHB1YmxpYyBzdGF0aXN0aWNzLzIuCisKK2xlbmd0aChMLCBOKSA6LSB2YXIoTiksICEsICckbGVuZ3RoJyhMLCAwLCBOKS4KK2xlbmd0aChMLCBOKSA6LSAnJGxlbmd0aDAnKEwsIDAsIE4pLgorCisnJGxlbmd0aCcoW10sIEksIEkpLgorJyRsZW5ndGgnKFtffExdLCBJMCwgSSkgOi0gSTEgaXMgSTArMSwgJyRsZW5ndGgnKEwsIEkxLCBJKS4KKworJyRsZW5ndGgwJyhbXSwgSSwgSSkgOi0gIS4KKyckbGVuZ3RoMCcoW198TF0sIEkwLCBJKSA6LSBJMCA8IEksIEkxIGlzIEkwKzEsICckbGVuZ3RoMCcoTCwgSTEsIEkpLgorCitudW1iZXJ2YXJzKFgsIFZJLCBWTikgOi0gCisJaW50ZWdlcihWSSksIFZJID49IDAsIAorCSEsCisJJyRudW1iZXJ2YXJzJyhYLCBWSSwgVk4pLgorCisnJG51bWJlcnZhcnMnKFgsIFZJLCBWTikgOi0gdmFyKFgpLCAhLAorCVggPSAnJFZBUicoVkkpLAkgICUgVGhpcyBzdHJ1Y3R1cmUgaXMgY2hlY2tlZCBpbiB3cml0ZQorCVZOIGlzIFZJICsgMS4KKyckbnVtYmVydmFycycoWCwgVkksIFZJKSA6LSBhdG9taWMoWCksICEuCisnJG51bWJlcnZhcnMnKFgsIFZJLCBWSSkgOi0gamF2YShYKSwgIS4KKyckbnVtYmVydmFycycoWCwgVkksIFZOKSA6LQorCWZ1bmN0b3IoWCwgXywgTiksCisJJyRudW1iZXJ2YXJzX3N0cicoMSwgTiwgWCwgVkksIFZOKS4KKworJyRudW1iZXJ2YXJzX3N0cicoSSwgSSwgWCwgVkksIFZOKSA6LSAhLAorCWFyZyhJLCBYLCBBKSwKKwknJG51bWJlcnZhcnMnKEEsIFZJLCBWTikuCisnJG51bWJlcnZhcnNfc3RyJyhJLCBOLCBYLCBWSSwgVk4pIDotCisJYXJnKEksIFgsIEEpLAorCSckbnVtYmVydmFycycoQSwgVkksIFZOMSksCisJSTEgaXMgSSArIDEsCisJJyRudW1iZXJ2YXJzX3N0cicoSTEsIE4sIFgsIFZOMSwgVk4pLgorCitzdGF0aXN0aWNzKEtleSwgVmFsdWUpIDotIAorCW5vbnZhcihLZXkpLCAKKwknJHN0YXRpc3RpY3NfbW9kZScoS2V5KSwgCisJISwKKwknJHN0YXRpc3RpY3MnKEtleSwgVmFsdWUpLgorc3RhdGlzdGljcyhLZXksIFZhbHVlKSA6LSAKKwlmaW5kYWxsKE0sICckc3RhdGlzdGljc19tb2RlJyhNKSwgRG9tYWluKSwKKwlpbGxhcmcoZG9tYWluKGF0b20sRG9tYWluKSwgc3RhdGlzdGljcyhLZXksVmFsdWUpLCAxKS4KKworJyRzdGF0aXN0aWNzX21vZGUnKHJ1bnRpbWUpLgorJyRzdGF0aXN0aWNzX21vZGUnKHRyYWlsKS4KKyckc3RhdGlzdGljc19tb2RlJyhjaG9pY2UpLgorCitwcmludF9tZXNzYWdlKFR5cGUsIE1lc3NhZ2UpIDotIHZhcihUeXBlKSwgISwKKwlpbGxhcmcodmFyLCBwcmludF9tZXNzYWdlKFR5cGUsTWVzc2FnZSksIDEpLgorcHJpbnRfbWVzc2FnZShlcnJvciwgTWVzc2FnZSkgOi0gISwgCisJJyRlcnJvcl9tZXNzYWdlJyhNZXNzYWdlKS4KK3ByaW50X21lc3NhZ2UoaW5mbywgIE1lc3NhZ2UpIDotICEsCisJJyRmYXN0X3dyaXRlJygneycpLCAKKwknJGJ1aWx0aW5fbWVzc2FnZScoTWVzc2FnZSksIAorCSckZmFzdF93cml0ZScoJ30nKSwgbmwuCitwcmludF9tZXNzYWdlKHdhcm5pbmcsIE1lc3NhZ2UpIDotICEsCisJJyRmYXN0X3dyaXRlJygne1dBUk5JTkc6ICcpLCAKKwknJGJ1aWx0aW5fbWVzc2FnZScoTWVzc2FnZSksIAorCSckZmFzdF93cml0ZScoJ30nKSwgbmwuCisKKyckZXJyb3JfbWVzc2FnZScoaW5zdGFudGlhdGlvbl9lcnJvcihHb2FsLDApKSA6LSAhLAorCSckZmFzdF93cml0ZScoJ3tJTlNUQU5USUFUSU9OIEVSUk9SOiAnKSwgCisJJyR3cml0ZV9nb2FsJyhHb2FsKSwgCisJJyRmYXN0X3dyaXRlJygnfScpLCBubC4KKyckZXJyb3JfbWVzc2FnZScoaW5zdGFudGlhdGlvbl9lcnJvcihHb2FsLEFyZ05vKSkgOi0gISwKKwknJGZhc3Rfd3JpdGUnKCd7SU5TVEFOVElBVElPTiBFUlJPUjogJyksCisJJyR3cml0ZV9nb2FsJyhHb2FsKSwgCisJJyRmYXN0X3dyaXRlJygnIC0gYXJnICcpLCAnJGZhc3Rfd3JpdGUnKEFyZ05vKSwgCisJJyRmYXN0X3dyaXRlJygnfScpLCBubC4KKyckZXJyb3JfbWVzc2FnZScodHlwZV9lcnJvcihHb2FsLEFyZ05vLFR5cGUsQ3VscHJpdCkpIDotICEsCisJJyRmYXN0X3dyaXRlJygne1RZUEUgRVJST1I6ICcpLAorCSckd3JpdGVfZ29hbCcoR29hbCksIAorCSckZmFzdF93cml0ZScoJyAtIGFyZyAnKSwgJyRmYXN0X3dyaXRlJyhBcmdObyksIAorCSckZmFzdF93cml0ZScoJzogZXhwZWN0ZWQgJyksICckZmFzdF93cml0ZScoVHlwZSksCisJJyRmYXN0X3dyaXRlJygnLCBmb3VuZCAnKSwgd3JpdGUoQ3VscHJpdCksCisJJyRmYXN0X3dyaXRlJygnfScpLCBubC4KKyckZXJyb3JfbWVzc2FnZScoZG9tYWluX2Vycm9yKEdvYWwsQXJnTm8sRG9tYWluLEN1bHByaXQpKSA6LSAhLAorCSckZmFzdF93cml0ZScoJ3tET01BSU4gRVJST1I6ICcpLAorCSckd3JpdGVfZ29hbCcoR29hbCksIAorCSckZmFzdF93cml0ZScoJyAtIGFyZyAnKSwgJyRmYXN0X3dyaXRlJyhBcmdObyksCisJJyRmYXN0X3dyaXRlJygnOiBleHBlY3RlZCAnKSwgJyRmYXN0X3dyaXRlJyhEb21haW4pLAorCSckZmFzdF93cml0ZScoJywgZm91bmQgJyksIHdyaXRlKEN1bHByaXQpLAorCSckZmFzdF93cml0ZScoJ30nKSwgbmwuCisnJGVycm9yX21lc3NhZ2UnKGV4aXN0ZW5jZV9lcnJvcihfR29hbCwwLE9ialR5cGUsQ3VscHJpdCxfTWVzc2FnZSkpIDotICEsCisJJyRmYXN0X3dyaXRlJygne0VYSVNURU5DRSBFUlJPUjogJyksCisJJyRmYXN0X3dyaXRlJyhPYmpUeXBlKSwgJyRmYXN0X3dyaXRlJygnICcpLCB3cml0ZShDdWxwcml0KSwgJyRmYXN0X3dyaXRlJygnIGRvZXMgbm90IGV4aXN0JyksCisJJyRmYXN0X3dyaXRlJygnfScpLCBubC4KKyckZXJyb3JfbWVzc2FnZScoZXhpc3RlbmNlX2Vycm9yKEdvYWwsQXJnTm8sT2JqVHlwZSxDdWxwcml0LF9NZXNzYWdlKSkgOi0gISwKKwknJGZhc3Rfd3JpdGUnKCd7RVhJU1RFTkNFIEVSUk9SOiAnKSwKKwknJHdyaXRlX2dvYWwnKEdvYWwpLCAKKwknJGZhc3Rfd3JpdGUnKCcgLSBhcmcgJyksICckZmFzdF93cml0ZScoQXJnTm8pLAorCSckZmFzdF93cml0ZScoJzogJyksIAorCSckZmFzdF93cml0ZScoT2JqVHlwZSksICckZmFzdF93cml0ZScoJyAnKSwgd3JpdGUoQ3VscHJpdCksICckZmFzdF93cml0ZScoJyBkb2VzIG5vdCBleGlzdCcpLAorCSckZmFzdF93cml0ZScoJ30nKSwgbmwuCisnJGVycm9yX21lc3NhZ2UnKHBlcm1pc3Npb25fZXJyb3IoR29hbCxPcGVyYXRpb24sT2JqVHlwZSxDdWxwcml0LE1lc3NhZ2UpKSA6LSAhLCAKKwknJGZhc3Rfd3JpdGUnKCd7UEVSTUlTU0lPTiBFUlJPUjogJyksCisJJyR3cml0ZV9nb2FsJyhHb2FsKSwgCisJJyRmYXN0X3dyaXRlJygnIC0gY2FuIG5vdCAnKSwgJyRmYXN0X3dyaXRlJyhPcGVyYXRpb24pLCAnJGZhc3Rfd3JpdGUnKCcgJyksIAorCSckZmFzdF93cml0ZScoT2JqVHlwZSksICckZmFzdF93cml0ZScoJyAnKSwgd3JpdGUoQ3VscHJpdCksIAorCSckZmFzdF93cml0ZScoJzogJyksICckZmFzdF93cml0ZScoTWVzc2FnZSksCisJJyRmYXN0X3dyaXRlJygnfScpLCBubC4KKyckZXJyb3JfbWVzc2FnZScocmVwcmVzZW50YXRpb25fZXJyb3IoR29hbCxBcmdObyxGbGFnKSkgOi0gISwgCisJJyRmYXN0X3dyaXRlJygne1JFUFJFU0VOVEFUSU9OIEVSUk9SOiAnKSwKKwknJHdyaXRlX2dvYWwnKEdvYWwpLCAKKwknJGZhc3Rfd3JpdGUnKCcgLSBhcmcgJyksICckZmFzdF93cml0ZScoQXJnTm8pLCAKKwknJGZhc3Rfd3JpdGUnKCc6IGxpbWl0IG9mICcpLCAnJGZhc3Rfd3JpdGUnKEZsYWcpLCAnJGZhc3Rfd3JpdGUnKCcgaXMgYnJlYWNoZWQnKSwKKwknJGZhc3Rfd3JpdGUnKCd9JyksIG5sLgorJyRlcnJvcl9tZXNzYWdlJyhldmFsdWF0aW9uX2Vycm9yKEdvYWwsQXJnTm8sVHlwZSkpIDotICEsIAorCSckZmFzdF93cml0ZScoJ3tFVkFMVUFUSU9OIEVSUk9SOiAnKSwKKwknJHdyaXRlX2dvYWwnKEdvYWwpLCAKKwknJGZhc3Rfd3JpdGUnKCcgLSBhcmcgJyksICckZmFzdF93cml0ZScoQXJnTm8pLCAKKwknJGZhc3Rfd3JpdGUnKCcsIGZvdW5kICcpLCAnJGZhc3Rfd3JpdGUnKFR5cGUpLAorCSckZmFzdF93cml0ZScoJ30nKSwgbmwuCisnJGVycm9yX21lc3NhZ2UnKHN5bnRheF9lcnJvcihHb2FsLEFyZ05vLFR5cGUsQ3VscHJpdCxfTWVzc2FnZSkpIDotICEsCisJJyRmYXN0X3dyaXRlJygne1NZTlRBWCBFUlJPUjogJyksCisJJyR3cml0ZV9nb2FsJyhHb2FsKSwgCisJJyRmYXN0X3dyaXRlJygnIC0gYXJnICcpLCAnJGZhc3Rfd3JpdGUnKEFyZ05vKSwgCisJJyRmYXN0X3dyaXRlJygnOiBleHBlY3RlZCAnKSwgJyRmYXN0X3dyaXRlJyhUeXBlKSwKKwknJGZhc3Rfd3JpdGUnKCcsIGZvdW5kICcpLCB3cml0ZShDdWxwcml0KSwKKwknJGZhc3Rfd3JpdGUnKCd9JyksIG5sLgorJyRlcnJvcl9tZXNzYWdlJyhzeXN0ZW1fZXJyb3IoTWVzc2FnZSkpIDotICEsCisJJyRmYXN0X3dyaXRlJygne1NZU1RFTSBFUlJPUjogJyksIHdyaXRlKE1lc3NhZ2UpLCAnJGZhc3Rfd3JpdGUnKCd9JyksIG5sLgorJyRlcnJvcl9tZXNzYWdlJyhpbnRlcm5hbF9lcnJvcihNZXNzYWdlKSkgOi0gISwKKwknJGZhc3Rfd3JpdGUnKCd7SU5URVJOQUwgRVJST1I6ICcpLCB3cml0ZShNZXNzYWdlKSwgJyRmYXN0X3dyaXRlJygnfScpLCBubC4KKyckZXJyb3JfbWVzc2FnZScoamF2YV9lcnJvcihHb2FsLEFyZ05vLEV4Y2VwdGlvbikpIDotICEsCisJJyRmYXN0X3dyaXRlJygne0pBVkEgRVJST1I6ICcpLAorCSckd3JpdGVfZ29hbCcoR29hbCksIAorCSckZmFzdF93cml0ZScoJyAtIGFyZyAnKSwgJyRmYXN0X3dyaXRlJyhBcmdObyksCisJJyRmYXN0X3dyaXRlJygnLCBmb3VuZCAnKSwgJyR3cml0ZV9nb2FsJyhFeGNlcHRpb24pLAorCSckZmFzdF93cml0ZScoJ30nKSwgbmwsCisJJyRwcmludF9zdGFja190cmFjZScoRXhjZXB0aW9uKS4KKyckZXJyb3JfbWVzc2FnZScoTWVzc2FnZSkgOi0gCisJJyRmYXN0X3dyaXRlJygneycpLCB3cml0ZShNZXNzYWdlKSwgJyRmYXN0X3dyaXRlJygnfScpLCBubC4KKworJyR3cml0ZV9nb2FsJyhHb2FsKSA6LSBqYXZhKEdvYWwpLCAhLCAKKwljdXJyZW50X291dHB1dChTKSwgJyR3cml0ZV90b1N0cmluZycoUywgR29hbCkuCisnJHdyaXRlX2dvYWwnKEdvYWwpIDotIHdyaXRlKEdvYWwpLgorCitpbGxhcmcoTXNnLCBHb2FsLCBBcmdObykgOi0gdmFyKE1zZyksICEsCisJaWxsYXJnKHZhciwgR29hbCwgQXJnTm8pLgoraWxsYXJnKHZhciwgR29hbCwgQXJnTm8pIDotCisJcmFpc2VfZXhjZXB0aW9uKGluc3RhbnRpYXRpb25fZXJyb3IoR29hbCwgQXJnTm8pKS4KK2lsbGFyZyh0eXBlKFR5cGUpLCBHb2FsLCBBcmdObykgOi0gCisJYXJnKEFyZ05vLCBHb2FsLCBBcmcpLAorCSggIG5vbnZhcihBcmcpIC0+IAorCSAgIEVycm9yID0gdHlwZV9lcnJvcihHb2FsLEFyZ05vLFR5cGUsQXJnKQorCTsgIEVycm9yID0gaW5zdGFudGlhdGlvbl9lcnJvcihHb2FsLEFyZ05vKQorCSksCisJcmFpc2VfZXhjZXB0aW9uKEVycm9yKS4KK2lsbGFyZyhkb21haW4oVHlwZSxFeHBEb21haW4pLCBHb2FsLCBBcmdObykgOi0KKwlhcmcoQXJnTm8sIEdvYWwsIEFyZyksCisJKCAgJyRtYXRjaF90eXBlJyhUeXBlLCBBcmcpIC0+CisJICAgRXJyb3IgPSBkb21haW5fZXJyb3IoR29hbCxBcmdObyxFeHBEb21haW4sQXJnKQorCTsgIG5vbnZhcihBcmcpIC0+CisJICAgRXJyb3IgPSB0eXBlX2Vycm9yKEdvYWwsQXJnTm8sVHlwZSxBcmcpCisJOyAgRXJyb3IgPSBpbnN0YW50aWF0aW9uX2Vycm9yKEdvYWwsQXJnTm8pCisJKSwKKwlyYWlzZV9leGNlcHRpb24oRXJyb3IpLgoraWxsYXJnKGV4aXN0ZW5jZShPYmpUeXBlLEN1bHByaXQsTWVzc2FnZSksIEdvYWwsIEFyZ05vKSA6LQorCXJhaXNlX2V4Y2VwdGlvbihleGlzdGVuY2VfZXJyb3IoR29hbCxBcmdObyxPYmpUeXBlLEN1bHByaXQsTWVzc2FnZSkpLgoraWxsYXJnKHBlcm1pc3Npb24oT3BlcmF0aW9uLCBPYmpUeXBlLCBDdWxwcml0LCBNZXNzYWdlKSwgR29hbCwgXykgOi0KKwlyYWlzZV9leGNlcHRpb24ocGVybWlzc2lvbl9lcnJvcihHb2FsLE9wZXJhdGlvbixPYmpUeXBlLEN1bHByaXQsTWVzc2FnZSkpLgoraWxsYXJnKHJlcHJlc2VudGF0aW9uKEZsYWcpLCBHb2FsLCBBcmdObykgOi0gCisJcmFpc2VfZXhjZXB0aW9uKHJlcHJlc2VudGF0aW9uX2Vycm9yKEdvYWwsQXJnTm8sRmxhZykpLgoraWxsYXJnKGV2YWx1YXRpb24oVHlwZSksIEdvYWwsIEFyZ05vKSA6LSAKKwlyYWlzZV9leGNlcHRpb24oZXZhbHVhdGlvbl9lcnJvcihHb2FsLEFyZ05vLFR5cGUpKS4KK2lsbGFyZyhzeW50YXgoVHlwZSxDdWxwcml0LE1lc3NhZ2UpLCBHb2FsLCBBcmdObykgOi0gCisJcmFpc2VfZXhjZXB0aW9uKHN5bnRheF9lcnJvcihHb2FsLEFyZ05vLFR5cGUsQ3VscHJpdCxNZXNzYWdlKSkuCitpbGxhcmcoc3lzdGVtKE1lc3NhZ2UpLCBfLCBfKSA6LSAKKwlyYWlzZV9leGNlcHRpb24oc3lzdGVtX2Vycm9yKE1lc3NhZ2UpKS4KK2lsbGFyZyhpbnRlcm5hbChNZXNzYWdlKSwgXywgXykgOi0gCisJcmFpc2VfZXhjZXB0aW9uKGludGVybmFsX2Vycm9yKE1lc3NhZ2UpKS4KK2lsbGFyZyhqYXZhKEV4Y2VwdGlvbiksIEdvYWwsIEFyZ05vKSA6LSAKKwlyYWlzZV9leGNlcHRpb24oamF2YV9lcnJvcihHb2FsLEFyZ05vLEV4Y2VwdGlvbikpLgoraWxsYXJnKE1zZywgXywgXykgOi0gcmFpc2VfZXhjZXB0aW9uKE1zZykuCisKKyckbWF0Y2hfdHlwZScodGVybSwgICAgICAgICBfKS4KKyckbWF0Y2hfdHlwZScodmFyaWFibGUsICAgICBYKSA6LSB2YXIoWCkuCisnJG1hdGNoX3R5cGUnKGF0b20sICAgICAgICAgWCkgOi0gYXRvbShYKS4KKyckbWF0Y2hfdHlwZScoYXRvbWljLCAgICAgICBYKSA6LSBhdG9taWMoWCkuCisnJG1hdGNoX3R5cGUnKGJ5dGUsICAgICAgICAgWCkgOi0gaW50ZWdlcihYKSwgMCA9PCBYLCBYID08IDI1NS4KKyckbWF0Y2hfdHlwZScoaW5fYnl0ZSwgICAgICBYKSA6LSBpbnRlZ2VyKFgpLCAtMSA9PCBYLCBYID08IDI1NS4KKyckbWF0Y2hfdHlwZScoY2hhcmFjdGVyLCAgICBYKSA6LSBhdG9tKFgpLCBhdG9tX2xlbmd0aChYLCAxKS4KKyckbWF0Y2hfdHlwZScoaW5fY2hhcmFjdGVyLCBYKSA6LSAoWCA9PSAnZW5kX29mX2ZpbGUnIDsgJyRtYXRjaF90eXBlJyhjaGFyYWN0ZXIsWCkpLgorJyRtYXRjaF90eXBlJyhudW1iZXIsICAgICAgIFgpIDotIG51bWJlcihYKS4KKyckbWF0Y2hfdHlwZScoaW50ZWdlciwgICAgICBYKSA6LSBpbnRlZ2VyKFgpLgorJyRtYXRjaF90eXBlJyhmbG9hdCwgICAgICAgIFgpIDotIGZsb2F0KFgpLgorJyRtYXRjaF90eXBlJyhjYWxsYWJsZSwgICAgIFgpIDotIGNhbGxhYmxlKFgpLgorJyRtYXRjaF90eXBlJyhjb21wb3VuZCwgICAgIFgpIDotIGNvbXBvdW5kKFgpLgorJyRtYXRjaF90eXBlJyhsaXN0LCAgICAgICAgIFgpIDotIG5vbnZhcihYKSwgKFggPSBbXSA7IFggPSBbX3xfXSkuCisnJG1hdGNoX3R5cGUnKGphdmEsICAgICAgICAgWCkgOi0gamF2YShYKS4KKyckbWF0Y2hfdHlwZScoc3RyZWFtLCAgICAgICBYKSA6LSAoamF2YShYLCAnamF2YS5pby5QdXNoYmFja1JlYWRlcicpIDsgamF2YShYLCAnamF2YS5pby5QcmludFdyaXRlcicpKS4KKyckbWF0Y2hfdHlwZScoc3RyZWFtX29yX2FsaWFzLCBYKSA6LSAoYXRvbShYKSA7ICckbWF0Y2hfdHlwZScoc3RyZWFtLCBYKSkuCisnJG1hdGNoX3R5cGUnKGhhc2gsICAgICAgICAgWCkgOi0gamF2YShYLCAnanAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLkhhc2h0YWJsZU9mVGVybScpLgorJyRtYXRjaF90eXBlJyhoYXNoX29yX2FsaWFzLFgpIDotIChhdG9tKFgpIDsgJyRtYXRjaF90eXBlJyhoYXNoLCBYKSkuCisnJG1hdGNoX3R5cGUnKHByZWRpY2F0ZV9pbmRpY2F0b3IsIFgpIDotIAorCW5vbnZhcihYKSwgCisJWCA9IFA6Ri9BLCAKKwlhdG9tKFApLAorCWF0b20oRiksCisJaW50ZWdlcihBKS4KKyUnJG1hdGNoX3R5cGUnKGV2YWx1YWJsZSwgICAgWCkuCislJyRtYXRjaF90eXBlJygnY29udmVydGlibGUgdG8gamF2YScsICBYKS4KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSBVdGlsaXRpZXMKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyckYnVpbHRpbl9hcHBlbmQnKFtdLCBacywgWnMpLgorJyRidWlsdGluX2FwcGVuZCcoW1h8WHNdLCBZcywgW1h8WnNdKSA6LSAnJGJ1aWx0aW5fYXBwZW5kJyhYcywgWXMsIFpzKS4KKworJyRidWlsdGluX21lbWJlcicoWCwgW1h8X10pLgorJyRidWlsdGluX21lbWJlcicoWCwgW198TF0pIDotICckYnVpbHRpbl9tZW1iZXInKFgsIEwpLgkKKworJyRidWlsdGluX3JldmVyc2UnKFhzLCBacykgOi0gJyRidWlsdGluX3JldmVyc2UnKFhzLCBbXSwgWnMpLgorJyRidWlsdGluX3JldmVyc2UnKFtdLCBacywgWnMpLgorJyRidWlsdGluX3JldmVyc2UnKFtYfFhzXSwgWXMsIFpzKSA6LSAnJGJ1aWx0aW5fcmV2ZXJzZScoWHMsIFtYfFlzXSwgWnMpLgorCisnJGJ1aWx0aW5fbWVzc2FnZScoW10pIDotICEuCisnJGJ1aWx0aW5fbWVzc2FnZScoW01dKSA6LSAhLCB3cml0ZShNKS4KKyckYnVpbHRpbl9tZXNzYWdlJyhbTXxNc10pIDotIHdyaXRlKE0pLCAnJGZhc3Rfd3JpdGUnKCcgJyksICckYnVpbHRpbl9tZXNzYWdlJyhNcykuCisKKyckbWVtYmVyX2luX3JldmVyc2UnKFgsIFtffExdKSA6LSAnJG1lbWJlcl9pbl9yZXZlcnNlJyhYLCBMKS4KKyckbWVtYmVyX2luX3JldmVyc2UnKFgsIFtYfF9dKS4KKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUgRU5ECisKZGlmZiAtLWdpdCBhL3NyYy9idWlsdGluL3N5c3RlbS5wbCBiL3NyYy9idWlsdGluL3N5c3RlbS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTBjYTllCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2J1aWx0aW4vc3lzdGVtLnBsCkBAIC0wLDAgKzEsMjY4IEBACislOi0gb3AoMTE1MCwgIGZ4LCAocGFja2FnZSkpLiAKKyVwYWNrYWdlKF8pLiAKKzotIHBhY2thZ2UgJ2pwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbicuCis6LSBwdWJsaWMgc3lzdGVtX3ByZWRpY2F0ZS8xLgorCitzeXN0ZW1fcHJlZGljYXRlKHN5c3RlbV9wcmVkaWNhdGUoXykpLgorJSBDb250cm9sIGNvbnN0cnVjdHMKK3N5c3RlbV9wcmVkaWNhdGUodHJ1ZSkuCitzeXN0ZW1fcHJlZGljYXRlKHRoZXJ3aXNlKS4KK3N5c3RlbV9wcmVkaWNhdGUoZmFpbCkuCitzeXN0ZW1fcHJlZGljYXRlKGZhbHNlKS4KK3N5c3RlbV9wcmVkaWNhdGUoKCEpKS4KK3N5c3RlbV9wcmVkaWNhdGUoJyRnZXRfbGV2ZWwnKF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoJyRuZWNrX2N1dCcpLgorc3lzdGVtX3ByZWRpY2F0ZSgnJGN1dCcoXykpLgorc3lzdGVtX3ByZWRpY2F0ZSgoXyBeIF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoKF8gLCBfKSkuCitzeXN0ZW1fcHJlZGljYXRlKChfIDsgXykpLgorc3lzdGVtX3ByZWRpY2F0ZSgoXyAtPiBfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGNhbGwoXykpLgorc3lzdGVtX3ByZWRpY2F0ZShjYXRjaChfLF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZSh0aHJvdyhfKSkuCitzeXN0ZW1fcHJlZGljYXRlKG9uX2V4Y2VwdGlvbihfLF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZShyYWlzZV9leGNlcHRpb24oXykpLgorJSBUZXJtIHVuaWZpY2F0aW9uCitzeXN0ZW1fcHJlZGljYXRlKChfID0gXykpLgorc3lzdGVtX3ByZWRpY2F0ZSgnJHVuaWZ5JyhfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoKF8gXD0gXykpLgorc3lzdGVtX3ByZWRpY2F0ZSgnJG5vdF91bmlmaWFibGUnKF8sXykpLgorJSBUeXBlIHRlc3RpbmcKK3N5c3RlbV9wcmVkaWNhdGUodmFyKF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoYXRvbShfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGludGVnZXIoXykpLgorc3lzdGVtX3ByZWRpY2F0ZShmbG9hdChfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGF0b21pYyhfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGNvbXBvdW5kKF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUobm9udmFyKF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUobnVtYmVyKF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoamF2YShfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGphdmEoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGNsb3N1cmUoXykpLgorc3lzdGVtX3ByZWRpY2F0ZShncm91bmQoXykpLgorc3lzdGVtX3ByZWRpY2F0ZShjYWxsYWJsZShfKSkuCislIFRlcm0gY29tcGFyaXNvbgorc3lzdGVtX3ByZWRpY2F0ZSgoXyA9PSBfKSkuCitzeXN0ZW1fcHJlZGljYXRlKCckZXF1YWxpdHlfb2ZfdGVybScoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKChfIFw9PSBfKSkuCitzeXN0ZW1fcHJlZGljYXRlKCckaW5lcXVhbGl0eV9vZl90ZXJtJyhfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoKF8gQDwgXykpLgorc3lzdGVtX3ByZWRpY2F0ZSgnJGJlZm9yZScoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKChfIEA+IF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoJyRhZnRlcicoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKChfIEA9PCBfKSkuCitzeXN0ZW1fcHJlZGljYXRlKCckbm90X2FmdGVyJyhfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoKF8gQD49IF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoJyRub3RfYmVmb3JlJyhfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoPz0oXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKCckaWRlbnRpY2FsX29yX2Nhbm5vdF91bmlmeScoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGNvbXBhcmUoXyxfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoc29ydChfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoa2V5c29ydChfLF8pKS4KKyVzeXN0ZW1fcHJlZGljYXRlKG1lcmdlKF8sXyxfKSkuCislIFRlcm0gY3JlYXRpb24gYW5kIGRlY29tcG9zaXRpb24KK3N5c3RlbV9wcmVkaWNhdGUoYXJnKF8sXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGZ1bmN0b3IoXyxfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoKF8gPS4uIF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoJyR1bml2JyhfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoY29weV90ZXJtKF8sXykpLgorJSBBcml0aG1ldGljIGV2YWx1YXRpb24KK3N5c3RlbV9wcmVkaWNhdGUoaXMoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKCckYWJzJyhfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoJyRhc2luJyhfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoJyRhY29zJyhfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoJyRhdGFuJyhfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoJyRiaXR3aXNlX2NvbmonKF8sXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKCckYml0d2lzZV9kaXNqJyhfLF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZSgnJGJpdHdpc2VfZXhjbHVzaXZlX29yJyhfLF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZSgnJGJpdHdpc2VfbmVnJyhfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoJyRjZWlsJyhfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoJyRjb3MnKF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZSgnJGRlZ3JlZXMnKF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZSgnJGV4cCcoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKCckZmxvYXQnKF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZSgnJGZsb2F0X2ludGVnZXJfcGFydCcoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKCckZmxvYXRfZnJhY3Rpb25hbF9wYXJ0JyhfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoJyRmbG9hdF9xdW90aWVudCcoXyxfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoJyRmbG9vcicoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKCckaW50X3F1b3RpZW50JyhfLF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZSgnJGxvZycoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKCckbWF4JyhfLF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZSgnJG1pbicoXyxfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoJyRtaW51cycoXyxfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoJyRtb2QnKF8sXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKCckbXVsdGknKF8sXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKCckcGx1cycoXyxfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoJyRwb3cnKF8sXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKCckcmFkaWFucycoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKCckcmludCcoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKCckcm91bmQnKF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZSgnJHNoaWZ0X2xlZnQnKF8sXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKCckc2hpZnRfcmlnaHQnKF8sXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKCckc2lnbicoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKCckc2luJyhfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoJyRzcXJ0JyhfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoJyR0YW4nKF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZSgnJHRydW5jYXRlJyhfLF8pKS4KKyUgQXJpdGhtZXRpYyBjb21wYXJpc29uCitzeXN0ZW1fcHJlZGljYXRlKChfID06PSBfKSkuCitzeXN0ZW1fcHJlZGljYXRlKCckYXJpdGhfZXF1YWwnKF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZSgoXyA9XD0gXykpLgorc3lzdGVtX3ByZWRpY2F0ZSgnJGFyaXRoX25vdF9lcXVhbCcoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKChfIDwgXykpLgorc3lzdGVtX3ByZWRpY2F0ZSgnJGxlc3NfdGhhbicoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKChfID08IF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoJyRsZXNzX29yX2VxdWFsJyhfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoKF8gPiBfKSkuCitzeXN0ZW1fcHJlZGljYXRlKCckZ3JlYXRlcl90aGFuJyhfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoKF8gPj0gXykpLgorc3lzdGVtX3ByZWRpY2F0ZSgnJGdyZWF0ZXJfb3JfZXF1YWwnKF8sXykpLgorJSBDbGF1c2UgcmV0cmlldmFsIGFuZCBpbmZvcm1hdGlvbgorc3lzdGVtX3ByZWRpY2F0ZShjbGF1c2UoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGluaXRpYWxpemF0aW9uKF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZSgnJG5ld19pbmRleGluZ19oYXNoJyhfLF8sXykpLgorJSBDbGF1c2UgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uCitzeXN0ZW1fcHJlZGljYXRlKGFzc2VydChfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGFzc2VydHooXykpLgorc3lzdGVtX3ByZWRpY2F0ZShhc3NlcnRhKF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUocmV0cmFjdChfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGFib2xpc2goXykpLgorc3lzdGVtX3ByZWRpY2F0ZShyZXRyYWN0YWxsKF8pKS4KKyUgQWxsIHNvbHV0aW9ucworc3lzdGVtX3ByZWRpY2F0ZShmaW5kYWxsKF8sXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGJhZ29mKF8sXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKHNldG9mKF8sXyxfKSkuCislIFN0cmVhbSBzZWxlY3Rpb24gYW5kIGNvbnRyb2wKK3N5c3RlbV9wcmVkaWNhdGUoY3VycmVudF9pbnB1dChfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGN1cnJlbnRfb3V0cHV0KF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoc2V0X2lucHV0KF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoc2V0X291dHB1dChfKSkuCitzeXN0ZW1fcHJlZGljYXRlKG9wZW4oXyxfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUob3BlbihfLF8sXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGNsb3NlKF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoY2xvc2UoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGZsdXNoX291dHB1dChfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGZsdXNoX291dHB1dCkuCitzeXN0ZW1fcHJlZGljYXRlKHN0cmVhbV9wcm9wZXJ0eShfLF8pKS4KKyUgQ2hhcmFjdGVyIGlucHV0L291dHB1dAorc3lzdGVtX3ByZWRpY2F0ZShnZXRfY2hhcihfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGdldF9jaGFyKF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZShnZXRfY29kZShfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGdldF9jb2RlKF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZShwZWVrX2NoYXIoXykpLgorc3lzdGVtX3ByZWRpY2F0ZShwZWVrX2NoYXIoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKHBlZWtfY29kZShfKSkuCitzeXN0ZW1fcHJlZGljYXRlKHBlZWtfY29kZShfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUocHV0X2NoYXIoXykpLgorc3lzdGVtX3ByZWRpY2F0ZShwdXRfY2hhcihfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUocHV0X2NvZGUoXykpLgorc3lzdGVtX3ByZWRpY2F0ZShwdXRfY29kZShfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUobmwpLgorc3lzdGVtX3ByZWRpY2F0ZShubChfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGdldDAoXykpLgorc3lzdGVtX3ByZWRpY2F0ZShnZXQwKF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZShnZXQoXykpLgorc3lzdGVtX3ByZWRpY2F0ZShnZXQoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKHB1dChfKSkuCitzeXN0ZW1fcHJlZGljYXRlKHB1dChfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUodGFiKF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUodGFiKF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZShza2lwKF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoc2tpcChfLF8pKS4KKyUgQnl0ZSBpbnB1dC9vdXRwdXQKK3N5c3RlbV9wcmVkaWNhdGUoZ2V0X2J5dGUoXykpLgorc3lzdGVtX3ByZWRpY2F0ZShnZXRfYnl0ZShfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUocGVla19ieXRlKF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUocGVla19ieXRlKF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZShwdXRfYnl0ZShfKSkuCitzeXN0ZW1fcHJlZGljYXRlKHB1dF9ieXRlKF8sXykpLgorJSBUZXJtIGlucHV0L291dHB1dAorc3lzdGVtX3ByZWRpY2F0ZShyZWFkKF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUocmVhZChfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUocmVhZF93aXRoX3ZhcmlhYmxlcyhfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUocmVhZF93aXRoX3ZhcmlhYmxlcyhfLF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZShyZWFkX2xpbmUoXykpLgorc3lzdGVtX3ByZWRpY2F0ZShyZWFkX2xpbmUoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKHdyaXRlKF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUod3JpdGUoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKHdyaXRlcShfKSkuCitzeXN0ZW1fcHJlZGljYXRlKHdyaXRlcShfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUod3JpdGVfY2Fub25pY2FsKF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUod3JpdGVfY2Fub25pY2FsKF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZSh3cml0ZV90ZXJtKF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZSh3cml0ZV90ZXJtKF8sXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKG9wKF8sXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGN1cnJlbnRfb3AoXyxfLF8pKS4KKyUgTG9naWMgYW5kIGNvbnRyb2wKK3N5c3RlbV9wcmVkaWNhdGUoXCsoXykpLgorc3lzdGVtX3ByZWRpY2F0ZShvbmNlKF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUocmVwZWF0KS4KKyUgQXRvbWljIHRlcm0gcHJvY2Vzc2luZworc3lzdGVtX3ByZWRpY2F0ZShhdG9tX2xlbmd0aChfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoYXRvbV9jb25jYXQoXyxfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoc3ViX2F0b20oXyxfLF8sXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGF0b21fY2hhcnMoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGF0b21fY29kZXMoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGNoYXJfY29kZShfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUobnVtYmVyX2NoYXJzKF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZShudW1iZXJfY29kZXMoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKG5hbWUoXyxfKSkuCislIEltcGxlbWVudGF0aW9uIGRlZmluZWQgaG9va3MKK3N5c3RlbV9wcmVkaWNhdGUoc2V0X3Byb2xvZ19mbGFnKF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZShjdXJyZW50X3Byb2xvZ19mbGFnKF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZShoYWx0KS4KK3N5c3RlbV9wcmVkaWNhdGUoaGFsdChfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGFib3J0KS4KKyUgRENHCitzeXN0ZW1fcHJlZGljYXRlKCdDJyhfLF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZShleHBhbmRfdGVybShfLF8pKS4KKyUgSGFzaCBjcmVhdGlvbiBhbmQgY29udHJvbAorc3lzdGVtX3ByZWRpY2F0ZShuZXdfaGFzaChfKSkuCitzeXN0ZW1fcHJlZGljYXRlKG5ld19oYXNoKF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZShoYXNoX2NsZWFyKF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoaGFzaF9jb250YWluc19rZXkoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGhhc2hfZ2V0KF8sXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGhhc2hfaXNfZW1wdHkoXykpLgorc3lzdGVtX3ByZWRpY2F0ZShoYXNoX2tleXMoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGhhc2hfbWFwKF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZShoYXNoX3B1dChfLF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZShoYXNoX3JlbW92ZShfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoaGFzaF9zaXplKF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZSgnJGdldF9oYXNoX21hbmFnZXInKF8pKS4KKyUgSmF2YSBpbnRlcm9wZXJhdGlvbgorc3lzdGVtX3ByZWRpY2F0ZShqYXZhX2NvbnN0cnVjdG9yMChfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoamF2YV9jb25zdHJ1Y3RvcihfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoamF2YV9kZWNsYXJlZF9jb25zdHJ1Y3RvcjAoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGphdmFfZGVjbGFyZWRfY29uc3RydWN0b3IoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGphdmFfbWV0aG9kMChfLF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZShqYXZhX21ldGhvZChfLF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZShqYXZhX2RlY2xhcmVkX21ldGhvZDAoXyxfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoamF2YV9kZWNsYXJlZF9tZXRob2QoXyxfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoamF2YV9nZXRfZmllbGQwKF8sXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGphdmFfZ2V0X2ZpZWxkKF8sXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGphdmFfZ2V0X2RlY2xhcmVkX2ZpZWxkMChfLF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZShqYXZhX2dldF9kZWNsYXJlZF9maWVsZChfLF8sXykpLgorc3lzdGVtX3ByZWRpY2F0ZShqYXZhX3NldF9maWVsZDAoXyxfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoamF2YV9zZXRfZmllbGQoXyxfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoamF2YV9zZXRfZGVjbGFyZWRfZmllbGQwKF8sXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKGphdmFfc2V0X2RlY2xhcmVkX2ZpZWxkKF8sXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKHN5bmNocm9uaXplZChfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoamF2YV9jb252ZXJzaW9uKF8sXykpLgorJSBQcm9sb2cgaW50ZXJwcmV0ZXIKK3N5c3RlbV9wcmVkaWNhdGUoY2FmZXRlcmlhKS4KK3N5c3RlbV9wcmVkaWNhdGUoY29uc3VsdChfKSkuCitzeXN0ZW1fcHJlZGljYXRlKHRyYWNlKS4KK3N5c3RlbV9wcmVkaWNhdGUobm90cmFjZSkuCitzeXN0ZW1fcHJlZGljYXRlKGRlYnVnKS4KK3N5c3RlbV9wcmVkaWNhdGUobm9kZWJ1ZykuCitzeXN0ZW1fcHJlZGljYXRlKGxlYXNoKF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoc3B5KF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUobm9zcHkoXykpLgorc3lzdGVtX3ByZWRpY2F0ZShub3NweWFsbCkuCitzeXN0ZW1fcHJlZGljYXRlKGxpc3RpbmcpLgorc3lzdGVtX3ByZWRpY2F0ZShsaXN0aW5nKF8pKS4KKyUgTWlzYworc3lzdGVtX3ByZWRpY2F0ZShsZW5ndGgoXyxfKSkuCitzeXN0ZW1fcHJlZGljYXRlKG51bWJlcnZhcnMoXyxfLF8pKS4KK3N5c3RlbV9wcmVkaWNhdGUoc3RhdGlzdGljcyhfLF8pKS4KKyUgRU5ECmRpZmYgLS1naXQgYS9zcmMvY29tcGlsZXIvQ29tcGlsZXIuamF2YSBiL3NyYy9jb21waWxlci9Db21waWxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNmM5MjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29tcGlsZXIvQ29tcGlsZXIuamF2YQpAQCAtMCwwICsxLDI5MCBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmNvbXBpbGVyOworaW1wb3J0IGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy4qOworaW1wb3J0IGphdmEuaW8uRmlsZTsKKy8qKgorICogVGhlIDxjb2RlPkNvbXBpbGVyPC9jb2RlPiBjbGFzcyBwcm92aWRlcyBtZXRob2RzIGZvciAKKyAqIHRyYW5zbGF0aW5nIFByb2xvZyBwcm9ncmFtcyBpbnRvIEphdmEgcHJvZ3JhbXMuCisgKgorICogVGhlIDxjb2RlPkNvbXBpbGVyPC9jb2RlPiBjbGFzcyBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbXBpbGVyIG9wdGlvbnMuCisgKiBBbGwgb2YgdGhlbSBhcmUgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGluIGRlZmF1bHQgc2V0dGluZy4KKyAqIDx1bD4KKyAqICAgPGxpPkVsaW1pbmF0ZSBkaXNqdW5jdGlvbnMKKyAqICAgPGxpPkFyaXRobWV0aWMgY29tcGlsYXRpb24KKyAqICAgPGxpPklubGluZSBleHBhbnNpb24KKyAqICAgPGxpPk9wdGltaXNhdGlvbiBvZiByZWN1cnNpdmUgY2FsbAorICogICA8bGk+Mm5kLiBsZXZlbCBpbmRleGluZyAoPGNvZGU+c3dpdGNoX29uX2hhc2g8L2NvZGU+KQorICogPC91bD4KKyAqCisgKiBMZXQgdXMgc2hvdyBhIHNhbXBsZSBzZXNzaW9uIGZvciB0cmFuc2xhdGluZyBhIFByb2xvZyBwcm9ncmFtCisgKiA8Y29kZT4kUExDQUZFRElSL2V4YW1wbGVzL3Byb2xvZy9saXN0LnBsPC9jb2RlPiBpbnRvIEphdmEuCisgKiBUaGUgPGNvZGU+bGlzdC5wbDwvY29kZT4gY29udGFpbnMgcHJlZGljYXRlcworICogPGNvZGU+YXBwZW5kLzM8L2NvZGU+LCA8Y29kZT5ucmV2LzI8L2NvZGU+LCBhbmQgPGNvZGU+cmFuZ2UvMzwvY29kZT4uCisgKiA8dWw+CisgKiA8bGk+RnJvbSBDb21tYW5kIGxpbmU8YnI+CisgKiA8cHJlPgorICogICAgJSBqYXZhIC1jcCAkUExDQUZFRElSL3BsY2FmZS5qYXIganAuYWMua29iZV91LmNzLnByb2xvZy5jb21waWxlci5Db21waWxlcjokQ0xBU1NQQVRIICRQTENBRkVESVIvZXhhbXBsZXMvcHJvbG9nL2xpc3QucGwgCisgKiAgICBQcm9sb2cgQ2FmZSBYLlguWCAoWVlZKQorICogICAgQ29weXJpZ2h0KEMpIDE5OTctMjAwWCBNLkJhbmJhcmEgYW5kIE4uVGFtdXJhCisgKiAgICAlIGxzCisgKiAgICBQUkVEX2FwcGVuZF8zLmphdmEgICAgICBQUkVEX25yZXZfMi5qYXZhICAgICAgICBQUkVEX3JhbmdlXzMuamF2YQorICogPC9wcmU+CisgKiA8bGk+RnJvbSBKYXZhIHByb2dyYW08YnI+CisgKiA8cHJlPgorICogICAgaW1wb3J0IGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuY29tcGlsZXIuQ29tcGlsZXI7CisgKiAgICBwdWJsaWMgY2xhc3MgVCB7CisgKiAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgeworICogICAgICAgICAgICBDb21waWxlciBjb21wID0gbmV3IENvbXBpbGVyKCk7CisgKgkgICAgY29tcC5wcm9sb2dUb0phdmEoYXJndlswXSwgIi4iKTsKKyAqICAgICAgICB9CisgKiAgICB9CisgKiA8L3ByZT4KKyAqIDxwcmU+CisgKiAgICAlIGphdmFjIC1jbGFzc3BhdGggJFBMQ0FGRURJUi9wbGNhZmUuamFyOiRDTEFTU1BBVEggVC5qYXZhCisgKiAgICAlIGphdmEgLWNsYXNzcGF0aCAkUExDQUZFRElSL3BsY2FmZS5qYXI6JENMQVNTUEFUSCBUICRQTENBRkVESVIvZXhhbXBsZXMvcHJvbG9nL2xpc3QucGwgCisgKiAgICAlIGxzCisgKiAgICBQUkVEX2FwcGVuZF8zLmphdmEgICAgICBQUkVEX25yZXZfMi5qYXZhICAgICAgICBQUkVEX3JhbmdlXzMuamF2YQorICogPC9wcmU+CisgKiA8L3VsPgorICoKKyAqIEl0IGlzIG5vdGVkIHRoYXQgCisgKiBvdXIgUHJvbG9nLXRvLUphdmEgdHJhbnNsYXRvciBpcyBvcmlnaW5hbGx5IHdpdHRlbiBpbiBQcm9sb2csIGFuZCB0aGVuIGJvb3RzdHJhcHBlZC4KKyAqIFBsZWFzZSBzZWUgdGhlIGZvbGxvd2luZyB0d28gUHJvbG9nIHByb2dyYW1zIGluIGRldGFpbHMuCisgKiA8dWw+CisgKiAgIDxsaT48Y29kZT4kUExDQUZFRElSL3NyYy9jb21waWxlci9wbDJhbS5wbDwvY29kZT48YnI+CisgKiAgICAgICBUcmFuc2xhdGVzIGEgUHJvbG9nIHByb2dyYW0gaW50byBhIFdBTS1iYXNlZCBpbnRlcm1lZGlhdGUgY29kZS4KKyAqICAgPGxpPjxjb2RlPiRQTENBRkVESVIvc3JjL2NvbXBpbGVyL2FtMmoucGw8L2NvZGU+PGJyPgorICogICAgICAgVHJhbnNsYXRlcyBhIFdBTS1iYXNlZCBpbnRlcm1lZGlhdGUgY29kZSBnZW5lcmF0ZWQgYnkgPGNvZGU+cGwyYW0ucGw8L2NvZGU+IAorICogICAgICAgaW50byBKYXZhIHByb2dyYW1zLgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjIKKyAqLworcHVibGljIGNsYXNzIENvbXBpbGVyIHsKKyAgICAvKiogVmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFZFUlNJT04gICA9ICJQcm9sb2cgQ2FmZSAxLjIuNSAobWFudGlzKSI7CisgICAgLyoqIENvcHlyaWdodCBpbmZvcm1hdGlvbiAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENPUFlSSUdIVCA9ICJDb3B5cmlnaHQoQykgMTk5Ny0yMDA5IE0uQmFuYmFyYSBhbmQgTi5UYW11cmEiOworCisgICAgLyoqIENvbXBpbGVyIG9wdGlvbiBmb3IgZWxpbWluYXRpbmcgZGlzanVuY3Rpb25zLiBJdHMgaW5pdGlhbCB2YWx1ZSBpcyA8Y29kZT50cnVlPC9jb2RlPiAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGVsaW1pbmF0ZURpc2p1bmN0aW9ucyA9IHRydWU7CisgICAgLyoqIENvbXBpbGVyIG9wdGlvbiBmb3IgYXJpdGhtZXRpYyBjb21waWxhdGlvbi4gSXRzIGluaXRpYWwgdmFsdWUgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhcml0aG1ldGljQ29tcGlsYXRpb24gPSB0cnVlOworICAgIC8qKiBDb21waWxlciBvcHRpb24gZm9yIGlubGluZSBleHBhbnNpb24uIEl0cyBpbml0aWFsIHZhbHVlIGlzIDxjb2RlPnRydWU8L2NvZGU+ICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaW5saW5lRXhwYW5zaW9uICAgICAgID0gdHJ1ZTsKKyAgICAvKiogQ29tcGlsZXIgb3B0aW9uIGZvciBvcHRpbWlzaW5nIHJlY3Vyc2l2ZSBjYWxsLiBJdHMgaW5pdGlhbCB2YWx1ZSBpcyA8Y29kZT50cnVlPC9jb2RlPiAqLworICAgIHByb3RlY3RlZCBib29sZWFuIG9wdGltaXNlUmVjdXJzaXZlQ2FsbCA9IHRydWU7CisgICAgLyoqIENvbXBpbGVyIG9wdGlvbiBmb3Igc2Vjb25kLWxldmVsIGluZGV4aW5nLiBJdHMgaW5pdGlhbCB2YWx1ZSBpcyA8Y29kZT50cnVlPC9jb2RlPiAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHN3aXRjaE9uSGFzaCAgICAgICAgICA9IHRydWU7CisgICAgLyoqIE5vbi1zdGFuZGFyZCBvcHRpb24uIENvbXBpbGVyIG9wdGlvbiBmb3IgY2xvc3VyZSBnZW5lcmF0aW9uLiBJdHMgaW5pdGlhbCB2YWx1ZSBpcyA8Y29kZT5mYWxzZTwvY29kZT4gKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0ZUNsb3N1cmUgICAgICAgPSBmYWxzZTsKKworICAgIC8qKiAKKyAgICAgKiBUcmFuc2xhdGVzIGEgUHJvbG9nIHByb2dyYW0gaW50byBhIFdBTS1iYXNlZCBpbnRlcm1lZGlhdGUgY29kZS4gCisgICAgICoKKyAgICAgKiBAcGFyYW0gX3Byb2xvZyBhbiBpbnB1dCBQcm9sb2cgZmlsZQorICAgICAqIEBwYXJhbSBfd2FtIGFuIG91dHB1dCBmaWxlIGZvciBXQU0tYmFzZWQgaW50ZXJtZWRpYXRlIGNvZGUuIAorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3VjY2VlZHMsIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwcm9sb2dUb1dBTShTdHJpbmcgX3Byb2xvZywgU3RyaW5nIF93YW0pIHsKKwl0cnkgeworCSAgICBpZiAoISBmaWxlRXhpc3RzKF9wcm9sb2cpKSB7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiKipFUlJPUjogZmlsZSAiICsgX3Byb2xvZyArICIgZG9lcyBub3QgZXhpc3QiKTsKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJICAgIGlmIChmaWxlRXhpc3RzKF93YW0pKSB7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiKipFUlJPUjogZmlsZSAiICsgX3dhbSArICIgYWxyZWFkeSBleGlzdHMiKTsKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJICAgIC8vIENyZWF0ZSBhcmd1bWVudHMKKwkgICAgVGVybSBwcm9sb2cgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woX3Byb2xvZyk7CisJICAgIFRlcm0gd2FtICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKF93YW0pOworCSAgICBUZXJtIG9wICAgICA9IFByb2xvZy5OaWw7CisJICAgIGlmIChlbGltaW5hdGVEaXNqdW5jdGlvbnMpCisJCW9wID0gbmV3IExpc3RUZXJtKFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiZWQiKSwgb3ApOworCSAgICBpZiAoYXJpdGhtZXRpY0NvbXBpbGF0aW9uKQorCQlvcCA9IG5ldyBMaXN0VGVybShTeW1ib2xUZXJtLm1ha2VTeW1ib2woImFjIiksIG9wKTsKKwkgICAgaWYgKGlubGluZUV4cGFuc2lvbikKKwkJb3AgPSBuZXcgTGlzdFRlcm0oU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJpZSIpLCBvcCk7CisJICAgIGlmIChvcHRpbWlzZVJlY3Vyc2l2ZUNhbGwpCisJCW9wID0gbmV3IExpc3RUZXJtKFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgicmMiKSwgb3ApOworCSAgICBpZiAoc3dpdGNoT25IYXNoKQorCQlvcCA9IG5ldyBMaXN0VGVybShTeW1ib2xUZXJtLm1ha2VTeW1ib2woImlkeCIpLCBvcCk7CisJICAgIGlmIChnZW5lcmF0ZUNsb3N1cmUpCisJCW9wID0gbmV3IExpc3RUZXJtKFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiY2xvIiksIG9wKTsKKwkgICAgVGVybVtdIGFyZ3MgPSB7bmV3IExpc3RUZXJtKHByb2xvZywgbmV3IExpc3RUZXJtKHdhbSwgbmV3IExpc3RUZXJtKG9wLCBQcm9sb2cuTmlsKSkpfTsKKwkgICAgLy8gQ3JlYXRlIHByZWRpY2F0ZQorCSAgICBDbGFzcyBjbGF6eiA9IChuZXcgUHJvbG9nQ2xhc3NMb2FkZXIoKSkubG9hZFByZWRpY2F0ZUNsYXNzKCJqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmNvbXBpbGVyLnBsMmFtIiwgInBsMmFtIiwgMSwgdHJ1ZSk7CisJICAgIFByZWRpY2F0ZSBjb2RlID0gKFByZWRpY2F0ZSkoY2xhenoubmV3SW5zdGFuY2UoKSk7CisJICAgIC8vIFRyYW5zbGF0ZSBQcm9sb2cgaW50byBXQU0KKwkgICAgUHJvbG9nQ29udHJvbCBwID0gbmV3IFByb2xvZ0NvbnRyb2woKTsKKwkgICAgcC5zZXRQcmVkaWNhdGUoY29kZSwgYXJncyk7CisJICAgIC8vCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oY29kZSk7CisJICAgIHJldHVybiBwLmV4ZWN1dGUoY29kZSwgYXJncyk7CisJfSBjYXRjaCAoRXhjZXB0aW9uIGUpeworCSAgICBlLnByaW50U3RhY2tUcmFjZSgpOworCX0KKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIFRyYW5zbGF0ZXMgV0FNLWJhc2VkIGludGVybWVkaWF0ZSBjb2RlIGludG8gSmF2YSBwcm9ncmFtcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBfd2FtIGFuIGlucHV0IGZpbGUgZm9yIFdBTS1iYXNlZCBpbnRlcm1lZGlhdGUgY29kZS4gCisgICAgICogQHBhcmFtIF9kaXIgYSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZm9yIGphdmEgZmlsZXMuIFRoZSBkaXJlY3RvcnkgbXVzdCBhbHJlYWR5IGV4aXN0LgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3VjY2VlZHMsIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICogQHNlZSAjcHJvbG9nVG9XQU0oU3RyaW5nLCBTdHJpbmcpCisgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiB3YW1Ub0phdmEoU3RyaW5nIF93YW0sIFN0cmluZyBfZGlyKSB7CisJdHJ5IHsKKwkgICAgaWYgKCEgZmlsZUV4aXN0cyhfd2FtKSkgeworCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqRVJST1I6IGZpbGUgIiArIF93YW0gKyAiIGRvZXMgbm90IGV4aXN0Iik7CisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgICBpZiAoISBmaWxlRXhpc3RzKF9kaXIpKSB7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiKipFUlJPUjogZGlyZWN0b3J5ICIgKyBfZGlyICsgIiBkb2VzIG5vdCBleGlzdCIpOworCQlyZXR1cm4gZmFsc2U7CisJICAgIH0KKwkgICAgLy8gQ3JlYXRlIGFyZ3VtZW50cworCSAgICBUZXJtIHdhbSAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbChfd2FtKTsKKwkgICAgVGVybSBkaXIgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woX2Rpcik7CisJICAgIFRlcm1bXSBhcmdzID0ge25ldyBMaXN0VGVybSh3YW0sIG5ldyBMaXN0VGVybShkaXIsIFByb2xvZy5OaWwpKX07CisJICAgIC8vIENyZWF0ZSBwcmVkaWNhdGUKKwkgICAgLy8JICAgIENsYXNzIGNsYXp6ID0gUHJlZGljYXRlRW5jb2Rlci5nZXRDbGFzcygianAuYWMua29iZV91LmNzLnByb2xvZy5jb21waWxlci5hbTJqIiwgImFtMmoiLCAxKTsKKwkgICAgQ2xhc3MgY2xhenogPSAobmV3IFByb2xvZ0NsYXNzTG9hZGVyKCkpLmxvYWRQcmVkaWNhdGVDbGFzcygianAuYWMua29iZV91LmNzLnByb2xvZy5jb21waWxlci5hbTJqIiwgImFtMmoiLCAxLCB0cnVlKTsKKwkgICAgUHJlZGljYXRlIGNvZGUgPSAoUHJlZGljYXRlKShjbGF6ei5uZXdJbnN0YW5jZSgpKTsKKwkgICAgLy8gVHJhbnNsYXRlIFdBTSBpbnRvIEphdmEKKwkgICAgUHJvbG9nQ29udHJvbCBwID0gbmV3IFByb2xvZ0NvbnRyb2woKTsKKwkgICAgcC5zZXRQcmVkaWNhdGUoY29kZSwgYXJncyk7CisJICAgIC8vCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oY29kZSk7CisJICAgIHJldHVybiBwLmV4ZWN1dGUoY29kZSwgYXJncyk7CisJfSBjYXRjaCAoRXhjZXB0aW9uIGUpeworCSAgICBlLnByaW50U3RhY2tUcmFjZSgpOworCX0KKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIFRyYW5zbGF0ZXMgYSBQcm9sb2cgcHJvZ3JhbSBpbnRvIEphdmEgcHJvZ3JhbXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvbG9nIGFuIGlucHV0IFByb2xvZyBmaWxlCisgICAgICogQHBhcmFtIGRpciBhIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBmb3IgamF2YSBmaWxlcy4gVGhlIGRpcmVjdG9yeSBtdXN0IGFscmVhZHkgZXhpc3QuCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdWNjZWVkcywgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiBAc2VlICNwcm9sb2dUb1dBTShTdHJpbmcsIFN0cmluZykKKyAgICAgKiBAc2VlICN3YW1Ub0phdmEoU3RyaW5nLCBTdHJpbmcpCisgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwcm9sb2dUb0phdmEoU3RyaW5nIHByb2xvZywgU3RyaW5nIGRpcikgeworCVN0cmluZyB3YW0gPSBwcm9sb2cgKyAiLmFtIjsKKwlpZiAoISBwcm9sb2dUb1dBTShwcm9sb2csIHdhbSkpCisJICAgIHJldHVybiBmYWxzZTsKKwlpZiAoISB3YW1Ub0phdmEod2FtLCBkaXIpKQorCSAgICByZXR1cm4gZmFsc2U7CisJdHJ5IHsKKwkgICAgRmlsZSBmID0gbmV3IEZpbGUod2FtKTsKKwkgICAgaWYgKGYuZXhpc3RzKCkpCisJCWYuZGVsZXRlKCk7CisJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkge30KKwlyZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7CisJdHJ5IHsKKwkgICAgU3lzdGVtLmVyci5wcmludGxuKCJcbiIgKyBWRVJTSU9OKTsgCisJICAgIFN5c3RlbS5lcnIucHJpbnRsbihDT1BZUklHSFQpOworCSAgICBpZiAoYXJndi5sZW5ndGggIT0gMSkgeworCQl1c2FnZSgpOworCQlTeXN0ZW0uZXhpdCg5OTkpOworCSAgICB9IAorCSAgICBDb21waWxlciBjb21wID0gbmV3IENvbXBpbGVyKCk7CisJICAgIGlmICghIGNvbXAucHJvbG9nVG9KYXZhKGFyZ3ZbMF0sICIuIikpCisJCVN5c3RlbS5leGl0KDEpOworCSAgICBTeXN0ZW0uZXhpdCgwKTsKKwl9IGNhdGNoIChFeGNlcHRpb24gZSl7CisJICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisJICAgIFN5c3RlbS5leGl0KDEpOworCX0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gZmlsZUV4aXN0cyhTdHJpbmcgX2ZpbGUpIHsKKwl0cnkgeworCSAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShfZmlsZSk7CisJICAgIHJldHVybiBmaWxlLmV4aXN0cygpOworCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHt9CisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKiBTaG93cyB1c2FnZSAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCB1c2FnZSgpIHsKKwlTdHJpbmcgcyA9ICJVc2FnZTpcbiI7CisJcyArPSAiamF2YSAtY3AgJFBMQ0FGRURJUi9wbGNhZmUuamFyIjsKKwlzICs9ICIganAuYWMua29iZV91LmNzLnByb2xvZy5jb21waWxlci5Db21waWxlciBwcm9sb2dfZmlsZVxuIjsKKwlTeXN0ZW0ub3V0LnByaW50bG4ocyk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIFJldHVybnMgdGhlIGJvb2xlYW4gdmFsdWUgb2YgPGNvZGU+ZWxpbWluYXRlRGlzanVuY3Rpb25zPC9jb2RlPi4KKyAgICAgKiBAc2VlICNlbGltaW5hdGVEaXNqdW5jdGlvbnMKKyAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEVsaW1pbmF0ZURpc2p1bmN0aW9ucygpIHsgcmV0dXJuIGVsaW1pbmF0ZURpc2p1bmN0aW9uczsgfQorICAgIC8qKiAKKyAgICAgKiBUaGUgPGNvZGU+ZWxpbWluYXRlRGlzanVuY3Rpb25zPC9jb2RlPiBmaWVsZCBpcyBzZXQgdG8gPGNvZGU+YjwvY29kZT4uCisgICAgICogQHNlZSAjZWxpbWluYXRlRGlzanVuY3Rpb25zCisgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbGltaW5hdGVEaXNqdW5jdGlvbnMoYm9vbGVhbiBiKSB7IGVsaW1pbmF0ZURpc2p1bmN0aW9ucyA9IGI7IH0KKworICAgIC8qKiAKKyAgICAgKiBSZXR1cm5zIHRoZSBib29sZWFuIHZhbHVlIG9mIDxjb2RlPmFyaXRobWV0aWNDb21waWxhdGlvbjwvY29kZT4uCisgICAgICogQHNlZSAjYXJpdGhtZXRpY0NvbXBpbGF0aW9uCisgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBcml0aG1ldGljQ29tcGlsYXRpb24oKSB7IHJldHVybiBhcml0aG1ldGljQ29tcGlsYXRpb247IH0KKyAgICAvKiogCisgICAgICogVGhlIDxjb2RlPmFyaXRobWV0aWNDb21waWxhdGlvbjwvY29kZT4gZmllbGQgaXMgc2V0IHRvIDxjb2RlPmI8L2NvZGU+LgorICAgICAqIEBzZWUgI2FyaXRobWV0aWNDb21waWxhdGlvbgorICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXJpdGhtZXRpY0NvbXBpbGF0aW9uKGJvb2xlYW4gYikgeyBhcml0aG1ldGljQ29tcGlsYXRpb24gPSBiOyB9CisKKyAgICAvKiogCisgICAgICogUmV0dXJucyB0aGUgYm9vbGVhbiB2YWx1ZSBvZiA8Y29kZT5pbmxpbmVFeHBhbnNpb248L2NvZGU+LgorICAgICAqIEBzZWUgI2lubGluZUV4cGFuc2lvbgorICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SW5saW5lRXhwYW5zaW9uKCkgeyByZXR1cm4gaW5saW5lRXhwYW5zaW9uOyB9CisgICAgLyoqIAorICAgICAqIFRoZSA8Y29kZT5pbmxpbmVFeHBhbnNpb248L2NvZGU+IGZpZWxkIGlzIHNldCB0byA8Y29kZT5iPC9jb2RlPi4KKyAgICAgKiBAc2VlICNpbmxpbmVFeHBhbnNpb24KKyAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElubGluZUV4cGFuc2lvbihib29sZWFuIGIpIHsgaW5saW5lRXhwYW5zaW9uID0gYjsgfQorCisgICAgLyoqIAorICAgICAqIFJldHVybnMgdGhlIGJvb2xlYW4gdmFsdWUgb2YgPGNvZGU+b3B0aW1pc2VSZWN1cnNpdmVDYWxsPC9jb2RlPi4KKyAgICAgKiBAc2VlICNvcHRpbWlzZVJlY3Vyc2l2ZUNhbGwKKyAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE9wdGltaXNlUmVjdXJzaXZlQ2FsbCgpIHsgcmV0dXJuIG9wdGltaXNlUmVjdXJzaXZlQ2FsbDsgfQorICAgIC8qKiAKKyAgICAgKiBUaGUgPGNvZGU+b3B0aW1pc2VSZWN1cnNpdmVDYWxsPC9jb2RlPiBmaWVsZCBpcyBzZXQgdG8gPGNvZGU+YjwvY29kZT4uCisgICAgICogQHNlZSAjb3B0aW1pc2VSZWN1cnNpdmVDYWxsCisgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcHRpbWlzZVJlY3Vyc2l2ZUNhbGwoYm9vbGVhbiBiKSB7IG9wdGltaXNlUmVjdXJzaXZlQ2FsbCA9IGI7IH0KKworICAgIC8qKiAKKyAgICAgKiBSZXR1cm5zIHRoZSBib29sZWFuIHZhbHVlIG9mIDxjb2RlPnN3aXRjaE9uSGFzaDwvY29kZT4uCisgICAgICogQHNlZSAjc3dpdGNoT25IYXNoCisgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTd2l0Y2hPbkhhc2goKSB7IHJldHVybiBzd2l0Y2hPbkhhc2g7IH0KKyAgICAvKiogCisgICAgICogVGhlIDxjb2RlPnN3aXRjaE9uSGFzaDwvY29kZT4gZmllbGQgaXMgc2V0IHRvIDxjb2RlPmI8L2NvZGU+LgorICAgICAqIEBzZWUgI3N3aXRjaE9uSGFzaAorICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3dpdGNoT25IYXNoKGJvb2xlYW4gYikgeyBzd2l0Y2hPbkhhc2ggPSBiOyB9CisKKyAgICAvKiogCisgICAgICogUmV0dXJucyB0aGUgYm9vbGVhbiB2YWx1ZSBvZiA8Y29kZT5nZW5lcmF0ZUNsb3N1cmU8L2NvZGU+LgorICAgICAqIEBzZWUgI2dlbmVyYXRlQ2xvc3VyZQorICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVDbG9zdXJlKCkgeyByZXR1cm4gZ2VuZXJhdGVDbG9zdXJlOyB9CisgICAgLyoqIAorICAgICAqIFRoZSA8Y29kZT5nZW5lcmF0ZUNsb3N1cmU8L2NvZGU+IGZpZWxkIGlzIHNldCB0byA8Y29kZT5iPC9jb2RlPi4KKyAgICAgKiBAc2VlICNnZW5lcmF0ZUNsb3N1cmUKKyAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlQ2xvc3VyZShib29sZWFuIGIpIHsgZ2VuZXJhdGVDbG9zdXJlID0gYjsgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2NvbXBpbGVyL01ha2VmaWxlIGIvc3JjL2NvbXBpbGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYzY4NTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29tcGlsZXIvTWFrZWZpbGUKQEAgLTAsMCArMSw1OCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIwlNYWtlZmlsZSBmb3IgUHJvbG9nIENhZmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUaGUgZm9sbG93aW5nIHR3byBkZWZpbml0aW9ucyB3aWxsIGJlIG92ZXJyaWRkZW4uCisjCisjIFBST0xPRyA6IHRoZSBjb21tYW5kIG9mIFByb2xvZyBzeXN0ZW0gCisjICAgICAgICAgIChleC4gc2ljc3R1cywgc3dpcGwsIG9yIHByb2xvZykKKyMgUFNZU1RFTTogdGhlIHR5cGUgb2YgUHJvbG9nIHN5c3RlbSAKKyMgICAgICAgICAgKGV4LiAnU0lDU3R1cycsICdTV0ktUHJvbG9nJyBvciBvdGhlcnMpCisjCitQUk9MT0cgID0gc2ljc3R1cworUFNZU1RFTSA9ICdTSUNTdHVzJworI1BST0xPRyAgPSBzd2lwbAorI1BTWVNURU0gPSAnU1dJLVByb2xvZycKKworIyBKQVZBQyA6IHRoZSBjb21tYW5kIG9mIEphdmEgY29tcGlsZXIgc3lzdGVtIChleC4gamF2YWMpCisjIEpBUiAgIDogdGhlIGNvbW1hbmQgb2YgSmFyIGFyY2hpdmUgc3lzdGVtIChleC4gamFyKQorSkFWQUMgICAgID0gamF2YWMKK0pBVkFDT1BUUyA9IC1kIC4gLVhsaW50IC1jbGFzc3BhdGggJCRQTENBRkVESVIvbGFuZy5qYXI6JCRQTENBRkVESVIvYnVpbHRpbi5qYXI6JCRDTEFTU1BBVEgKK0pBUiAgICAgICA9IGphcgorSkFST1BUUyAgID0gY3ZmCisjIEpBVkEgIDogdGhlIGNvbW1hbmQgb2YgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgKGV4LiBqYXZhKQorSkFWQSAgICAgID0gamF2YQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAucGxqIC50eHQgLmFtIC5wbGMgLnBsICQoU1VGRklYRVMpCisKKy5wbC5wbGM6CisJY3AgLi4vYnVpbHRpbi9zeXN0ZW0ucGwgIC4KKwkuL2NvbXBfcGwgLXYgYHB3ZGAvJCoucGwgYHB3ZGAvJCoucGxjICQoUFJPTE9HKSAkKFBTWVNURU0pCisKKy5wbC5hbToKKwlwbDJhbS5wbGMgLXYgLU8gJDwgJEAKKwktbWtkaXIgJCoKKwlhbTJqLnBsYyAtdiAtZCAkKiAkQAorCisudHh0LnBsajoKKwkuL2NvbXBfcGwgLXYgYHB3ZGAvJCoucGwgYHB3ZGAvJCoucGxqICQoSkFWQSkgJ1Byb2xvZ0NhZmUnCisKK3BsYzogcGwyYW0ucGxjIGFtMmoucGxjCisKK2NvbXBpbGVyOnBsMmFtLmFtIGFtMmouYW0KKwkkKEpBVkFDKSAkKEpBVkFDT1BUUykgcGwyYW0vKi5qYXZhIGFtMmovKi5qYXZhIENvbXBpbGVyLmphdmEKKwkkKEpBUikgJChKQVJPUFRTKSBjb21waWxlci5qYXIganAvYWMva29iZV91L2NzL3Byb2xvZy9jb21waWxlcgorCitwbGo6IHBsMmFtLnBsaiBhbTJqLnBsagorCitjbGVhbjoKKwktcm0gLWYgLXIgYW0yagorCS1ybSAtZiAtciBwbDJhbQorCS1ybSAtZiAtciBqcAorCS1ybSAtZiBjb3JlICp+ICoucWwgKi5zYXYgKi5wbGMgKi5xbGYgKi5xc2F2ICouYW0gKi5wbGogKi5qYXIgc3lzdGVtLnBsCisKK3JlYWxjbGVhbjogY2xlYW4KKworCmRpZmYgLS1naXQgYS9zcmMvY29tcGlsZXIvYW0yai5wbCBiL3NyYy9jb21waWxlci9hbTJqLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNGIxY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29tcGlsZXIvYW0yai5wbApAQCAtMCwwICsxLDEyNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVGltZS1zdGFtcDogPDIwMDgtMTAtMjkgMTA6NDI6NDIgYmFuYmFyYT4KKworTkFNRQorICAgICAgIGFtMmo6IFRyYW5zbGF0aW5nIFdBTS1iYXNlZCBJbnRlcm1lZGlhdGUgQ29kZSBpbnRvIEphdmEKKworVVNBR0UKKyAgICAgICAjIHNpY3N0dXMKKyAgICAgICA/LSBbYW0yal0uICAgCisgICAgICAgPy0gYW0yaihbRmlsZV0pLgorCisgICAgICAgIyBzaWNzdHVzCisgICAgICAgPy0gW2FtMmpdLiAgIAorICAgICAgID8tIGFtMmooW0ZpbGUsIERpcl0pLgorCitQQVJBTUVURVJTCisgICAgICAgRmlsZSBpcyBhbiBpbnB1dCBXQU0tYmFzZWQgSW50ZXJtZWRpYXRlIGZpbGUgbmFtZS4KKworREVTQ1JJUFRJT04KKyAgICAgICBUaGlzIHByb2dyYW0gdHJhbnNsYXRlcyBXQU0tYmFzZWQgaW50ZXJtZWRpYXRlIGNvZGVzIGludG8gSmF2YS4KKyAgICAgICBGb3IgZWFjaCBwcmVkaWNhdGUgcC9uLCB0aGUgZmlsZSBuYW1lZCAiUFJFRF9wX24uamF2YSIgaXMgZ2VuZXJhdGVkLgorICAgICAgIEdlbmVyYXRlZCBmaWxlcyBjYW4gYmUgY29tcGlsZWQgYW5kIGV4ZWN1dGVkIGJ5IHVzdWFsIAorICAgICAgIGphdmEgdXRpbGl0aWVzIChleC4gamF2YWMpIHdpdGggdGhlIFByb2xvZyBDYWZlIHJ1bnRpbWUgc3lzdGVtLgorCitDT1BZUklHSFQKKyAgICAgICBhbTJqIChUcmFuc2xhdGluZyBXQU0tYmFzZWQgSW50ZXJtZWRpYXRlIENvZGUgaW50byBKYXZhKQorICAgICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA4IGJ5IAorICAgICAgICAgIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkgYW5kCisgICAgICAgICAgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisKK1NFRSBBTFNPCisgICAgICAgaHR0cDovL2thbWluYXJpLmlzdGMua29iZS11LmFjLmpwL1Byb2xvZ0NhZmUvCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIERlY2xhcmF0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCis6LSBvcCgxMTcwLCB4ZngsICg6LSkpLgorOi0gb3AoMTE3MCwgeGZ4LCAoLS0+KSkuCis6LSBvcCgxMTcwLCAgZngsICg6LSkpLgorOi0gb3AoMTE3MCwgIGZ4LCAoPy0pKS4KKzotIG9wKDExNTAsICBmeCwgKHB1YmxpYykpLgorOi0gb3AoMTE1MCwgIGZ4LCAocGFja2FnZSkpLiAgJSBQcm9sb2cgQ2FmZSBzcGVjaWZpYworCis6LSBkeW5hbWljIGRlc3RfZGlyLzEuCisKKyUgOi0gbW9kdWxlKCdqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmNvbXBpbGVyLmFtMmonLCBbbWFpbi8wLGFtMmovMV0pLgorcGFja2FnZShfKS4gCis6LSBwYWNrYWdlICdqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmNvbXBpbGVyLmFtMmonLgorOi0gcHVibGljIG1haW4vMCwgYW0yai8xLgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIE1haW4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbWFpbiA6LSAKKwlyZWFkKFgpLCAKKwlhbTJqKFgpLgorCithbTJqKFtGaWxlXSkgOi0gISwgYW0yaihbRmlsZSwgJy4nXSkuCithbTJqKFtGaWxlLERpcl0pIDotCisJcmV0cmFjdGFsbChkZXN0X2RpcihfKSksCisJYXNzZXJ0KGRlc3RfZGlyKERpcikpLAorCW9wZW4oRmlsZSwgcmVhZCwgSW4pLAorCXJlcGVhdCwKKwkgIHJlYWQoSW4sIFgpLAorCSAgd3JpdGVfamF2YShYLCBJbiksCisJWCA9PSBlbmRfb2ZfZmlsZSwKKwkhLAorCWNsb3NlKEluKS4KKword3JpdGVfamF2YShYLCBfKSA6LSB2YXIoWCksICEsIAorCWFtMmpfZXJyb3IoW3VuYm91bmQsdmFyaWFibGUsaXMsZm91bmRdKSwgCisJZmFpbC4KK3dyaXRlX2phdmEoZW5kX29mX2ZpbGUsIF8pIDotICEuCit3cml0ZV9qYXZhKCg6LSBHKSwgXykgOi0gISwgY2FsbChHKS4KK3dyaXRlX2phdmEoYmVnaW5fcHJlZGljYXRlKEZBKSwgSW4pIDotCisJY2xhdXNlKGRlc3RfZGlyKERpciksIF8pLAorCUZBID0gRi9BLAorCXByZWRpY2F0ZV9lbmNvZGluZyhGLCBGMSksCisJbGlzdF90b19zdHJpbmcoW0RpciwgJy9QUkVEJyxGMSwnXycsQSwnLmphdmEnXSwgRmlsZSksCisJb3BlbihGaWxlLCB3cml0ZSwgT3V0KSwKKwlyZXBlYXQsCisJICByZWFkKEluLCBYKSwKKwkgIHdyaXRlX2phdmEwKFgsIEluLCBPdXQpLAorCVggPT0gZW5kX3ByZWRpY2F0ZShGQSksCisJY2xvc2UoT3V0KSwKKwkhLgord3JpdGVfamF2YShYLCBfKSA6LSAKKwlhbTJqX2Vycm9yKFtYLGlzLGFuLGludmFsaWQsYXJndW1lbnQsaW4sd3JpdGVfamF2YS8yXSksCisJZmFpbC4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIFdyaXRlIEphdmEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLword3JpdGVfamF2YTAoWCwgXywgXykgOi0gdmFyKFgpLCAhLAorCWFtMmpfZXJyb3IoW3VuYm91bmQsdmFyaWFibGUsaXMsZm91bmRdKSwKKwlmYWlsLgord3JpdGVfamF2YTAoW10sIF8sIF8pIDotICEuCit3cml0ZV9qYXZhMChbWHxYc10sIEluLCBPdXQpIDotICEsCisJd3JpdGVfamF2YTAoWCwgSW4sIE91dCksCisJd3JpdGVfamF2YTAoWHMsIEluLCBPdXQpLgord3JpdGVfamF2YTAoZW5kX3ByZWRpY2F0ZShfKSwgXywgT3V0KSA6LSAhLAorCXRhYihPdXQsIDQpLAorCXdyaXRlKE91dCwgJ30nKSwgbmwoT3V0KSwKKwl3cml0ZShPdXQsICd9JyksIG5sKE91dCkuCit3cml0ZV9qYXZhMChjb21tZW50KENvbW1lbnQpLCBfLCBPdXQpIDotICEsCisJbnVtYmVydmFycyhDb21tZW50LCAwLCBfKSwKKwl0YWIoT3V0LCA0KSwgCisJd3JpdGUoT3V0LCAnLy8gJyksIAorCXdyaXRlcShPdXQsIENvbW1lbnQpLCBubChPdXQpLgord3JpdGVfamF2YTAoZGVidWcoQ29tbWVudCksIF8sIE91dCkgOi0gISwKKwludW1iZXJ2YXJzKENvbW1lbnQsIDAsIF8pLAorCXdyaXRlKE91dCwgJy8vICcpLCAKKwl3cml0ZXEoT3V0LCBDb21tZW50KSwgbmwoT3V0KS4KK3dyaXRlX2phdmEwKGluZm8oW0ZBLEZpbGV8X10pLCBfLCBPdXQpIDotICEsCisJd3JpdGUoT3V0LCAnLyonKSwgbmwoT3V0KSwKKyAgICAgICAgd3JpdGUoT3V0LCAnIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgUHJvbG9nIENhZmUuJyksIG5sKE91dCksCisgICAgICAgIHdyaXRlKE91dCwgJyBQTEVBU0UgRE8gTk9UIEVESVQhJyksIG5sKE91dCksCisgICAgICAgIHdyaXRlKE91dCwgJyovJyksIG5sKE91dCksCisJd3JpdGUoT3V0LCAnLyoqJyksIG5sKE91dCksCisgICAgICAgIHdyaXRlKE91dCwgJyA8Y29kZT4nKSwgd3JpdGVxKE91dCwgRkEpLCB3cml0ZShPdXQsICc8L2NvZGU+JyksCisgICAgICAgIHdyaXRlKE91dCwgJyBkZWZpbmVkIGluICcpLCB3cml0ZShPdXQsIEZpbGUpLCB3cml0ZShPdXQsICc8YnI+JyksIG5sKE91dCksCisgICAgICAgIHdyaXRlKE91dCwgJyBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCknKSwgbmwoT3V0KSwKKyAgICAgICAgd3JpdGUoT3V0LCAnIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApJyksIG5sKE91dCksCisgICAgICAgIHdyaXRlKE91dCwgJyBAdmVyc2lvbiAxLjAnKSwgbmwoT3V0KSwKKyAgICAgICAgd3JpdGUoT3V0LCAnKi8nKSwgbmwoT3V0KS4KK3dyaXRlX2phdmEwKHBhY2thZ2VfbmFtZSh1c2VyKSwgXywgXykgOi0gIS4KK3dyaXRlX2phdmEwKHBhY2thZ2VfbmFtZShQKSwgXywgT3V0KSA6LSAhLAorCXdyaXRlKE91dCwgJ3BhY2thZ2UgJyksIAorCXdyaXRlX3BhY2thZ2UoUCwgT3V0KSwgCisJd3JpdGUoT3V0LCAnOycpLCBubChPdXQpLgord3JpdGVfamF2YTAoaW1wb3J0X3BhY2thZ2UoUCksIF8sIE91dCkgOi0gISwKKwl3cml0ZShPdXQsICdpbXBvcnQgJyksIAorCXdyaXRlX3BhY2thZ2UoUCwgT3V0KSwgCisJd3JpdGUoT3V0LCAnLio7JyksIG5sKE91dCkuCit3cml0ZV9qYXZhMChpbXBvcnRfcGFja2FnZShQLEZBKSwgXywgT3V0KSA6LSAhLAorCXdyaXRlKE91dCwgJ2ltcG9ydCAnKSwgCisJd3JpdGVfcGFja2FnZShQLCBPdXQpLCAKKwl3cml0ZShPdXQsICcuJyksIAorCShGQSA9IF8vXyAtPiAKKwkgICAgd3JpdGVfY2xhc3NfbmFtZShGQSwgT3V0KQorCSAgICA7CisJICAgIHdyaXRlX3BhY2thZ2UoRkEsIE91dCkKKwkpLAorCXdyaXRlKE91dCwgJzsnKSwgbmwoT3V0KS4KK3dyaXRlX2phdmEwKChMYWJlbDogSW5zdHJ1Y3Rpb24pLCBJbiwgT3V0KSA6LSAhLAorCXdyaXRlX2xhYmVsKExhYmVsLCBPdXQpLAorCXdyaXRlX2phdmEwKEluc3RydWN0aW9uLCBJbiwgT3V0KS4KK3dyaXRlX2phdmEwKGxhYmVsKEwpLCBfLCBPdXQpIDotICEsCisJdGFiKE91dCwgNCksCisJd3JpdGUoT3V0LCAnc3RhdGljIFByZWRpY2F0ZSAnKSwKKwl3cml0ZV9pbmRleChMLCBPdXQpLAorCXdyaXRlKE91dCwgJyA9IG5ldyAnKSwKKwl3cml0ZV9jbGFzc19uYW1lKEwsIE91dCksCisJd3JpdGUoT3V0LCAnKCk7JyksIG5sKE91dCkuCit3cml0ZV9qYXZhMChnb3RvKEwpLCBfLCBPdXQpIDotICEsCisJdGFiKE91dCwgOCksCisJd3JpdGUoT3V0LCAncmV0dXJuICcpLAorCXdyaXRlX2luZGV4KEwsIE91dCksCisJd3JpdGUoT3V0LCAnOycpLCBubChPdXQpLgord3JpdGVfamF2YTAoc2V0QjAsIF8sIE91dCkgOi0gISwKKwl0YWIoT3V0LCA4KSwKKwl3cml0ZShPdXQsICdlbmdpbmUuc2V0QjAoKTsnKSwgbmwoT3V0KS4KK3dyaXRlX2phdmEwKGRlcmVmKF8sdm9pZCksIF8sIF8pIDotICEuCit3cml0ZV9qYXZhMChkZXJlZihSaSxSaiksIF8sIE91dCkgOi0gISwKKwl0YWIoT3V0LCA4KSwKKwl3cml0ZV9yZWcoUmosIE91dCksCisJd3JpdGUoT3V0LCAnID0gJyksCisJd3JpdGVfcmVnKFJpLCBPdXQpLAorCXdyaXRlKE91dCwgJy5kZXJlZmVyZW5jZSgpOycpLCBubChPdXQpLgord3JpdGVfamF2YTAoc2V0KF8sdm9pZCksIF8sIF8pIDotICEuCit3cml0ZV9qYXZhMChzZXQoUmksUmopLCBfLCBPdXQpIDotICEsCisJdGFiKE91dCwgOCksCisJd3JpdGVfcmVnKFJqLCBPdXQpLAorCXdyaXRlKE91dCwgJyA9ICcpLAorCXdyaXRlX3JlZyhSaSwgT3V0KSwgCisJd3JpdGUoT3V0LCAnOycpLCBubChPdXQpLgord3JpdGVfamF2YTAoZGVjbF90ZXJtX3ZhcnMoW10pLCBfLCBfKSA6LSAhLgord3JpdGVfamF2YTAoZGVjbF90ZXJtX3ZhcnMoTCksIF8sIE91dCkgOi0gISwKKwl0YWIoT3V0LCA4KSwKKwl3cml0ZShPdXQsICdUZXJtICcpLAorCXdyaXRlX3JlZ19hcmdzKEwsIE91dCksCisJd3JpdGUoT3V0LCAnOycpLCBubChPdXQpLgord3JpdGVfamF2YTAoZGVjbF9wcmVkX3ZhcnMoW10pLCBfLCBfKSA6LSAhLgord3JpdGVfamF2YTAoZGVjbF9wcmVkX3ZhcnMoTCksIF8sIE91dCkgOi0gISwKKwl0YWIoT3V0LCA4KSwKKwl3cml0ZShPdXQsICdQcmVkaWNhdGUgJyksCisJd3JpdGVfcmVnX2FyZ3MoTCwgT3V0KSwKKwl3cml0ZShPdXQsICc7JyksIG5sKE91dCkuCit3cml0ZV9qYXZhMChwdXRfY29udChCaW5HLEMpLCBfLCBPdXQpIDotICEsCisJKEJpbkcgPSBQOkcgLT4gdHJ1ZSA7IEJpbkcgPSBHKSwKKwlmdW5jdG9yKEcsIEYsIEEwKSwKKwlBIGlzIEEwLTEsCisJRyA9Li4gW0Z8QXJnc10sCisJdGFiKE91dCwgOCksCisJd3JpdGVfcmVnKEMsIE91dCksCisJd3JpdGUoT3V0LCAnID0gbmV3ICcpLAorCShub252YXIoUCkgLT4gd3JpdGVfcGFja2FnZShQLCBPdXQpLCB3cml0ZShPdXQsICcuJykgOyB0cnVlKSwKKwl3cml0ZV9jbGFzc19uYW1lKEYvQSwgT3V0KSwKKwl3cml0ZShPdXQsICcoJyksCisJd3JpdGVfcmVnX2FyZ3MoQXJncywgT3V0KSwKKwl3cml0ZShPdXQsICcpOycpLCBubChPdXQpLgord3JpdGVfamF2YTAoZXhlY3V0ZShjb250KSwgXywgT3V0KSA6LSAhLAorCXRhYihPdXQsIDgpLAorCXdyaXRlKE91dCwgJ3JldHVybiBjb250OycpLCBubChPdXQpLgord3JpdGVfamF2YTAoZXhlY3V0ZShCaW5HKSwgXywgT3V0KSA6LSAhLAorCShCaW5HID0gUDpHIC0+IHRydWUgOyBCaW5HID0gRyksCisJZnVuY3RvcihHLCBGLCBBMCksCisJQSBpcyBBMC0xLAorCUcgPS4uIFtGfEFyZ3NdLAorCXRhYihPdXQsIDgpLAorCXdyaXRlKE91dCwgJ3JldHVybiBuZXcgJyksCisJKG5vbnZhcihQKSAtPiB3cml0ZV9wYWNrYWdlKFAsIE91dCksIHdyaXRlKE91dCwgJy4nKSA7IHRydWUpLAorCXdyaXRlX2NsYXNzX25hbWUoRi9BLCBPdXQpLAorCXdyaXRlKE91dCwgJygnKSwKKwl3cml0ZV9yZWdfYXJncyhBcmdzLCBPdXQpLAorCXdyaXRlKE91dCwgJyk7JyksIG5sKE91dCkuCit3cml0ZV9qYXZhMChpbmxpbmUoRyksIEluLCBPdXQpIDotIAorCXdyaXRlX2lubGluZShHLCBJbiwgT3V0KSwKKwkhLgord3JpdGVfamF2YTAoJyRJTlNFUlQnKFgpLCBJbiwgT3V0KSA6LSAKKwl3cml0ZV9pbnNlcnQoWCwgSW4sIE91dCksCisJIS4KK3dyaXRlX2phdmEwKG5ld19oYXNoKFRhZyxJKSwgXywgT3V0KSA6LSAhLAorCXRhYihPdXQsIDQpLAorCXdyaXRlKE91dCwgJ3N0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlPFRlcm0sIFByZWRpY2F0ZT4gJyksCisJKFRhZyA9PSBpbnQgLT4gd3JpdGUoT3V0LCAnSW50JykgOyB3cml0ZShPdXQsIFRhZykpLAorCXdyaXRlKE91dCwgJyA9IG5ldyBqYXZhLnV0aWwuSGFzaHRhYmxlPFRlcm0sIFByZWRpY2F0ZT4oJyksCisJd3JpdGUoT3V0LCBJKSwKKwl3cml0ZShPdXQsICcpOycpLCBubChPdXQpLgord3JpdGVfamF2YTAocHV0X2hhc2goWCxMLFRhZyksIF8sIE91dCkgOi0gISwKKwl0YWIoT3V0LCA4KSwKKwkoVGFnID09IGludCAtPiB3cml0ZShPdXQsICdJbnQnKSA7IHdyaXRlKE91dCwgVGFnKSksCisJd3JpdGUoT3V0LCAnLnB1dCgnKSwKKwl3cml0ZV9yZWcoWCwgT3V0KSwKKwl3cml0ZShPdXQsICcsICcpLAorCXdyaXRlX2luZGV4KEwsIE91dCksCisJd3JpdGUoT3V0LCAnKTsnKSwgbmwoT3V0KS4KK3dyaXRlX2phdmEwKHN0YXRpYyhJbnN0cnMpLCBJbiwgT3V0KSA6LSAhLAorCXRhYihPdXQsIDQpLAorCXdyaXRlKE91dCwgJ3N0YXRpYyB7JyksIG5sKE91dCksCisJd3JpdGVfamF2YTAoSW5zdHJzLCBJbiwgT3V0KSwKKwl0YWIoT3V0LCA0KSwKKwl3cml0ZShPdXQsICd9JyksIG5sKE91dCkuCislJSUgUHV0IEluc3RydWN0aW9ucword3JpdGVfamF2YTAocHV0X3ZhcihYKSwgXywgT3V0KSA6LSAhLAorCXRhYihPdXQsIDgpLAorCXdyaXRlX3JlZyhYLCBPdXQpLCAKKwl3cml0ZShPdXQsICcgPSBuZXcgVmFyaWFibGVUZXJtKGVuZ2luZSk7JyksIG5sKE91dCkuCit3cml0ZV9qYXZhMChwdXRfaW50KEksWCksIF8sIE91dCkgOi0gISwKKwl0YWIoT3V0LCA0KSwKKwl3cml0ZShPdXQsICdzdGF0aWMgSW50ZWdlclRlcm0gJyksCisJd3JpdGVfcmVnKFgsIE91dCksIAorCXdyaXRlKE91dCwgJyA9IG5ldyBJbnRlZ2VyVGVybSgnKSwKKwkoamF2YV9pbnRlZ2VyKEkpIC0+IHRydWU7IHdyaXRlKE91dCwgJ25ldyBqYXZhLm1hdGguQmlnSW50ZWdlcigiJykpLAorCXdyaXRlKE91dCwgSSksIAorCShqYXZhX2ludGVnZXIoSSkgLT4gdHJ1ZTsgd3JpdGUoT3V0LCAnIiknKSksCisJd3JpdGUoT3V0LCAnKTsnKSwgbmwoT3V0KS4KK3dyaXRlX2phdmEwKHB1dF9mbG9hdChGLFgpLCBfLCBPdXQpIDotICEsCisJdGFiKE91dCwgNCksCisJd3JpdGUoT3V0LCAnc3RhdGljIERvdWJsZVRlcm0gJyksCisJd3JpdGVfcmVnKFgsIE91dCksCisJd3JpdGUoT3V0LCAnID0gbmV3IERvdWJsZVRlcm0oJyksCisJd3JpdGUoT3V0LCBGKSwKKwl3cml0ZShPdXQsICcpOycpLCBubChPdXQpLgord3JpdGVfamF2YTAocHV0X2NvbihDLFgpLCBfLCBPdXQpIDotICEsCisJdGFiKE91dCwgNCksCisJd3JpdGUoT3V0LCAnc3RhdGljIFN5bWJvbFRlcm0gJyksCisJd3JpdGVfcmVnKFgsIE91dCksCisJd3JpdGUoT3V0LCAnID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCInKSwKKwkoQyA9IEYvQSAtPiAKKwkgICAgd3JpdGVfY29uc3RhbnQoRiwgT3V0KSwgd3JpdGUoT3V0LCAnIiwgJyksIHdyaXRlKE91dCwgQSksIHdyaXRlKE91dCwgJyk7JykKKwkgICAgOworCSAgICB3cml0ZV9jb25zdGFudChDLCBPdXQpLCB3cml0ZShPdXQsICciKTsnKQorCSksCisJbmwoT3V0KS4KK3dyaXRlX2phdmEwKHB1dF9saXN0KFhpLFhqLFhrKSwgXywgT3V0KSA6LSAhLAorCShYayA9IHMoXykgLT4gCisJICAgIHRhYihPdXQsIDQpLCB3cml0ZShPdXQsICdzdGF0aWMgTGlzdFRlcm0gJykKKwkgICAgOworCSAgICB0YWIoT3V0LCA4KQorCSksCisJd3JpdGVfcmVnKFhrLCBPdXQpLAorCXdyaXRlKE91dCwgJyA9IG5ldyBMaXN0VGVybSgnKSwKKwl3cml0ZV9yZWcoWGksIE91dCksIAorCXdyaXRlKE91dCwgJywgJyksIAorCXdyaXRlX3JlZyhYaiwgT3V0KSwKKwl3cml0ZShPdXQsICcpOycpLCBubChPdXQpLgord3JpdGVfamF2YTAocHV0X3N0cihYaSxZLFhqKSwgXywgT3V0KSA6LSAhLAorCShYaiA9IHMoXykgLT4gCisJICAgIHRhYihPdXQsIDQpLCB3cml0ZShPdXQsICdzdGF0aWMgU3RydWN0dXJlVGVybSAnKQorCSAgICA7CisJICAgIHRhYihPdXQsIDgpCisJKSwKKwl3cml0ZV9yZWcoWGosIE91dCksCisJd3JpdGUoT3V0LCAnID0gbmV3IFN0cnVjdHVyZVRlcm0oJyksCisJd3JpdGVfcmVnKFhpLCBPdXQpLAorCXdyaXRlKE91dCwgJywgJyksCisJd3JpdGVfcmVnKFksIE91dCksCisJd3JpdGUoT3V0LCAnKTsnKSwgbmwoT3V0KS4KK3dyaXRlX2phdmEwKHB1dF9zdHJfYXJncyhYcyxZKSwgXywgT3V0KSA6LSAhLAorCShZID0gcyhfKSAtPiAKKwkgICAgdGFiKE91dCwgNCksIHdyaXRlKE91dCwgJ3N0YXRpYyAnKQorCSAgICA7CisJICAgIHRhYihPdXQsIDgpCisJKSwKKwl3cml0ZShPdXQsICdUZXJtW10gJyksCisJd3JpdGVfcmVnKFksIE91dCksCisJd3JpdGUoT3V0LCAnID0geycpLAorCXdyaXRlX3JlZ19hcmdzKFhzLCBPdXQpLAorCXdyaXRlKE91dCwgJ307JyksIG5sKE91dCkuCit3cml0ZV9qYXZhMChwdXRfY2xvKEcwLCBYKSwgXywgT3V0KSA6LSAhLAorCShHMCA9IFA6RyAtPiB0cnVlIDsgRzAgPSBHKSwKKwlmdW5jdG9yKEcsIEYsIEEpLAorCUcgPS4uIFtGfEFyZ3MwXSwKKwlhbTJqX2FwcGVuZChBcmdzMCwgWydudWxsJ10sIEFyZ3MpLAorCXRhYihPdXQsIDgpLAorCXdyaXRlX3JlZyhYLCBPdXQpLAorCXdyaXRlKE91dCwgJyA9IG5ldyBDbG9zdXJlVGVybShuZXcgJyksCisJKG5vbnZhcihQKSAtPiB3cml0ZV9wYWNrYWdlKFAsIE91dCksIHdyaXRlKE91dCwgJy4nKSA7IHRydWUpLAorCXdyaXRlX2NsYXNzX25hbWUoRi9BLCBPdXQpLAorCXdyaXRlKE91dCwgJygnKSwKKwl3cml0ZV9yZWdfYXJncyhBcmdzLCBPdXQpLAorCXdyaXRlKE91dCwgJykpOycpLCBubChPdXQpLgorJSUlIEdldCBJbnN0cnVjdGlvbnMKK3dyaXRlX2phdmEwKGdldF92YWwoWGksWGopLCBfLCBPdXQpIDotICEsCisJdGFiKE91dCwgOCksCisJd3JpdGUoT3V0LCAnaWYgKCEgJyksIHdyaXRlX3JlZyhYaSwgT3V0KSwgd3JpdGUoT3V0LCAnLnVuaWZ5KCcpLAorCXdyaXRlX3JlZyhYaiwgT3V0KSwgd3JpdGUoT3V0LCAnLCBlbmdpbmUudHJhaWwpKScpLCBubChPdXQpLAorCXRhYihPdXQsIDEyKSwKKwl3cml0ZShPdXQsICdyZXR1cm4gZW5naW5lLmZhaWwoKTsnKSwgbmwoT3V0KS4KKyV3cml0ZV9qYXZhMChnZXRfaW50KF8sWGksWGopLCBJbiwgT3V0KSA6LSAhLAorJQl3cml0ZV9qYXZhMChnZXRfdmFsKFhpLCBYaiksIEluLCBPdXQpLgord3JpdGVfamF2YTAoZ2V0X2ludChOLFhpLFhqKSwgSW4sIE91dCkgOi0gISwKKwl3cml0ZV9qYXZhMChkZXJlZihYaixYaiksIEluLCBPdXQpLAorCSUgcmVhZCBtb2RlCisJdGFiKE91dCwgOCksIAorCXdyaXRlKE91dCwgJ2lmICgnKSwgd3JpdGVfcmVnKFhqLCBPdXQpLCB3cml0ZShPdXQsICcuaXNJbnRlZ2VyKCkpeycpLCBubChPdXQpLAorCXRhYihPdXQsIDEyKSwgCisJd3JpdGUoT3V0LCAnaWYgKCgoSW50ZWdlclRlcm0pICcpLCB3cml0ZV9yZWcoWGosIE91dCksIHdyaXRlKE91dCwgJykuaW50VmFsdWUoKSAhPSAnKSwKKwl3cml0ZShPdXQsIE4pLCB3cml0ZShPdXQsICcpJyksIG5sKE91dCksCisJdGFiKE91dCwgMTYpLAorIAl3cml0ZShPdXQsICdyZXR1cm4gZW5naW5lLmZhaWwoKTsnKSwgbmwoT3V0KSwKKwklIHdyaXRlIG1vZGUKKwl0YWIoT3V0LCA4KSwKKwl3cml0ZShPdXQsICd9IGVsc2UgaWYgKCcpLCB3cml0ZV9yZWcoWGosIE91dCksIHdyaXRlKE91dCwgJy5pc1ZhcmlhYmxlKCkpeycpLCBubChPdXQpLAorCXRhYihPdXQsIDEyKSwKKwl3cml0ZShPdXQsICcoKFZhcmlhYmxlVGVybSkgJyksIHdyaXRlX3JlZyhYaiwgT3V0KSwgd3JpdGUoT3V0LCAnKS5iaW5kKCcpLAorCXdyaXRlX3JlZyhYaSwgT3V0KSwgd3JpdGUoT3V0LCAnLCBlbmdpbmUudHJhaWwpOycpLCBubChPdXQpLAorCXRhYihPdXQsIDgpLAorCSUgb3RoZXJ3aXNlIGZhaWwKKyAJd3JpdGUoT3V0LCAnfSBlbHNlIHsnKSwgbmwoT3V0KSwKKwl0YWIoT3V0LCAxMiksCisgCXdyaXRlKE91dCwgJ3JldHVybiBlbmdpbmUuZmFpbCgpOycpLCBubChPdXQpLAorCXRhYihPdXQsIDgpLAorIAl3cml0ZShPdXQsICd9JyksIG5sKE91dCkuCisld3JpdGVfamF2YTAoZ2V0X2Zsb2F0KF8sWGksWGopLCBJbiwgT3V0KSA6LSAhLAorJQl3cml0ZV9qYXZhMChnZXRfdmFsKFhpLCBYaiksIEluLCBPdXQpLgord3JpdGVfamF2YTAoZ2V0X2Zsb2F0KE4sWGksWGopLCBJbiwgT3V0KSA6LSAhLAorCXdyaXRlX2phdmEwKGRlcmVmKFhqLFhqKSwgSW4sIE91dCksCisJJSByZWFkIG1vZGUKKwl0YWIoT3V0LCA4KSwgCisJd3JpdGUoT3V0LCAnaWYgKCcpLCB3cml0ZV9yZWcoWGosIE91dCksIHdyaXRlKE91dCwgJy5pc0RvdWJsZSgpKXsnKSwgbmwoT3V0KSwKKwl0YWIoT3V0LCAxMiksIAorCXdyaXRlKE91dCwgJ2lmICgoKERvdWJsZVRlcm0pICcpLCB3cml0ZV9yZWcoWGosIE91dCksIHdyaXRlKE91dCwgJykuZG91YmxlVmFsdWUoKSAhPSAnKSwKKwl3cml0ZShPdXQsIE4pLCB3cml0ZShPdXQsICcpJyksIG5sKE91dCksCisJdGFiKE91dCwgMTYpLAorIAl3cml0ZShPdXQsICdyZXR1cm4gZW5naW5lLmZhaWwoKTsnKSwgbmwoT3V0KSwKKwklIHdyaXRlIG1vZGUKKwl0YWIoT3V0LCA4KSwKKwl3cml0ZShPdXQsICd9IGVsc2UgaWYgKCcpLCB3cml0ZV9yZWcoWGosIE91dCksIHdyaXRlKE91dCwgJy5pc1ZhcmlhYmxlKCkpeycpLCBubChPdXQpLAorCXRhYihPdXQsIDEyKSwKKwl3cml0ZShPdXQsICcoKFZhcmlhYmxlVGVybSkgJyksIHdyaXRlX3JlZyhYaiwgT3V0KSwgd3JpdGUoT3V0LCAnKS5iaW5kKCcpLAorCXdyaXRlX3JlZyhYaSwgT3V0KSwgd3JpdGUoT3V0LCAnLCBlbmdpbmUudHJhaWwpOycpLCBubChPdXQpLAorCXRhYihPdXQsIDgpLAorCSUgb3RoZXJ3aXNlIGZhaWwKKyAJd3JpdGUoT3V0LCAnfSBlbHNlIHsnKSwgbmwoT3V0KSwKKwl0YWIoT3V0LCAxMiksCisgCXdyaXRlKE91dCwgJ3JldHVybiBlbmdpbmUuZmFpbCgpOycpLCBubChPdXQpLAorCXRhYihPdXQsIDgpLAorIAl3cml0ZShPdXQsICd9JyksIG5sKE91dCkuCisld3JpdGVfamF2YTAoZ2V0X2NvbihfLFhpLFhqKSwgSW4sIE91dCkgOi0gISwKKyUJd3JpdGVfamF2YTAoZ2V0X3ZhbChYaSwgWGopLCBJbiwgT3V0KS4KK3dyaXRlX2phdmEwKGdldF9jb24oXyxYaSxYaiksIEluLCBPdXQpIDotICEsCisJd3JpdGVfamF2YTAoZGVyZWYoWGosWGopLCBJbiwgT3V0KSwKKwklIHJlYWQgbW9kZQorCXRhYihPdXQsIDgpLCAKKwl3cml0ZShPdXQsICdpZiAoJyksIHdyaXRlX3JlZyhYaiwgT3V0KSwgd3JpdGUoT3V0LCAnLmlzU3ltYm9sKCkpeycpLCBubChPdXQpLAorCXRhYihPdXQsIDEyKSwgCisJd3JpdGUoT3V0LCAnaWYgKCEgJyksIAorCXdyaXRlX3JlZyhYaiwgT3V0KSwgd3JpdGUoT3V0LCAnLmVxdWFscygnKSwgd3JpdGVfcmVnKFhpLCBPdXQpLCAKKwl3cml0ZShPdXQsICcpKScpLCBubChPdXQpLAorCXRhYihPdXQsIDE2KSwKKyAJd3JpdGUoT3V0LCAncmV0dXJuIGVuZ2luZS5mYWlsKCk7JyksIG5sKE91dCksCisJJSB3cml0ZSBtb2RlCisJdGFiKE91dCwgOCksCisJd3JpdGUoT3V0LCAnfSBlbHNlIGlmICgnKSwgd3JpdGVfcmVnKFhqLCBPdXQpLCB3cml0ZShPdXQsICcuaXNWYXJpYWJsZSgpKXsnKSwgbmwoT3V0KSwKKwl0YWIoT3V0LCAxMiksCisJd3JpdGUoT3V0LCAnKChWYXJpYWJsZVRlcm0pICcpLCB3cml0ZV9yZWcoWGosIE91dCksIHdyaXRlKE91dCwgJykuYmluZCgnKSwKKwl3cml0ZV9yZWcoWGksIE91dCksIHdyaXRlKE91dCwgJywgZW5naW5lLnRyYWlsKTsnKSwgbmwoT3V0KSwKKwl0YWIoT3V0LCA4KSwKKwklIG90aGVyd2lzZSBmYWlsCisgCXdyaXRlKE91dCwgJ30gZWxzZSB7JyksIG5sKE91dCksCisJdGFiKE91dCwgMTIpLAorIAl3cml0ZShPdXQsICdyZXR1cm4gZW5naW5lLmZhaWwoKTsnKSwgbmwoT3V0KSwKKwl0YWIoT3V0LCA4KSwKKyAJd3JpdGUoT3V0LCAnfScpLCBubChPdXQpLgord3JpdGVfamF2YTAoZ2V0X2dyb3VuZChfLFhpLFhqKSwgSW4sIE91dCkgOi0gISwKKwl3cml0ZV9qYXZhMChnZXRfdmFsKFhpLCBYaiksIEluLCBPdXQpLgord3JpdGVfamF2YTAoZ2V0X2xpc3QoWCksIEluLCBPdXQpIDotICEsCisJd3JpdGVfamF2YTAoZGVyZWYoWCxYKSwgSW4sIE91dCksCisJcmVhZF9pbnN0cnVjdGlvbnMoMiwgSW4sIFVzKSwKKwklIHJlYWQgbW9kZQorCXRhYihPdXQsIDgpLCAKKwl3cml0ZShPdXQsICdpZiAoJyksIHdyaXRlX3JlZyhYLCBPdXQpLCB3cml0ZShPdXQsICcuaXNMaXN0KCkpeycpLCBubChPdXQpLAorCXRhYihPdXQsIDEyKSwgCisJd3JpdGUoT3V0LCAnVGVybVtdIGFyZ3MgPSB7KChMaXN0VGVybSknKSwgCisJd3JpdGVfcmVnKFgsIE91dCksIHdyaXRlKE91dCwgJykuY2FyKCksICgoTGlzdFRlcm0pJyksCisJd3JpdGVfcmVnKFgsIE91dCksIHdyaXRlKE91dCwgJykuY2RyKCl9OycpLCBubChPdXQpLAorCXdyaXRlX3VuaWZ5X3JlYWQoVXMsIDAsIE91dCksCisJJSB3cml0ZSBtb2RlCisJdGFiKE91dCwgOCksCisJd3JpdGUoT3V0LCAnfSBlbHNlIGlmICgnKSwgd3JpdGVfcmVnKFgsIE91dCksIHdyaXRlKE91dCwgJy5pc1ZhcmlhYmxlKCkpeycpLCBubChPdXQpLAorCXdyaXRlX3VuaWZ5X3dyaXRlKFVzLCBScywgT3V0KSwKKwl0YWIoT3V0LCAxMiksCisJd3JpdGUoT3V0LCAnKChWYXJpYWJsZVRlcm0pICcpLCB3cml0ZV9yZWcoWCwgT3V0KSwgd3JpdGUoT3V0LCAnKS5iaW5kKG5ldyBMaXN0VGVybSgnKSwKKwl3cml0ZV9yZWdfYXJncyhScywgT3V0KSwgd3JpdGUoT3V0LCAnKSwgZW5naW5lLnRyYWlsKTsnKSwgbmwoT3V0KSwKKwklIG90aGVyd2lzZSBmYWlsCisJdGFiKE91dCwgOCksCisgCXdyaXRlKE91dCwgJ30gZWxzZSB7JyksIG5sKE91dCksCisJdGFiKE91dCwgMTIpLAorIAl3cml0ZShPdXQsICdyZXR1cm4gZW5naW5lLmZhaWwoKTsnKSwgbmwoT3V0KSwKKwl0YWIoT3V0LCA4KSwKKyAJd3JpdGUoT3V0LCAnfScpLCBubChPdXQpLgord3JpdGVfamF2YTAoZ2V0X3N0cihfRi9BLFhpLFhqKSwgSW4sIE91dCkgOi0gISwKKwl3cml0ZV9qYXZhMChkZXJlZihYaixYaiksIEluLCBPdXQpLAorCXJlYWRfaW5zdHJ1Y3Rpb25zKEEsIEluLCBVcyksCisJJSByZWFkIG1vZGUKKwl0YWIoT3V0LCA4KSwgCisJd3JpdGUoT3V0LCAnaWYgKCcpLCB3cml0ZV9yZWcoWGosIE91dCksIHdyaXRlKE91dCwgJy5pc1N0cnVjdHVyZSgpKXsnKSwgbmwoT3V0KSwgJT8/PyA9PSBGCisJdGFiKE91dCwgMTIpLAorCXdyaXRlKE91dCwgJ2lmICghICcpLCB3cml0ZV9yZWcoWGksIE91dCksCisJd3JpdGUoT3V0LCAnLmVxdWFscygoKFN0cnVjdHVyZVRlcm0pJyksIHdyaXRlX3JlZyhYaiwgT3V0KSwKKwl3cml0ZShPdXQsICcpLmZ1bmN0b3IoKSkpJyksIG5sKE91dCksCisJdGFiKE91dCwgMTYpLAorCXdyaXRlKE91dCwgJ3JldHVybiBlbmdpbmUuZmFpbCgpOycpLCBubChPdXQpLAorCXRhYihPdXQsIDEyKSwgCisJd3JpdGUoT3V0LCAnVGVybVtdIGFyZ3MgPSAoKFN0cnVjdHVyZVRlcm0pJyksCisJd3JpdGVfcmVnKFhqLCBPdXQpLCB3cml0ZShPdXQsICcpLmFyZ3MoKTsnKSwgbmwoT3V0KSwKKwl3cml0ZV91bmlmeV9yZWFkKFVzLCAwLCBPdXQpLAorCSUgd3JpdGUgbW9kZQorCXRhYihPdXQsIDgpLAorCXdyaXRlKE91dCwgJ30gZWxzZSBpZiAoJyksIHdyaXRlX3JlZyhYaiwgT3V0KSwgd3JpdGUoT3V0LCAnLmlzVmFyaWFibGUoKSl7JyksIG5sKE91dCksCisJd3JpdGVfdW5pZnlfd3JpdGUoVXMsIFJzLCBPdXQpLAorCXRhYihPdXQsIDEyKSwKKwl3cml0ZShPdXQsICdUZXJtW10gYXJncyA9IHsnKSwgd3JpdGVfcmVnX2FyZ3MoUnMsIE91dCksIHdyaXRlKE91dCwgJ307JyksIG5sKE91dCksCisJdGFiKE91dCwgMTIpLAorCXdyaXRlKE91dCwgJygoVmFyaWFibGVUZXJtKSAnKSwgd3JpdGVfcmVnKFhqLCBPdXQpLCB3cml0ZShPdXQsICcpLmJpbmQobmV3IFN0cnVjdHVyZVRlcm0oJyksCisJd3JpdGVfcmVnKFhpLCBPdXQpLCB3cml0ZShPdXQsICcsIGFyZ3MpLCBlbmdpbmUudHJhaWwpOycpLCBubChPdXQpLAorCSUgb3RoZXJ3aXNlIGZhaWwKKwl0YWIoT3V0LCA4KSwKKyAJd3JpdGUoT3V0LCAnfSBlbHNlIHsnKSwgbmwoT3V0KSwKKwl0YWIoT3V0LCAxMiksCisgCXdyaXRlKE91dCwgJ3JldHVybiBlbmdpbmUuZmFpbCgpOycpLCBubChPdXQpLAorCXRhYihPdXQsIDgpLAorIAl3cml0ZShPdXQsICd9JyksIG5sKE91dCkuCislJSUgQ2hvaWNlIEluc3RydWN0aW9ucword3JpdGVfamF2YTAodHJ5KExpLExqKSwgXywgT3V0KSA6LSAhLCAKKwl0YWIoT3V0LCA4KSwKKwl3cml0ZShPdXQsICdyZXR1cm4gZW5naW5lLmp0cnkoJyksCisJd3JpdGVfaW5kZXgoTGksIE91dCksIAorCXdyaXRlKE91dCwgJywgJyksCisJd3JpdGVfaW5kZXgoTGosIE91dCksCisJd3JpdGUoT3V0LCAnKTsnKSwgbmwoT3V0KS4KK3dyaXRlX2phdmEwKHJldHJ5KExpLExqKSwgXywgT3V0KSA6LSAhLCAKKwl0YWIoT3V0LCA4KSwKKwl3cml0ZShPdXQsICdyZXR1cm4gZW5naW5lLnJldHJ5KCcpLAorCXdyaXRlX2luZGV4KExpLCBPdXQpLCAKKwl3cml0ZShPdXQsICcsICcpLAorCXdyaXRlX2luZGV4KExqLCBPdXQpLCAKKwl3cml0ZShPdXQsICcpOycpLCBubChPdXQpLgord3JpdGVfamF2YTAodHJ1c3QoTCksIF8sIE91dCkgOi0gISwgCisJdGFiKE91dCwgOCksCisJd3JpdGUoT3V0LCAncmV0dXJuIGVuZ2luZS50cnVzdCgnKSwKKwl3cml0ZV9pbmRleChMLCBPdXQpLAorCXdyaXRlKE91dCwgJyk7JyksIG5sKE91dCkuCislJSUgSW5kZXhpbmcgSW5zdHJ1Y3Rpb25zCit3cml0ZV9qYXZhMChzd2l0Y2hfb25fdGVybShMdixMaSxMZixMYyxMcyxMbCksIF8sIE91dCkgOi0gISwgCisJdGFiKE91dCwgOCksCisJd3JpdGUoT3V0LCAncmV0dXJuIGVuZ2luZS5zd2l0Y2hfb25fdGVybSgnKSwKKwl3cml0ZV9pbmRleChMdiwgT3V0KSwgd3JpdGUoT3V0LCAnLCAnKSwKKwl3cml0ZV9pbmRleChMaSwgT3V0KSwgd3JpdGUoT3V0LCAnLCAnKSwKKwl3cml0ZV9pbmRleChMZiwgT3V0KSwgd3JpdGUoT3V0LCAnLCAnKSwKKwl3cml0ZV9pbmRleChMYywgT3V0KSwgd3JpdGUoT3V0LCAnLCAnKSwKKwl3cml0ZV9pbmRleChMcywgT3V0KSwgd3JpdGUoT3V0LCAnLCAnKSwKKwl3cml0ZV9pbmRleChMbCwgT3V0KSwgd3JpdGUoT3V0LCAnKTsnKSwgbmwoT3V0KS4KK3dyaXRlX2phdmEwKHN3aXRjaF9vbl9oYXNoKFRhZyxfLEwsIF8pLCBfLCBPdXQpIDotICEsCisJdGFiKE91dCwgOCksCisJd3JpdGUoT3V0LCAncmV0dXJuIGVuZ2luZS5zd2l0Y2hfb25faGFzaCgnKSwKKwkoVGFnID09IGludCAtPiB3cml0ZShPdXQsICdJbnQnKSA7IHdyaXRlKE91dCwgVGFnKSksCisJd3JpdGUoT3V0LCAnLCAnKSwKKwl3cml0ZV9pbmRleChMLCBPdXQpLCB3cml0ZShPdXQsICcpOycpLCBubChPdXQpLgord3JpdGVfamF2YTAoSW5zdHJ1Y3Rpb24sIF8sIF8pIDotCisJYW0yal9lcnJvcihbSW5zdHJ1Y3Rpb24saXMsYW4saW52YWxpZCxpbnN0cnVjdGlvbl0pLAorCWZhaWwuCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBXcml0ZSBMYWJlbAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit3cml0ZV9sYWJlbChtYWluKEYvQSwgTW9kaWZpZXIpLCBPdXQpIDotICEsCisJKE1vZGlmaWVyID09IChwdWJsaWMpIC0+IHdyaXRlKE91dCwgJ3B1YmxpYyAnKSA7IHRydWUpLCAKKwl3cml0ZShPdXQsICdjbGFzcyAnKSwgCisJd3JpdGVfY2xhc3NfbmFtZShGL0EsIE91dCksIAorCXdyaXRlKE91dCwgJyBleHRlbmRzIFByZWRpY2F0ZSB7JyksIG5sKE91dCkuCit3cml0ZV9sYWJlbChGL0EsIE91dCkgOi0gISwKKwklIGluc3RhbmNlIHZhcmlhYmxlIGRlY2xhcmF0aW9uCisJKEEgPiAwIC0+IAorCSAgICBubChPdXQpLAorCSAgICB3cml0ZV9lbnVtKCdwdWJsaWMgVGVybSAnLCBhcmcsIDEsIEEsICcsICcsICc7JywgNCwgT3V0KSwgbmwoT3V0KQorCSAgICA7CisJICAgIHRydWUKKwkpLAorCSUgZGVjbCBjb250OyA/Pz8KKwklIGNvbnN0cnVjdG9yCisJbmwoT3V0KSwgCisJd3JpdGVfY29uc3RydWN0b3IoRi9BLCBPdXQpLCBubChPdXQpLAorCSUgYXJpdHkgbWV0aG9kCisJbmwoT3V0KSwKKwl0YWIoT3V0LCA0KSwKKwl3cml0ZShPdXQsICdwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gJyksCisJd3JpdGUoT3V0LCBBKSwKKwl3cml0ZShPdXQsICc7IH0nKSwgbmwoT3V0KSwKKwklIHRvU3RyaW5nIG1ldGhvZAorCW5sKE91dCksCisJdGFiKE91dCwgNCksCisJd3JpdGUoT3V0LCAncHVibGljIFN0cmluZyB0b1N0cmluZygpIHsnKSwgbmwoT3V0KSwKKwl0YWIoT3V0LCA4KSwKKwl3cml0ZShPdXQsICdyZXR1cm4gIicpLCB3cml0ZV9jb25zdGFudChGLCBPdXQpLCAKKwkoQSA+IDAgLT4KKwkgICAgd3JpdGVfZW51bSgnKCIgKyAnLCBhcmcsIDEsIEEsICcgKyAiLCIgKyAnLCAnICsgIiknLDAsIE91dCkKKwkgICAgOworCSAgICB0cnVlCisJKSwKKwl3cml0ZShPdXQsICciOycpLCBubChPdXQpLCAKKwl0YWIoT3V0LCA0KSwKKwl3cml0ZShPdXQsICd9JyksIG5sKE91dCksCisJJSBleGVjIG1ldGhvZAorCW5sKE91dCksCisJdGFiKE91dCwgNCksCisJd3JpdGUoT3V0LCAncHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsnKSwgbmwoT3V0KS4KK3dyaXRlX2xhYmVsKEwsIE91dCkgOi0KKwl0YWIoT3V0LCA0KSwKKwl3cml0ZShPdXQsICd9JyksIG5sKE91dCksCisJd3JpdGUoT3V0LCAnfScpLCBubChPdXQpLAorCW5sKE91dCksCisJJSBjbGFzcyBmb3IgY29udHJvbCBpbnN0cnVjdGlvbnMgYW5kIGNsYXVzZXMKKwl3cml0ZShPdXQsICdjbGFzcyAnKSwgCisJd3JpdGVfY2xhc3NfbmFtZShMLCBPdXQpLAorCXdyaXRlKE91dCwgJyBleHRlbmRzICcpLAorCXdyaXRlX3N1cGVyY2xhc3NfbmFtZShMLCBPdXQpLAorCXdyaXRlKE91dCwgJyB7JyksIG5sKE91dCksCisJdGFiKE91dCwgNCksCisJd3JpdGUoT3V0LCAncHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsnKSwgbmwoT3V0KSwgIS4KK3dyaXRlX2xhYmVsKEluc3RydWN0aW9uLCBfLCBfKSA6LQorCWFtMmpfZXJyb3IoW0luc3RydWN0aW9uLGlzLGFuLGludmFsaWQsaW5zdHJ1Y3Rpb25dKSwKKwlmYWlsLgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgV3JpdGUgQ29uc3RydWN0b3IKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLword3JpdGVfY29uc3RydWN0b3IoRi9BLCBPdXQpIDotIAorCXRhYihPdXQsIDQpLCB3cml0ZShPdXQsICdwdWJsaWMgJyksIAorCXdyaXRlX2NsYXNzX25hbWUoRi9BLCBPdXQpLCB3cml0ZShPdXQsICcoJyksCisJKEEgPiAwIC0+CisJICAgIHdyaXRlX2VudW0oJycsICdUZXJtIGEnLCAxLCBBLCAnLCAnLCAnLCAnLCAwLCBPdXQpCisJICAgIDsKKwkgICAgdHJ1ZQorCSksCisJd3JpdGUoT3V0LCAnUHJlZGljYXRlIGNvbnQpIHsnKSwgbmwoT3V0KSwKKwlBID4gMCwKKwlmb3IoSSwgMSwgQSksCisJICAgIHRhYihPdXQsIDgpLAorCSAgICB3cml0ZShPdXQsIGFyZyksIHdyaXRlKE91dCwgSSksIAorCSAgICB3cml0ZShPdXQsICcgPSAnKSwgCisJICAgIHdyaXRlKE91dCwgYSksIHdyaXRlKE91dCwgSSksIAorCSAgICB3cml0ZShPdXQsICc7JyksICBubChPdXQpLAorCWZhaWwuCit3cml0ZV9jb25zdHJ1Y3RvcihGL0EsIE91dCkgOi0KKwl0YWIoT3V0LCA4KSwgCisJd3JpdGUoT3V0LCAndGhpcy5jb250ID0gY29udDsnKSwgbmwoT3V0KSwKKwl0YWIoT3V0LCA0KSwgCisJd3JpdGUoT3V0LCAnfScpLCBubChPdXQpLAorCSUgMC1hcmcgY29uc3RydWN0b3IKKwlubChPdXQpLAorCXRhYihPdXQsIDQpLCAKKwl3cml0ZShPdXQsICdwdWJsaWMgJyksIAorCXdyaXRlX2NsYXNzX25hbWUoRi9BLCBPdXQpLCAKKwl3cml0ZShPdXQsICcoKXt9JyksIG5sKE91dCksCisJJSBzZXRBcmd1bWVudCBtZXRob2QKKwlubChPdXQpLAorCXRhYihPdXQsIDQpLCAKKwl3cml0ZShPdXQsICdwdWJsaWMgdm9pZCBzZXRBcmd1bWVudChUZXJtW10gYXJncywgUHJlZGljYXRlIGNvbnQpIHsnKSwgbmwoT3V0KSwKKwlBID4gMCwKKwlmb3IoSSwgMSwgQSksCisJICAgIEkxIGlzIEktMSwKKwkgICAgdGFiKE91dCwgOCksCisJICAgIHdyaXRlKE91dCwgYXJnKSwgd3JpdGUoT3V0LCBJKSwgCisJICAgIHdyaXRlKE91dCwgJyA9ICcpLCAKKwkgICAgd3JpdGUoT3V0LCAnYXJnc1snKSwgd3JpdGUoT3V0LCBJMSksIHdyaXRlKE91dCwgJ107JyksCisJICAgIG5sKE91dCksCisJZmFpbC4JCit3cml0ZV9jb25zdHJ1Y3RvcihfLCBPdXQpIDotCisJdGFiKE91dCwgOCksIAorCXdyaXRlKE91dCwgJ3RoaXMuY29udCA9IGNvbnQ7JyksIG5sKE91dCksCisJdGFiKE91dCwgNCksIAorCXdyaXRlKE91dCwgJ30nKS4KKword3JpdGVfZW51bShIZWFkLCBTeW0sIFNOLCBFTiwgRGVsaW0sIF8sIFRhYiwgT3V0KSA6LQorCVNOID08IEVOLAorCXRhYihPdXQsIFRhYiksCisJd3JpdGUoT3V0LCBIZWFkKSwgCisJZm9yKEksIFNOLCBFTiksCisJICAgIHdyaXRlKE91dCwgU3ltKSwKKwkgICAgd3JpdGUoT3V0LCBJKSwKKwkgICAgKEkgPCBFTiAtPiB3cml0ZShPdXQsIERlbGltKSA7IHRydWUpLAorCWZhaWwuCit3cml0ZV9lbnVtKF8sIF8sIFNOLCBFTiwgXywgVGFpbCwgXywgT3V0KSA6LQorCVNOID08IEVOLAorCXdyaXRlKE91dCwgVGFpbCkuCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBXcml0ZSBVbmlmeSBJbnN0cnVjdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworJSUlIFJlYWQgTW9kZQord3JpdGVfdW5pZnlfcmVhZChbXSwgXywgXykgOi0gIS4KK3dyaXRlX3VuaWZ5X3JlYWQoW3VuaWZ5X3ZvaWQoSSl8WHNdLCBOLCBPdXQpIDotICEsCisJTjEgaXMgTitJLAorCXdyaXRlX3VuaWZ5X3JlYWQoWHMsIE4xLCBPdXQpLgord3JpdGVfdW5pZnlfcmVhZChbWHxYc10sIE4sIE91dCkgOi0KKwl3cml0ZV91bmlmeV9yKFgsIE4sIE91dCksCisJTjEgaXMgTisxLAorCXdyaXRlX3VuaWZ5X3JlYWQoWHMsIE4xLCBPdXQpLgorCit3cml0ZV91bmlmeV9yKFgsIF8sIF8pIDotIHZhcihYKSwgISwKKwlhbTJqX2Vycm9yKFt1bmJvdW5kLHZhcmlhYmxlLGlzLGZvdW5kXSksCisJZmFpbC4KK3dyaXRlX3VuaWZ5X3IodW5pZnlfdmFyKFgpLCBOLCBPdXQpIDotICEsCisJdGFiKE91dCwgMTIpLAorCXdyaXRlX3JlZyhYLCBPdXQpLAorCXdyaXRlKE91dCwgJyA9ICcpLAorCXdyaXRlX3JlZyhhcmdzKE4pLCBPdXQpLAorCXdyaXRlKE91dCwgJzsnKSwgbmwoT3V0KS4KK3dyaXRlX3VuaWZ5X3IodW5pZnlfdmFsKFgpLCBOLCBPdXQpIDotICEsCisJdGFiKE91dCwgMTIpLAorCXdyaXRlKE91dCwgJ2lmICghICcpLAorCXdyaXRlX3JlZyhYLCBPdXQpLAorCXdyaXRlKE91dCwgJy51bmlmeSgnKSwKKwl3cml0ZV9yZWcoYXJncyhOKSwgT3V0KSwKKwl3cml0ZShPdXQsICcsIGVuZ2luZS50cmFpbCkpJyksIG5sKE91dCksCisJdGFiKE91dCwgMTYpLAorCXdyaXRlKE91dCwgJ3JldHVybiBlbmdpbmUuZmFpbCgpOycpLCBubChPdXQpLgord3JpdGVfdW5pZnlfcih1bmlmeV9pbnQoXyxYKSwgTiwgT3V0KSA6LSAhLCAgICU/Pz8KKwl3cml0ZV91bmlmeV9yKHVuaWZ5X3ZhbChYKSwgTiwgT3V0KS4KK3dyaXRlX3VuaWZ5X3IodW5pZnlfZmxvYXQoXyxYKSwgTiwgT3V0KSA6LSAhLCAlPz8/CisJd3JpdGVfdW5pZnlfcih1bmlmeV92YWwoWCksIE4sIE91dCkuCit3cml0ZV91bmlmeV9yKHVuaWZ5X2NvbihfLFgpLCBOLCBPdXQpIDotICEsICAgJT8/PworCXdyaXRlX3VuaWZ5X3IodW5pZnlfdmFsKFgpLCBOLCBPdXQpLgord3JpdGVfdW5pZnlfcih1bmlmeV9ncm91bmQoXyxYKSwgTiwgT3V0KSA6LSAhLAorCXdyaXRlX3VuaWZ5X3IodW5pZnlfdmFsKFgpLCBOLCBPdXQpLgord3JpdGVfdW5pZnlfcihYLCBfLCBfKSA6LQorCWFtMmpfZXJyb3IoW1gsaXMsYW4saW52YWxpZCxpbnN0cnVjdGlvbl0pLAorCWZhaWwuCisKKyUlJSBXcml0ZSBNb2RlCit3cml0ZV91bmlmeV93cml0ZShbXSwgW10sIF8pIDotICEuCit3cml0ZV91bmlmeV93cml0ZShbdW5pZnlfdm9pZCgwKXxYc10sIFJzLCBPdXQpIDotICEsCisJd3JpdGVfdW5pZnlfd3JpdGUoWHMsIFJzLCBPdXQpLgord3JpdGVfdW5pZnlfd3JpdGUoW3VuaWZ5X3ZvaWQoSSl8WHNdLCBbdm9pZHxSc10sIE91dCkgOi0gCisJSSA+IDAsIAorCSEsCisJSTEgaXMgSS0xLAorCXdyaXRlX3VuaWZ5X3dyaXRlKFt1bmlmeV92b2lkKEkxKXxYc10sIFJzLCBPdXQpLgord3JpdGVfdW5pZnlfd3JpdGUoW1h8WHNdLCBbUnxSc10sIE91dCkgOi0KKwl3cml0ZV91bmlmeV93KFgsIFIsIE91dCksCisJd3JpdGVfdW5pZnlfd3JpdGUoWHMsIFJzLCBPdXQpLgorCit3cml0ZV91bmlmeV93KFgsIF8sIF8pIDotIHZhcihYKSwgISwKKwlhbTJqX2Vycm9yKFt1bmJvdW5kLHZhcmlhYmxlLGlzLGZvdW5kXSksCisJZmFpbC4KK3dyaXRlX3VuaWZ5X3codW5pZnlfdmFyKFgpLCBYLCBPdXQpIDotICEsCisJdGFiKE91dCwgMTIpLAorCXdyaXRlX3JlZyhYLCBPdXQpLAorCXdyaXRlKE91dCwgJyA9IG5ldyBWYXJpYWJsZVRlcm0oZW5naW5lKTsnKSwgbmwoT3V0KS4KK3dyaXRlX3VuaWZ5X3codW5pZnlfdmFsKFgpLCBYLCBfKSA6LSAhLgord3JpdGVfdW5pZnlfdyh1bmlmeV9pbnQoXyxYKSwgWCwgXykgOi0gIS4KK3dyaXRlX3VuaWZ5X3codW5pZnlfZmxvYXQoXyxYKSwgWCwgXykgOi0gIS4KK3dyaXRlX3VuaWZ5X3codW5pZnlfY29uKF8sWCksIFgsIF8pIDotICEuCit3cml0ZV91bmlmeV93KHVuaWZ5X2dyb3VuZChfLFgpLCBYLCBfKSA6LSAhLgord3JpdGVfdW5pZnlfdyhYLCBfLCBfKSA6LQorCWFtMmpfZXJyb3IoW1gsaXMsYW4saW52YWxpZCxpbnN0cnVjdGlvbl0pLAorCWZhaWwuCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBXcml0ZSBJbmxpbmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLword3JpdGVfaW5saW5lKFgsIEluLCBPdXQpIDotCisJd3JpdGVfaW5saW5lX3N0YXJ0KFgsIE91dCksCisJd3JpdGVfaW5saW5lMChYLCBJbiwgT3V0KSwKKwl3cml0ZV9pbmxpbmVfZW5kKE91dCkuCisKK3dyaXRlX2lubGluZV9zdGFydChHb2FsLCBPdXQpIDotCisJdGFiKE91dCwgOCksCisJd3JpdGUoT3V0LCAnLy9TVEFSVCBpbmxpbmUgZXhwYW5zaW9uIG9mICcpLCB3cml0ZShPdXQsIEdvYWwpLCBubChPdXQpLgord3JpdGVfaW5saW5lX2VuZChPdXQpIDotCisJdGFiKE91dCwgOCksCisJd3JpdGUoT3V0LCAnLy9FTkQgaW5saW5lIGV4cGFuc2lvbicpLCBubChPdXQpLgorCislIENvbnRyb2wgY29uc3RydWN0cword3JpdGVfaW5saW5lMChmYWlsLCBfLCBPdXQpIDotICEsCisJdGFiKE91dCwgOCksIHdyaXRlKE91dCwgJ3JldHVybiBlbmdpbmUuZmFpbCgpOycpLCBubChPdXQpLgord3JpdGVfaW5saW5lMCgnJGdldF9sZXZlbCcoWCksIF8sIE91dCkgOi0gISwKKwl3cml0ZV9pZl9mYWlsKG9wKCchJywgdW5pZnkoWCwjKCduZXcgSW50ZWdlclRlcm0nKCdlbmdpbmUuQjAnKSkpKSwgW10sIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckbmVja19jdXQnLCBfLCBPdXQpICAgICA6LSAhLAorCXRhYihPdXQsIDgpLCB3cml0ZShPdXQsICdlbmdpbmUubmVja0N1dCgpOycpLCBubChPdXQpLgord3JpdGVfaW5saW5lMCgnJGN1dCcoWCksIF8sIE91dCkgICAgICAgOi0gISwKKwl3cml0ZV9kZXJlZl9hcmdzKFtYXSwgT3V0KSwKKwl0YWIoT3V0LCA4KSwKKwl3cml0ZShPdXQsICdpZiAoISAnKSwgd3JpdGVfcmVnKFgsIE91dCksIHdyaXRlKE91dCwgJy5pc0ludGVnZXIoKSkgeycpLCBubChPdXQpLAorCXRhYihPdXQsIDEyKSwKKwl3cml0ZShPdXQsICd0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24oImludGVnZXIiLCAnKSwgCisJd3JpdGVfcmVnKFgsIE91dCksIHdyaXRlKE91dCwgJyk7JyksIG5sKE91dCksCisJdGFiKE91dCwgOCksCisJd3JpdGUoT3V0LCAnfSBlbHNlIHsnKSwgbmwoT3V0KSwKKwl0YWIoT3V0LCAxMiksCisJd3JpdGUoT3V0LCAnZW5naW5lLmN1dCgoKEludGVnZXJUZXJtKSAnKSwgd3JpdGVfcmVnKFgsIE91dCksIAorCXdyaXRlKE91dCwgJykuaW50VmFsdWUoKSk7JyksIG5sKE91dCksCisJdGFiKE91dCwgOCksCisJd3JpdGUoT3V0LCAnfScpLCBubChPdXQpLgorJSBUZXJtIHVuaWZpY2F0aW9uCit3cml0ZV9pbmxpbmUwKCckdW5pZnknKFgsWSksIF8sIE91dCkgICAgICAgICA6LSAhLCB3cml0ZV9pZl9mYWlsKG9wKCchJywgdW5pZnkoWCxZKSksIFtdLCA4LCBPdXQpLgord3JpdGVfaW5saW5lMCgnJG5vdF91bmlmaWFibGUnKFgsWSksIF8sIE91dCkgOi0gISwgd3JpdGVfaWZfZmFpbCh1bmlmeShYLFkpLCBbXSwgOCwgT3V0KS4KKyUgVHlwZSB0ZXN0aW5nCit3cml0ZV9pbmxpbmUwKHZhcihYKSwgXywgT3V0KSAgICAgOi0gISwgd3JpdGVfaWZfZmFpbChvcCgnIScsIEAoJ2lzVmFyaWFibGUnKFgpKSksIFtYXSwgOCwgT3V0KS4KK3dyaXRlX2lubGluZTAoYXRvbShYKSwgXywgT3V0KSAgICA6LSAhLCB3cml0ZV9pZl9mYWlsKG9wKCchJywgQCgnaXNTeW1ib2wnKFgpKSksIFtYXSwgOCwgT3V0KS4KK3dyaXRlX2lubGluZTAoaW50ZWdlcihYKSwgXywgT3V0KSA6LSAhLCB3cml0ZV9pZl9mYWlsKG9wKCchJywgQCgnaXNJbnRlZ2VyJyhYKSkpLCBbWF0sIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKGZsb2F0KFgpLCBfLCBPdXQpICAgOi0gISwgd3JpdGVfaWZfZmFpbChvcCgnIScsIEAoJ2lzRG91YmxlJyhYKSkpLCBbWF0sIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKG5vbnZhcihYKSwgXywgT3V0KSAgOi0gISwgd3JpdGVfaWZfZmFpbChAKCdpc1ZhcmlhYmxlJyhYKSksIFtYXSwgOCwgT3V0KS4KK3dyaXRlX2lubGluZTAobnVtYmVyKFgpLCBfLCBPdXQpICA6LSAhLCB3cml0ZV9pZl9mYWlsKG9wKCchJywgQCgnaXNOdW1iZXInKFgpKSksIFtYXSwgOCwgT3V0KS4KK3dyaXRlX2lubGluZTAoamF2YShYKSwgXywgT3V0KSAgICA6LSAhLCB3cml0ZV9pZl9mYWlsKG9wKCchJywgQCgnaXNKYXZhT2JqZWN0JyhYKSkpLCBbWF0sIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKGNsb3N1cmUoWCksIF8sIE91dCkgOi0gISwgd3JpdGVfaWZfZmFpbChvcCgnIScsIEAoJ2lzQ2xvc3VyZScoWCkpKSwgW1hdLCA4LCBPdXQpLgord3JpdGVfaW5saW5lMChhdG9taWMoWCksIF8sIE91dCkgOi0gISwgCisJd3JpdGVfaWZfZmFpbChvcCgnJiYnLG9wKCchJyxAKCdpc1N5bWJvbCcoWCkpKSwgb3AoJyEnLEAoJ2lzTnVtYmVyJyhYKSkpKSwgW1hdLCA4LCBPdXQpLgord3JpdGVfaW5saW5lMChqYXZhKFgsWSksIF8sIE91dCkgOi0gISwgCisJd3JpdGVfaWZfZmFpbChvcCgnIScsIEAoJ2lzSmF2YU9iamVjdCcoWCkpKSwgW1hdLCA4LCBPdXQpLAorCUVYUCA9ICMoJ1N5bWJvbFRlcm0ubWFrZVN5bWJvbCcoQChnZXROYW1lKEAoZ2V0Q2xhc3MoQChvYmplY3QoY2FzdCgnSmF2YU9iamVjdFRlcm0nLFgpKSkpKSkpKSksCisJd3JpdGVfaWZfZmFpbChvcCgnIScsIHVuaWZ5KFksRVhQKSksIFtdLCA4LCBPdXQpLgord3JpdGVfaW5saW5lMChncm91bmQoWCksIF8sIE91dCkgOi0gISwgd3JpdGVfaWZfZmFpbChvcCgnIScsIEAoJ2lzR3JvdW5kJyhYKSkpLCBbWF0sIDgsIE91dCkuCislIFRlcm0gY29tcGFyaXNvbgord3JpdGVfaW5saW5lMCgnJGVxdWFsaXR5X29mX3Rlcm0nKFgsWSksIF8sIE91dCkgICA6LSAhLCB3cml0ZV9pZl9mYWlsKG9wKCchJyxAKCdlcXVhbHMnKFgsWSkpKSwgW1gsWV0sIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckaW5lcXVhbGl0eV9vZl90ZXJtJyhYLFkpLCBfLCBPdXQpIDotICEsIHdyaXRlX2lmX2ZhaWwoQCgnZXF1YWxzJyhYLFkpKSwgW1gsWV0sIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckYWZ0ZXInKFgsWSksIF8sIE91dCkgICAgICAgICAgICAgIDotICEsIHdyaXRlX2lmX2ZhaWwob3AoJzw9JyxAKCdjb21wYXJlVG8nKFgsWSkpLDApLCBbWCxZXSwgOCwgT3V0KS4KK3dyaXRlX2lubGluZTAoJyRiZWZvcmUnKFgsWSksIF8sIE91dCkgICAgICAgICAgICAgOi0gISwgd3JpdGVfaWZfZmFpbChvcCgnPj0nLEAoJ2NvbXBhcmVUbycoWCxZKSksMCksIFtYLFldLCA4LCBPdXQpLgord3JpdGVfaW5saW5lMCgnJG5vdF9hZnRlcicoWCxZKSwgXywgT3V0KSAgICAgICAgICA6LSAhLCB3cml0ZV9pZl9mYWlsKG9wKCc+JywgQCgnY29tcGFyZVRvJyhYLFkpKSwwKSwgW1gsWV0sIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckbm90X2JlZm9yZScoWCxZKSwgXywgT3V0KSAgICAgICAgIDotICEsIHdyaXRlX2lmX2ZhaWwob3AoJzwnLCBAKCdjb21wYXJlVG8nKFgsWSkpLDApLCBbWCxZXSwgOCwgT3V0KS4KK3dyaXRlX2lubGluZTAoJyRpZGVudGljYWxfb3JfY2Fubm90X3VuaWZ5JyhYLFkpLCBfLCBPdXQpIDotICEsCisJd3JpdGVfaWZfZmFpbChvcCgnJiYnLCBvcCgnIScsQCgnZXF1YWxzJyhYLFkpKSksIHVuaWZ5KFgsWSkpLCBbWCxZXSwgOCwgT3V0KS4KKyUgVGVybSBjcmVhdGlvbiBhbmQgZGVjb21wb3NpdGlvbgord3JpdGVfaW5saW5lMChjb3B5X3Rlcm0oWCxZKSwgXywgT3V0KSA6LSBub252YXIoWCksIG5vbnZhcihZKSwgISwKKwl3cml0ZV9pZl9mYWlsKG9wKCchJywgdW5pZnkoWSwgIygnZW5naW5lLmNvcHknKFgpKSkpLCBbWF0sIDgsIE91dCkuCislIEFyaXRobWV0aWMgZXZhbHVhdGlvbgord3JpdGVfaW5saW5lMChpcyhYLFkpLCBfLCBPdXQpICAgICAgICAgICAgICAgICAgICAgICAgOi0gISwgd3JpdGVfYXJpdGgoXywgICAgICAgICAgIFksIFgsIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckYWJzJyhYLFkpLCAgXywgT3V0KSAgICAgICAgICAgICAgICAgICA6LSAhLCB3cml0ZV9hcml0aCgnYWJzJywgICAgICAgWCwgWSwgOCwgT3V0KS4KK3dyaXRlX2lubGluZTAoJyRhc2luJyhYLFkpLCBfLCBPdXQpICAgICAgICAgICAgICAgICAgIDotICEsIHdyaXRlX2FyaXRoKCdhc2luJywgICAgICBYLCBZLCA4LCBPdXQpLgord3JpdGVfaW5saW5lMCgnJGFjb3MnKFgsWSksIF8sIE91dCkgICAgICAgICAgICAgICAgICAgOi0gISwgd3JpdGVfYXJpdGgoJ2Fjb3MnLCAgICAgIFgsIFksIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckYXRhbicoWCxZKSwgXywgT3V0KSAgICAgICAgICAgICAgICAgICA6LSAhLCB3cml0ZV9hcml0aCgnYXRhbicsICAgICAgWCwgWSwgOCwgT3V0KS4KK3dyaXRlX2lubGluZTAoJyRiaXR3aXNlX2NvbmonKFgsWSxaKSwgXywgT3V0KSAgICAgICAgIDotICEsIHdyaXRlX2FyaXRoKCdhbmQnLCAgICAgICBYLCBZLCBaLCA4LCBPdXQpLgord3JpdGVfaW5saW5lMCgnJGJpdHdpc2VfZGlzaicoWCxZLFopLCBfLCBPdXQpICAgICAgICAgOi0gISwgd3JpdGVfYXJpdGgoJ29yJywgICAgICAgIFgsIFksIFosIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckYml0d2lzZV9leGNsdXNpdmVfb3InKFgsWSxaKSwgXywgT3V0KSA6LSAhLCB3cml0ZV9hcml0aCgneG9yJywgICAgICAgWCwgWSwgWiwgOCwgT3V0KS4KK3dyaXRlX2lubGluZTAoJyRiaXR3aXNlX25lZycoWCxZKSwgXywgT3V0KSAgICAgICAgICAgIDotICEsIHdyaXRlX2FyaXRoKCdub3QnLCAgICAgICBYLCBZLCA4LCBPdXQpLgord3JpdGVfaW5saW5lMCgnJGNlaWwnKFgsWSksIF8sIE91dCkgICAgICAgICAgICAgICAgICAgOi0gISwgd3JpdGVfYXJpdGgoJ2NlaWwnLCAgICAgIFgsIFksIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckY29zJyhYLFkpLCBfLCBPdXQpICAgICAgICAgICAgICAgICAgICA6LSAhLCB3cml0ZV9hcml0aCgnY29zJywgICAgICAgWCwgWSwgOCwgT3V0KS4KK3dyaXRlX2lubGluZTAoJyRkZWdyZWVzJyhYLFkpLCBfLCBPdXQpICAgICAgICAgICAgICAgIDotICEsIHdyaXRlX2FyaXRoKCd0b0RlZ3JlZXMnLCBYLCBZLCA4LCBPdXQpLgord3JpdGVfaW5saW5lMCgnJGV4cCcoWCxZKSwgXywgT3V0KSAgICAgICAgICAgICAgICAgICAgOi0gISwgd3JpdGVfYXJpdGgoJ2V4cCcsICAgICAgIFgsIFksIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckZmxvYXQnKFgsWSksIF8sIE91dCkgICAgICAgICAgICAgICAgICA6LSAhLCB3cml0ZV9hcml0aCgndG9GbG9hdCcsICAgWCwgWSwgOCwgT3V0KS4KK3dyaXRlX2lubGluZTAoJyRmbG9hdF9pbnRlZ2VyX3BhcnQnKFgsWSksIF8sIE91dCkgICAgIDotICEsIHdyaXRlX2FyaXRoKCdmbG9hdEludFBhcnQnLCAgIFgsIFksIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckZmxvYXRfZnJhY3Rpb25hbF9wYXJ0JyhYLFkpLCBfLCBPdXQpICA6LSAhLCB3cml0ZV9hcml0aCgnZmxvYXRGcmFjdFBhcnQnLCBYLCBZLCA4LCBPdXQpLgord3JpdGVfaW5saW5lMCgnJGZsb2F0X3F1b3RpZW50JyhYLFksWiksIF8sIE91dCkgICAgICAgOi0gISwgd3JpdGVfYXJpdGgoJ2RpdmlkZScsICAgIFgsIFksIFosIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckZmxvb3InKFgsWSksIF8sIE91dCkgICAgICAgICAgICAgICAgICA6LSAhLCB3cml0ZV9hcml0aCgnZmxvb3InLCAgICAgWCwgWSwgOCwgT3V0KS4KK3dyaXRlX2lubGluZTAoJyRpbnRfcXVvdGllbnQnKFgsWSxaKSwgXywgT3V0KSAgICAgICAgIDotICEsIHdyaXRlX2FyaXRoKCdpbnREaXZpZGUnLCBYLCBZLCBaLCA4LCBPdXQpLgord3JpdGVfaW5saW5lMCgnJGxvZycoWCxZKSwgXywgT3V0KSAgICAgICAgICAgICAgICAgICAgOi0gISwgd3JpdGVfYXJpdGgoJ2xvZycsICAgICAgIFgsIFksIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckbWF4JyhYLFksWiksIF8sIE91dCkgICAgICAgICAgICAgICAgICA6LSAhLCB3cml0ZV9hcml0aCgnbWF4JywgICAgICAgWCwgWSwgWiwgOCwgT3V0KS4KK3dyaXRlX2lubGluZTAoJyRtaW4nKFgsWSxaKSwgXywgT3V0KSAgICAgICAgICAgICAgICAgIDotICEsIHdyaXRlX2FyaXRoKCdtaW4nLCAgICAgICBYLCBZLCBaLCA4LCBPdXQpLgord3JpdGVfaW5saW5lMCgnJG1pbnVzJyhYLFksWiksIF8sIE91dCkgICAgICAgICAgICAgICAgOi0gISwgd3JpdGVfYXJpdGgoJ3N1YnRyYWN0JywgIFgsIFksIFosIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckbW9kJyhYLFksWiksIF8sIE91dCkgICAgICAgICAgICAgICAgICA6LSAhLCB3cml0ZV9hcml0aCgnbW9kJywgICAgICAgWCwgWSwgWiwgOCwgT3V0KS4KK3dyaXRlX2lubGluZTAoJyRtdWx0aScoWCxZLFopLCBfLCBPdXQpICAgICAgICAgICAgICAgIDotICEsIHdyaXRlX2FyaXRoKCdtdWx0aXBseScsICBYLCBZLCBaLCA4LCBPdXQpLgord3JpdGVfaW5saW5lMCgnJHBsdXMnKFgsWSxaKSwgXywgT3V0KSAgICAgICAgICAgICAgICAgOi0gISwgd3JpdGVfYXJpdGgoJ2FkZCcsICAgICAgIFgsIFksIFosIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckcG93JyhYLFksWiksIF8sIE91dCkgICAgICAgICAgICAgICAgICA6LSAhLCB3cml0ZV9hcml0aCgncG93JywgICAgICAgWCwgWSwgWiwgOCwgT3V0KS4KK3dyaXRlX2lubGluZTAoJyRyYWRpYW5zJyhYLFkpLCBfLCBPdXQpICAgICAgICAgICAgICAgIDotICEsIHdyaXRlX2FyaXRoKCd0b1JhZGlhbnMnLCBYLCBZLCA4LCBPdXQpLgord3JpdGVfaW5saW5lMCgnJHJpbnQnKFgsWSksIF8sIE91dCkgICAgICAgICAgICAgICAgICAgOi0gISwgd3JpdGVfYXJpdGgoJ3JpbnQnLCAgICAgIFgsIFksIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckcm91bmQnKFgsWSksIF8sIE91dCkgICAgICAgICAgICAgICAgICA6LSAhLCB3cml0ZV9hcml0aCgncm91bmQnLCAgICAgWCwgWSwgOCwgT3V0KS4KK3dyaXRlX2lubGluZTAoJyRzaGlmdF9sZWZ0JyhYLFksWiksIF8sIE91dCkgICAgICAgICAgIDotICEsIHdyaXRlX2FyaXRoKCdzaGlmdExlZnQnLCBYLCBZLCBaLCA4LCBPdXQpLgord3JpdGVfaW5saW5lMCgnJHNoaWZ0X3JpZ2h0JyhYLFksWiksIF8sIE91dCkgICAgICAgICAgOi0gISwgd3JpdGVfYXJpdGgoJ3NoaWZ0UmlnaHQnLCBYLCBZLCBaLCA4LCBPdXQpLgord3JpdGVfaW5saW5lMCgnJHNpZ24nKFgsWSksIF8sIE91dCkgICAgICAgICAgICAgICAgICAgOi0gISwgd3JpdGVfYXJpdGgoJ3NpZ251bScsICAgIFgsIFksIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckc2luJyhYLFkpLCBfLCBPdXQpICAgICAgICAgICAgICAgICAgICA6LSAhLCB3cml0ZV9hcml0aCgnc2luJywgICAgICAgWCwgWSwgOCwgT3V0KS4KK3dyaXRlX2lubGluZTAoJyRzcXJ0JyhYLFkpLCBfLCBPdXQpICAgICAgICAgICAgICAgICAgIDotICEsIHdyaXRlX2FyaXRoKCdzcXJ0JywgICAgICBYLCBZLCA4LCBPdXQpLgord3JpdGVfaW5saW5lMCgnJHRhbicoWCxZKSwgXywgT3V0KSAgICAgICAgICAgICAgICAgICAgOi0gISwgd3JpdGVfYXJpdGgoJ3RhbicsICAgICAgIFgsIFksIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckdHJ1bmNhdGUnKFgsWSksIF8sIE91dCkgICAgICAgICAgICAgICA6LSAhLCB3cml0ZV9hcml0aCgndHJ1bmNhdGUnLCAgWCwgWSwgOCwgT3V0KS4KKyUgQXJpdGhtZXRpYyBjb21wYXJpc29uCit3cml0ZV9pbmxpbmUwKCckYXJpdGhfZXF1YWwnKFgsWSksIF8sIE91dCkgICAgICA6LSAhLCB3cml0ZV9hcml0aF9jb21wYXJlKCchPScsIFgsIFksIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckYXJpdGhfbm90X2VxdWFsJyhYLFkpLCBfLCBPdXQpICA6LSAhLCB3cml0ZV9hcml0aF9jb21wYXJlKCc9PScsIFgsIFksIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckZ3JlYXRlcl9vcl9lcXVhbCcoWCxZKSwgXywgT3V0KSA6LSAhLCB3cml0ZV9hcml0aF9jb21wYXJlKCc8JywgIFgsIFksIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckZ3JlYXRlcl90aGFuJyhYLFkpLCBfLCBPdXQpICAgICA6LSAhLCB3cml0ZV9hcml0aF9jb21wYXJlKCc8PScsIFgsIFksIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckbGVzc19vcl9lcXVhbCcoWCxZKSwgXywgT3V0KSAgICA6LSAhLCB3cml0ZV9hcml0aF9jb21wYXJlKCc+JywgIFgsIFksIDgsIE91dCkuCit3cml0ZV9pbmxpbmUwKCckbGVzc190aGFuJyhYLFkpLCBfLCBPdXQpICAgICAgICA6LSAhLCB3cml0ZV9hcml0aF9jb21wYXJlKCc+PScsIFgsIFksIDgsIE91dCkuCisKK3dyaXRlX2RlcmVmX2FyZ3MoW10sIF8pIDotICEuCit3cml0ZV9kZXJlZl9hcmdzKFtzKF8pfFhzXSwgT3V0KSA6LSAhLAorCXdyaXRlX2RlcmVmX2FyZ3MoWHMsIE91dCkuCit3cml0ZV9kZXJlZl9hcmdzKFtzaShfKXxYc10sIE91dCkgOi0gISwgJSA/Pz8KKwl3cml0ZV9kZXJlZl9hcmdzKFhzLCBPdXQpLgord3JpdGVfZGVyZWZfYXJncyhbc2YoXyl8WHNdLCBPdXQpIDotICEsICUgPz8/CisJd3JpdGVfZGVyZWZfYXJncyhYcywgT3V0KS4KK3dyaXRlX2RlcmVmX2FyZ3MoW1h8WHNdLCBPdXQpIDotCisJd3JpdGVfamF2YTAoZGVyZWYoWCxYKSwgXywgT3V0KSwKKwl3cml0ZV9kZXJlZl9hcmdzKFhzLCBPdXQpLgorCit3cml0ZV9pZl9mYWlsKENvbmQsIEFyZ3MsIFRhYiwgT3V0KSA6LSBub252YXIoQ29uZCksIGdyb3VuZChBcmdzKSwgISwKKwlFWFAgID0gaWZfdGhlbihDb25kLCAncmV0dXJuIGVuZ2luZS5mYWlsKCknKSwKKwl3cml0ZV9kZXJlZl9hcmdzKEFyZ3MsIE91dCksCisJd3JpdGVfaW5saW5lX2phdmEoRVhQLCBUYWIsIE91dCkuCisKK21ha2VfYXJpdGhfYXJnKEUsIF8pIDotIHZhcihFKSwgISwgZmFpbC4KK21ha2VfYXJpdGhfYXJnKEUsIEUpIDotIEUgPSBzaShfKSwgIS4KK21ha2VfYXJpdGhfYXJnKEUsIEUpIDotIEUgPSBzZihfKSwgIS4KKyVtYWtlX2FyaXRoX2FyZyhFLCBjYXN0KCdOdW1iZXJUZXJtJyxFKSkgOi0gRSA9IGEoXyksICEuICU/Pz8KK21ha2VfYXJpdGhfYXJnKEUsICMoJ0FyaXRobWV0aWMuZXZhbHVhdGUnKEUpKSkuCisKK3dyaXRlX2FyaXRoKE0sIEUsIFYsIFRhYiwgT3V0KSA6LSAKKwltYWtlX2FyaXRoX2FyZyhFLCBBMSksCisJbm9udmFyKFYpLAorCSggICAgbm9udmFyKE0pIC0+IEEwID0uLiBbTSxBMV0sIEEgPSBAKEEwKQorICAgICAgICAgICAgIDsgICAgQSA9IEExCisJKSwKKwlFWFAgID0gdHJ5X2NhdGNoKFNFTlQsICdCdWlsdGluRXhjZXB0aW9uJywgWydlLmdvYWwgPSB0aGlzJywndGhyb3cgZSddKSwKKwlTRU5UID0gaWZfdGhlbihvcCgnIScsIHVuaWZ5KFYsQSkpLCAncmV0dXJuIGVuZ2luZS5mYWlsKCknKSwKKwkld3JpdGVfZGVyZWZfYXJncyhbRV0sIE91dCksCisJd3JpdGVfaW5saW5lX2phdmEoRVhQLCBUYWIsIE91dCkuCisKK3dyaXRlX2FyaXRoKE0sIEUxLCBFMiwgViwgVGFiLCBPdXQpIDotIAorCW5vbnZhcihNKSwgCisJbWFrZV9hcml0aF9hcmcoRTEsIEExKSwKKwltYWtlX2FyaXRoX2FyZyhFMiwgQTIpLAorCW5vbnZhcihWKSwKKwlBMCA9Li4gW00sQTEsQTJdLAorCUEgPSBAKEEwKSwKKwlFWFAgPSB0cnlfY2F0Y2goU0VOVCwgJ0J1aWx0aW5FeGNlcHRpb24nLCBbJ2UuZ29hbCA9IHRoaXMnLCd0aHJvdyBlJ10pLAorCVNFTlQgPSBpZl90aGVuKG9wKCchJywgdW5pZnkoVixBKSksICdyZXR1cm4gZW5naW5lLmZhaWwoKScpLAorCSV3cml0ZV9kZXJlZl9hcmdzKFtFMSxFMl0sIE91dCksCisJd3JpdGVfaW5saW5lX2phdmEoRVhQLCBUYWIsIE91dCkuCisKK3dyaXRlX2FyaXRoX2NvbXBhcmUoTSwgRTEsIEUyLCBUYWIsIE91dCkgOi0gCisJbm9udmFyKE0pLAorCW1ha2VfYXJpdGhfYXJnKEUxLCBBMSksCisJbWFrZV9hcml0aF9hcmcoRTIsIEEyKSwKKwlBMCA9Li4gWydhcml0aENvbXBhcmVUbycsQTEsQTJdLAorCUEgPSBAKEEwKSwKKwlFWFAgPSB0cnlfY2F0Y2goU0VOVCwgJ0J1aWx0aW5FeGNlcHRpb24nLCBbJ2UuZ29hbCA9IHRoaXMnLCd0aHJvdyBlJ10pLAorCVNFTlQgPSBpZl90aGVuKG9wKE0sIEEsIDApLCAncmV0dXJuIGVuZ2luZS5mYWlsKCknKSwKKwkld3JpdGVfZGVyZWZfYXJncyhbRTEsRTJdLCBPdXQpLAorCXdyaXRlX2lubGluZV9qYXZhKEVYUCwgVGFiLCBPdXQpLgorCit3cml0ZV9pbmxpbmVfamF2YShYLCBfLCBfKSA6LSB2YXIoWCksICEsIGZhaWwuCit3cml0ZV9pbmxpbmVfamF2YShbXSwgXywgXykgOi0gIS4KK3dyaXRlX2lubGluZV9qYXZhKFtYfFhzXSwgVGFiLCBPdXQpIDotICEsCisJd3JpdGVfaW5saW5lX2phdmEoWCwgVGFiLCBPdXQpLAorCXdyaXRlX2lubGluZV9qYXZhKFhzLCBUYWIsIE91dCkuCit3cml0ZV9pbmxpbmVfamF2YSh0cnlfY2F0Y2goVFJZLEVYQ0VQVCxDQVRDSCksIFRhYiwgT3V0KSA6LSAhLAorCXRhYihPdXQsIFRhYiksCisJd3JpdGUoT3V0LCAndHJ5IHsnKSwgbmwoT3V0KSwKKwlUYWIxIGlzIFRhYiArIDQsCisJd3JpdGVfaW5saW5lX2phdmEoVFJZLCBUYWIxLCBPdXQpLAorCXRhYihPdXQsIFRhYiksCisJd3JpdGUoT3V0LCAnfSBjYXRjaCAoJyksIHdyaXRlKE91dCwgRVhDRVBUKSwgd3JpdGUoT3V0LCAnIGUpIHsnKSwgbmwoT3V0KSwKKwl3cml0ZV9pbmxpbmVfamF2YShDQVRDSCwgVGFiMSwgT3V0KSwKKwl0YWIoT3V0LCBUYWIpLAorCXdyaXRlKE91dCwgJ30nKSwgbmwoT3V0KS4KK3dyaXRlX2lubGluZV9qYXZhKGlmX3RoZW4oSUYsIFRIRU4pLCBUYWIsIE91dCkgOi0gISwKKwl0YWIoT3V0LCBUYWIpLAorCXdyaXRlKE91dCwgJ2lmICgnKSwgd3JpdGVfaW5saW5lX2V4cChJRiwgMCwgT3V0KSwgd3JpdGUoT3V0LCAnKSB7JyksIG5sKE91dCksCisJVGFiMSBpcyBUYWIgKyA0LAorCXdyaXRlX2lubGluZV9qYXZhKFRIRU4sIFRhYjEsIE91dCksCisJdGFiKE91dCwgVGFiKSwKKwl3cml0ZShPdXQsICd9JyksIG5sKE91dCkuCit3cml0ZV9pbmxpbmVfamF2YShpZl90aGVuX2Vsc2UoSUYsIFRIRU4sIEVMU0UpLCBUYWIsIE91dCkgOi0gISwKKwl0YWIoT3V0LCBUYWIpLAorCXdyaXRlKE91dCwgJ2lmICgnKSwgd3JpdGVfaW5saW5lX2V4cChJRiwgMCwgT3V0KSwgd3JpdGUoT3V0LCAnKSB7JyksIG5sKE91dCksCisJVGFiMSBpcyBUYWIgKyA0LAorCXdyaXRlX2lubGluZV9qYXZhKFRIRU4sIFRhYjEsIE91dCksCisJdGFiKE91dCwgVGFiKSwKKwl3cml0ZShPdXQsICd9IGVsc2UgeycpLCBubChPdXQpLAorCXdyaXRlX2lubGluZV9qYXZhKEVMU0UsIFRhYjEsIE91dCksCisJdGFiKE91dCwgVGFiKSwKKwl3cml0ZShPdXQsICd9JyksIG5sKE91dCkuCit3cml0ZV9pbmxpbmVfamF2YShYLCBUYWIsIE91dCkgOi0KKwl0YWIoT3V0LCBUYWIpLAorCXdyaXRlKE91dCwgWCksIHdyaXRlKE91dCwgJzsnKSwgbmwoT3V0KS4KKword3JpdGVfaW5saW5lX2V4cChYLCBfLCBfKSA6LSB2YXIoWCksICEsIGZhaWwuCit3cml0ZV9pbmxpbmVfZXhwKFtdLCBfLCBfKSA6LSAhLgord3JpdGVfaW5saW5lX2V4cChbWF0sIFRhYiwgT3V0KSA6LSAhLAorCXdyaXRlX2lubGluZV9leHAoWCwgVGFiLCBPdXQpLgord3JpdGVfaW5saW5lX2V4cChbWHxYc10sIFRhYiwgT3V0KSA6LSAhLAorCXdyaXRlX2lubGluZV9leHAoWCwgVGFiLCBPdXQpLAorCXdyaXRlKE91dCwgJywnKSwKKwl3cml0ZV9pbmxpbmVfZXhwKFhzLCAwLCBPdXQpLgord3JpdGVfaW5saW5lX2V4cChicmFja2V0KEV4cCksIFRhYiwgT3V0KSA6LSAhLAorCXRhYihPdXQsIFRhYiksCisJd3JpdGUoT3V0LCAnKCcpLAorCXdyaXRlX2lubGluZV9leHAoRXhwLCAwLCBPdXQpLAorCXdyaXRlKE91dCwgJyknKS4KK3dyaXRlX2lubGluZV9leHAob3AoT3AsIEV4cCksIFRhYiwgT3V0KSA6LSAhLAorCXRhYihPdXQsIFRhYiksIAorCXdyaXRlKE91dCwgT3ApLCB3cml0ZShPdXQsICcgJyksIHdyaXRlX2lubGluZV9leHAoRXhwLCAwLCBPdXQpLgord3JpdGVfaW5saW5lX2V4cChvcChPcCwgRXhwMSwgRXhwMiksIFRhYiwgT3V0KSA6LSAhLAorCXRhYihPdXQsIFRhYiksIAorCXdyaXRlX2lubGluZV9leHAoRXhwMSwgMCwgT3V0KSwKKwl3cml0ZShPdXQsICcgJyksIAorCXdyaXRlKE91dCwgT3ApLAorCXdyaXRlKE91dCwgJyAnKSwgCisJd3JpdGVfaW5saW5lX2V4cChFeHAyLCAwLCBPdXQpLgord3JpdGVfaW5saW5lX2V4cChjYXN0KENsYXNzLEV4cCksIFRhYiwgT3V0KSA6LSAhLAorCXRhYihPdXQsIFRhYiksIAorCXdyaXRlKE91dCwgJygoJyksIHdyaXRlKE91dCwgQ2xhc3MpLCB3cml0ZShPdXQsICcpICcpLCAKKwl3cml0ZV9pbmxpbmVfZXhwKEV4cCwgMCwgT3V0KSwgd3JpdGUoT3V0LCAnKScpLgord3JpdGVfaW5saW5lX2V4cCh1bmlmeShYLFkpLCBUYWIsIE91dCkgOi0gISwKKwl0YWIoT3V0LCBUYWIpLAorCXdyaXRlX2lubGluZV9leHAoWCwgMCwgT3V0KSwgCisJd3JpdGUoT3V0LCAnLnVuaWZ5KCcpLAorCXdyaXRlX2lubGluZV9leHAoWSwgMCwgT3V0KSwgCisJd3JpdGUoT3V0LCAnLCBlbmdpbmUudHJhaWwpJykuCit3cml0ZV9pbmxpbmVfZXhwKCMoWCksIFRhYiwgT3V0KSA6LSAhLAorCVggPS4uIFtGfEFzXSwKKwl0YWIoT3V0LCBUYWIpLAorCXdyaXRlKE91dCwgRiksIHdyaXRlKE91dCwgJygnKSwKKwl3cml0ZV9pbmxpbmVfZXhwKEFzLCAwLCBPdXQpLAorCXdyaXRlKE91dCwgJyknKS4KK3dyaXRlX2lubGluZV9leHAoQChYKSwgVGFiLCBPdXQpIDotICEsCisJWCA9Li4gW0Z8QXNdLAorCXdyaXRlX2lubGluZV9tZXRob2QoRiwgQXMsIFRhYiwgT3V0KS4KK3dyaXRlX2lubGluZV9leHAoWCwgVGFiLCBPdXQpIDotIFggPSBzKF8pLCAhLCAKKwl0YWIoT3V0LCBUYWIpLCB3cml0ZV9yZWcoWCwgT3V0KS4KK3dyaXRlX2lubGluZV9leHAoWCwgVGFiLCBPdXQpIDotIFggPSBzaShfKSwgISwgICUgPz8/CisJdGFiKE91dCwgVGFiKSwgd3JpdGVfcmVnKFgsIE91dCkuCit3cml0ZV9pbmxpbmVfZXhwKFgsIFRhYiwgT3V0KSA6LSBYID0gc2YoXyksICEsICAlID8/PworCXRhYihPdXQsIFRhYiksIHdyaXRlX3JlZyhYLCBPdXQpLgord3JpdGVfaW5saW5lX2V4cChYLCBUYWIsIE91dCkgOi0gWCA9IGEoXyksICEsIAorCXRhYihPdXQsIFRhYiksIHdyaXRlX3JlZyhYLCBPdXQpLgord3JpdGVfaW5saW5lX2V4cChYLCBUYWIsIE91dCkgOi0gWCA9PSB2b2lkLCAhLCAgJSA/Pz8KKwl0YWIoT3V0LCBUYWIpLCB3cml0ZV9yZWcoWCwgT3V0KS4KK3dyaXRlX2lubGluZV9leHAoWCwgVGFiLCBPdXQpIDotIAorCXRhYihPdXQsIFRhYiksIHdyaXRlKE91dCwgWCkuCisKK3dyaXRlX2lubGluZV9tZXRob2QoRiwgXywgXywgXykgOi0gdmFyKEYpLCAhLCBmYWlsLgord3JpdGVfaW5saW5lX21ldGhvZChfLCBBLCBfLCBfKSA6LSB2YXIoQSksICEsIGZhaWwuCit3cml0ZV9pbmxpbmVfbWV0aG9kKEYsIFtBXSwgVGFiLCBPdXQpIDotICEsCisJdGFiKE91dCwgVGFiKSwKKwl3cml0ZV9pbmxpbmVfZXhwKEEsIDAsIE91dCksIAorCXdyaXRlKE91dCwgJy4nKSwgd3JpdGUoT3V0LCBGKSwgd3JpdGUoT3V0LCAnKCknKS4KK3dyaXRlX2lubGluZV9tZXRob2QoRiwgW0EsQl0sIFRhYiwgT3V0KSA6LQorCXRhYihPdXQsIFRhYiksCisJd3JpdGVfaW5saW5lX2V4cChBLCAwLCBPdXQpLCAKKwl3cml0ZShPdXQsICcuJyksIHdyaXRlKE91dCwgRiksIHdyaXRlKE91dCwgJygnKSwKKwl3cml0ZV9pbmxpbmVfZXhwKEIsIDAsIE91dCksIHdyaXRlKE91dCwgJyknKS4KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgV3JpdGUgSW5zZXJ0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3dyaXRlX2luc2VydChYLCBfLCBfKSA6LSB2YXIoWCksICEsIGZhaWwuCit3cml0ZV9pbnNlcnQoW10sIF8sIF8pIDotICEuCit3cml0ZV9pbnNlcnQoW1h8WHNdLCBfLCBPdXQpIDotCisJYXRvbShYKSwKKwl3cml0ZShPdXQsIFgpLCBubChPdXQpLAorCXdyaXRlX2luc2VydChYcywgXywgT3V0KS4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIEF1eGlsaWFyaWVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyUgaW50CitqYXZhX2ludGVnZXIoWCkgOi0gaW50ZWdlcihYKSwgLTIxNDc0ODM2NDggPTwgWCwgWCA9PCAyMTQ3NDgzNjQ3LgorCislIFJlYWQgSW5zdHJ1Y3Rpb25zCityZWFkX2luc3RydWN0aW9ucygwLCBfLCBbXSkgOi0gIS4KK3JlYWRfaW5zdHJ1Y3Rpb25zKE4sIEluLCBbWHxYc10pIDotIAorCU4gPiAwLAorCXJlYWQoSW4sIFgpLAorCU4xIGlzIE4tMSwKKwlyZWFkX2luc3RydWN0aW9ucyhOMSwgSW4sIFhzKS4KKworJSBXcml0ZSBwYWNrYWdlIG5hbWUKK3dyaXRlX3BhY2thZ2UoUCwgT3V0KSA6LSAhLCAKKwl3cml0ZShPdXQsIFApLgorCislIFdyaXRlIGNsYXNzIG5hbWUKK3dyaXRlX3N1cGVyY2xhc3NfbmFtZShGL0EsIE91dCkgOi0gISwgCisJd3JpdGUoT3V0LCAnUFJFRCcpLCB3cml0ZV9wcmVkX3NwZWMoRi9BLCBPdXQpLgord3JpdGVfc3VwZXJjbGFzc19uYW1lKEwrXywgT3V0KSA6LSAKKwl3cml0ZV9zdXBlcmNsYXNzX25hbWUoTCwgT3V0KS4KKword3JpdGVfY2xhc3NfbmFtZShMLCBPdXQpIDotIAorCXdyaXRlKE91dCwgJ1BSRUQnKSwgd3JpdGVfaW5kZXgoTCwgT3V0KS4KKworJSBXcml0ZSBsYWJlbAord3JpdGVfaW5kZXgoRi9BLCBPdXQpIDotICEsIAorCXdyaXRlX3ByZWRfc3BlYyhGL0EsIE91dCkuCit3cml0ZV9pbmRleChMK0ksIE91dCkgOi0gCisJd3JpdGVfaW5kZXgoTCwgT3V0KSwgd3JpdGUoT3V0LCAnXycpLCB3cml0ZShPdXQsIEkpLgorCislIFdyaXRlIGNvbnN0YW50IG5hbWUKK3dyaXRlX2NvbnN0YW50KFgsIE91dCkgOi0KKwljb25zdGFudF9lbmNvZGluZyhYLCBZKSwKKwl3cml0ZShPdXQsIFkpLgorCislIFdyaXRlIHByZWRpY2F0ZSBzcGVjaWZpY2F0aW9uCit3cml0ZV9wcmVkX3NwZWMoRi9BLCBPdXQpIDotIAorCXByZWRpY2F0ZV9lbmNvZGluZyhGLCBGMSksCisJd3JpdGUoT3V0LCBGMSksIHdyaXRlKE91dCwgJ18nKSwgd3JpdGUoT3V0LCBBKS4KKworJSBQcmVkaWNhdGUgRW5jb2RpbmcKK3ByZWRpY2F0ZV9lbmNvZGluZyhYLCBZKSA6LSAKKwlhdG9tX2NvZGVzKFgsIENoczApLAorCXByZWRfZW5jb2RpbmcoQ2hzMCwgQ2hzLCBbXSksCisJYXRvbV9jb2RlcyhZLCBbOTV8Q2hzXSkuCisKK3ByZWRfZW5jb2RpbmcoW10pIC0tPiAhLgorcHJlZF9lbmNvZGluZyhbWHxYc10pIC0tPiAKKwlwcmVkX2VuY29kaW5nX2NoYXIoWCksCisJcHJlZF9lbmNvZGluZyhYcykuCisKK3ByZWRfZW5jb2RpbmdfY2hhcihYKSAtLT4gezk3ID08IFgsIFggPTwgMTIyfSwgISwgW1hdLiAlIGEuLnoKK3ByZWRfZW5jb2RpbmdfY2hhcihYKSAtLT4gezY1ID08IFgsIFggPTwgIDkwfSwgISwgW1hdLiAlIEEuLloKK3ByZWRfZW5jb2RpbmdfY2hhcihYKSAtLT4gezQ4ID08IFgsIFggPTwgIDU3fSwgISwgW1hdLiAlIDAuLjkKK3ByZWRfZW5jb2RpbmdfY2hhcig5NSkgLS0+ICEsIFs5NV0uICAgICAgICAgICAgICAgICAgICAlICdfJworcHJlZF9lbmNvZGluZ19jaGFyKDM2KSAtLT4gISwgWzM2XS4gICAgICAgICAgICAgICAgICAgICUgJyQnID8/PworcHJlZF9lbmNvZGluZ19jaGFyKFgpIC0tPiB7MCA9PCBYLCBYID08IDY1NTM1fSwgISwgCisJWzM2XSwgICUgJyQnCisJcHJlZF9lbmNvZGluZ19oZXgoWCkuCitwcmVkX2VuY29kaW5nX2NoYXIoWCkgLS0+IAorCXthbTJqX2Vycm9yKFtYLGlzLGFuLGludmFsaWQsY2hhcmFjdGVyLGNvZGVdKSwgZmFpbH0uCisKK3ByZWRfZW5jb2RpbmdfaGV4KFgpIC0tPiAKKwl7aW50X3RvX2hleChYLCBbXSwgSCl9LAorCXByZWRfZW5jb2RpbmdfaGV4X2NoYXIoSCkuCisKK3ByZWRfZW5jb2RpbmdfaGV4X2NoYXIoW10pICAgICAgICAtLT4gISwgWzQ4LDQ4LDQ4LDQ4XS4gJSAwMDAwCitwcmVkX2VuY29kaW5nX2hleF9jaGFyKFtYXSkgICAgICAgLS0+ICEsIFs0OCw0OCw0OCwgWF0uICUgMDAwWAorcHJlZF9lbmNvZGluZ19oZXhfY2hhcihbWCxZXSkgICAgIC0tPiAhLCBbNDgsNDgsIFgsIFldLiAlIDAwWFkKK3ByZWRfZW5jb2RpbmdfaGV4X2NoYXIoW1gsWSxaXSkgICAtLT4gISwgWzQ4LCBYLCBZLCBaXS4gJSAwWFlaCitwcmVkX2VuY29kaW5nX2hleF9jaGFyKFtYLFksWixXXSkgLS0+ICEsIFsgWCwgWSwgWiwgV10uICUgWFlaVworCitpbnRfdG9faGV4KDAsIEgsIEgpIDotICEuCitpbnRfdG9faGV4KEQsIEgwLCBIKSA6LQorCVIgaXMgRCBtb2QgMTYsCisJRDEgaXMgRC8vMTYsCisJaGV4X21hcChSLCBSMSksCisJaW50X3RvX2hleChEMSwgW1IxfEgwXSwgSCkuCisKK2hleF9tYXAoMTAsIDY1KSA6LSAhLiAlICdBJworaGV4X21hcCgxMSwgNjYpIDotICEuICUgJ0InCitoZXhfbWFwKDEyLCA2NykgOi0gIS4gJSAnQycKK2hleF9tYXAoMTMsIDY4KSA6LSAhLiAlICdEJworaGV4X21hcCgxNCwgNjkpIDotICEuICUgJ0UnCitoZXhfbWFwKDE1LCA3MCkgOi0gIS4gJSAnRicKK2hleF9tYXAoWCwgWSkgOi0gMCA9PCBYLCBYID08ICA5LCBudW1iZXJfY29kZXMoWCwgW1ldKS4KKworJSBDb25zdGFudCBFbmNvZGluZyAoZXNwZWNpYWxseSwgZXNjYXBlIHNlcXVlbmNlKQorY29uc3RhbnRfZW5jb2RpbmcoWCwgWSkgOi0KKwlhdG9tX2NvZGVzKFgsIENoczApLAorCWNvbl9lbmNvZGluZyhDaHMwLCBDaHMpLCAgJT8/PworCWF0b21fY29kZXMoWSwgQ2hzKS4KKworY29uX2VuY29kaW5nKFtdLCBbXSkgOi0gIS4KK2Nvbl9lbmNvZGluZyhbIDd8WHNdLCBbOTIsIDk3fFlzXSk6LSAhLCBjb25fZW5jb2RpbmcoWHMsIFlzKS4gJSBcYQorY29uX2VuY29kaW5nKFsgOHxYc10sIFs5MiwgOTh8WXNdKTotICEsIGNvbl9lbmNvZGluZyhYcywgWXMpLiAlIFxiCitjb25fZW5jb2RpbmcoWyA5fFhzXSwgWzkyLDExNnxZc10pOi0gISwgY29uX2VuY29kaW5nKFhzLCBZcykuICUgXHQKK2Nvbl9lbmNvZGluZyhbMTB8WHNdLCBbOTIsMTEwfFlzXSk6LSAhLCBjb25fZW5jb2RpbmcoWHMsIFlzKS4gJSBcbgorY29uX2VuY29kaW5nKFsxMXxYc10sIFs5MiwxMTh8WXNdKTotICEsIGNvbl9lbmNvZGluZyhYcywgWXMpLiAlIFx2Citjb25fZW5jb2RpbmcoWzEyfFhzXSwgWzkyLDEwMnxZc10pOi0gISwgY29uX2VuY29kaW5nKFhzLCBZcykuICUgXGYKK2Nvbl9lbmNvZGluZyhbMTN8WHNdLCBbOTIsMTE0fFlzXSk6LSAhLCBjb25fZW5jb2RpbmcoWHMsIFlzKS4gJSBccgorY29uX2VuY29kaW5nKFszNHxYc10sIFs5MiwgMzR8WXNdKTotICEsIGNvbl9lbmNvZGluZyhYcywgWXMpLiAlIFwiCitjb25fZW5jb2RpbmcoWzM5fFhzXSwgWzkyLCAzOXxZc10pOi0gISwgY29uX2VuY29kaW5nKFhzLCBZcykuICUgXCcKK2Nvbl9lbmNvZGluZyhbOTJ8WHNdLCBbOTIsIDkyfFlzXSk6LSAhLCBjb25fZW5jb2RpbmcoWHMsIFlzKS4gJSBcXAorY29uX2VuY29kaW5nKFtYfFhzXSwgW1h8WXNdKTotIGNvbl9lbmNvZGluZyhYcywgWXMpLgorCislIFdyaXRlIFJlZ2lzdGVyIG5hbWUKK3dyaXRlX3JlZyhYLCBfKSA6LSB2YXIoWCksICEsCisJYW0yal9lcnJvcihbcmVnaXN0ZXIsZXhwcmVzc2lvbixtdXN0LG5vdCxiZSx1bmJvdW5kLHZhcmlhYmxlXSksCisJZmFpbC4KK3dyaXRlX3JlZyh2b2lkLCAgIE91dCkgOi0gISwgd3JpdGUoT3V0LCAnbmV3IFZhcmlhYmxlVGVybShlbmdpbmUpJykuCit3cml0ZV9yZWcoZWEoWCksICBPdXQpIDotICEsIHdyaXRlKE91dCwgJ2VuZ2luZS5hcmVnc1snKSwgd3JpdGUoT3V0LCBYKSwgd3JpdGUoT3V0LCAnXScpLgord3JpdGVfcmVnKGVjb250LCAgT3V0KSA6LSAhLCB3cml0ZShPdXQsICdlbmdpbmUuY29udCcpLgord3JpdGVfcmVnKGFyZyhYKSwgT3V0KSA6LSAhLCB3cml0ZShPdXQsIGFyZyksIHdyaXRlKE91dCwgWCkuCit3cml0ZV9yZWcoYShYKSwgICBPdXQpIDotICEsIHdyaXRlKE91dCwgYSksIHdyaXRlKE91dCwgWCkuCit3cml0ZV9yZWcocyhYKSwgICBPdXQpIDotICEsIHdyaXRlKE91dCwgcyksIHdyaXRlKE91dCwgWCkuCit3cml0ZV9yZWcoc2koWCksICAgT3V0KSA6LSAhLCB3cml0ZShPdXQsIHNpKSwgd3JpdGUoT3V0LCBYKS4gJSA/Pz8KK3dyaXRlX3JlZyhzZihYKSwgICBPdXQpIDotICEsIHdyaXRlKE91dCwgc2YpLCB3cml0ZShPdXQsIFgpLiAlID8/Pword3JpdGVfcmVnKHkoWCksICAgT3V0KSA6LSAhLCB3cml0ZShPdXQsIHkpLCB3cml0ZShPdXQsIFgpLgord3JpdGVfcmVnKHAoWCksICAgT3V0KSA6LSAhLCB3cml0ZShPdXQsIHApLCB3cml0ZShPdXQsIFgpLgord3JpdGVfcmVnKGNvbnQsICAgT3V0KSA6LSAhLCB3cml0ZShPdXQsIGNvbnQpLgord3JpdGVfcmVnKG51bGwsICAgT3V0KSA6LSAhLCB3cml0ZShPdXQsIG51bGwpLgorJSBhbTJqIG9ubHkKK3dyaXRlX3JlZyhhcmdzKFgpLE91dCkgOi0gISwgd3JpdGUoT3V0LCAnYXJnc1snKSwgd3JpdGUoT3V0LCBYKSwgd3JpdGUoT3V0LCAnXScpLgord3JpdGVfcmVnKFgsIF8pIDotCisJYW0yal9lcnJvcihbWCxpcyxhbixpbnZhbGlkLHJlZ2lzdGVyLGV4cHJlc3Npb25dKSwKKwlmYWlsLgorCit3cml0ZV9yZWdfYXJncyhbXSwgXykgOi0gIS4KK3dyaXRlX3JlZ19hcmdzKFtYXSwgT3V0KSA6LSAhLCAKKwl3cml0ZV9yZWcoWCwgT3V0KS4KK3dyaXRlX3JlZ19hcmdzKFtYfFhzXSwgT3V0KSA6LSAKKwl3cml0ZV9yZWcoWCwgT3V0KSwKKwl3cml0ZShPdXQsICcsICcpLAorCXdyaXRlX3JlZ19hcmdzKFhzLCBPdXQpLgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICBXQU0tQkFTRUQgSU5URVJNRURJQVRFIElOU1RSVUNUSU9OUworCitQdXQgSW5zdHJ1Y3Rpb25zCis9PT09PT09PT09PT09PT09CisrICBwdXRfdmFyKFgpCisrICBwdXRfaW50KGksIFgpCisrICBwdXRfZmxvYXQoZiwgWCkKKysgIHB1dF9jb24oZi9uLCBYKQorKyAgcHV0X2NvbihjLCBYKSwgCisrICBwdXRfbGlzdChYaSwgWGosIFhrKQorKyAgcHV0X3N0cihYaSwgWSwgWGopCisrICBwdXRfc3RyX2FyZ3MoW1hpLC4uLFhuXSwgWSkKKysgIHB1dF9jbG8ocDpHLCBYKQorCitHZXQgSW5zdHJ1Y3Rpb25zCis9PT09PT09PT09PT09PT09CisrICBnZXRfdmFsKFhpLCBYaikKKysgIGdldF9pbnQoaSwgWGksIFhqKQorKyAgZ2V0X2Zsb2F0KGYsIFhpLCBYaikKKysgIGdldF9jb24oYywgWGksIFhqKQorKyAgZ2V0X2dyb3VuZChnLCBYaSwgWGopCisrICBnZXRfbGlzdChYKQorKyAgZ2V0X3N0cihmL24sIFhpLCBYaikKKworVW5pZnkgSW5zdHJ1Y3Rpb25zCis9PT09PT09PT09PT09PT09PT0KKysgIHVuaWZ5X3ZhcihYKQorKyAgdW5pZnlfdmFsKFgpCisrICB1bmlmeV9pbnQoaSwgWCkKKysgIHVuaWZ5X2Zsb2F0KGYsIFgpCisrICB1bmlmeV9jb24oYywgWCkKKysgIHVuaWZ5X2dyb3VuZChnLCBYKQorKyAgdW5pZnlfdm9pZChpKQorCitDaG9pY2UgSW5zdHJ1Y3Rpb25zCis9PT09PT09PT09PT09PT09PT09CisrICB0cnkoTGksIExqKQorKyAgcmV0cnkoTGksIExqKQorKyAgdHJ1c3QoTCkKKworSW5kZXhpbmcgSW5zdHJ1Y3Rpb25zCis9PT09PT09PT09PT09PT09PT09PT0KKysgIHN3aXRjaF9vbl90ZXJtKEx2LCBMaSwgTGYsIExjLCBMcywgTGwpCisrICBzd2l0Y2hfb25faGFzaChUQUcsIGksIEwsIGhhc2h0YWJsZSkKKworT3RoZXIgSW5zdHJ1Y3Rpb25zCis9PT09PT09PT09PT09PT09PT0KKysgIGNvbW1lbnQoTWVzc2FnZSkKKysgIGRlYnVnKE1lc3NhZ2UpCisKKysgIGJlZ2luX3ByZWRpY2F0ZShmL24pCisrICBlbmRfcHJlZGljYXRlKGYvbikKKworKyAgcGFja2FnZV9uYW1lKHApCisrICBpbXBvcnRfcGFja2FnZShwKQorKyAgaW1wb3J0X3BhY2thZ2UocCwgZi9uKQorCisrICBtYWluKGYvbiwgcHVibGljKTogW0luc3RydWN0aW9uc10KKysgIG1haW4oZi9uLCBub24tcHVibGljKTogW0luc3RydWN0aW9uc10KKysgIEw6IFtJbnN0cnVjdGlvbnNdCisKKysgIGxhYmVsKEwpCisrICBzZXRCMAorKyAgZ290byhMKQorKyAgZGVyZWYoUmksIFJqKQorKyAgc2V0KFJpLCBSaikKKworKyAgZGVjbF90ZXJtX3ZhcnMoW1IxLC4uLixSbl0pCisrICBkZWNsX3ByZWRfdmFycyhbUjEsLi4uLFJuXSkKKworKyAgcHV0X2NvbnQocDpCaW5HLCBDKQorKyAgcHV0X2NvbnQoQmluRywgQykKKysgIGV4ZWN1dGUocDpCaW5HKQorKyAgZXhlY3V0ZShCaW5HKQorKyAgaW5saW5lKEcpCisKKysgIG5ld19oYXNoKFRBRywgaSkKKysgIHB1dF9oYXNoKFgsIEwsIFRBRykKKworKyAgc3RhdGljKFtJbnN0cnVjdGlvbnNdKQorCitOb3RhdGlvbgorKioqKioqKioKKyAgWCA6Oj0gYShpKSB8IFMKKyAgWSA6Oj0geShpKSB8IFMKKyAgUyA6Oj0gcyhpKSB8IHNpKGkpIHwgc2YoaSkKKyAgTCA6Oj0gZi9uIHwgZi9uK2kgfCBmL24rVEFHIHwgZi9uK1RBRytpIHwgZi9uK1RBRytpK2kKKyAgVEFHIDo6PSB2YXIgfCBpbnQgfCBmbG8gfCBjb24gfCBzdHIgfCBsaXMgfCB0b3AgfCBzdWIgfCBuaWwKKyAgQmluRyA6Oj0gQyB8IGYoQTEsLi4sQW4sIEMpIAorICBHIDo6PSBmKEExLC4uLEFuKSAKKyAgQSA6Oj0gdm9pZCB8IFgKKyAgQyA6Oj0gY29udCB8IHAoTikKKyAgUiA6Oj0gY29udCB8IGVjb250IHwgYShpKSB8IGFyZyhpKSB8IGVhKGkpCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgVXRpbGl0aWVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ZvcihNLCBNLCBOKSA6LSBNID08IE4uCitmb3IoSSwgTSwgTikgOi0gTSA9PCBOLCBNMSBpcyBNICsgMSwgZm9yKEksIE0xLCBOKS4KKworJSUlIHByaW50CithbTJqX2Vycm9yKE0pIDotIGFtMmpfbWVzc2FnZShbJyoqKicsJ0FNMkpBVkEnLCdFUlJPUid8TV0pLgorCithbTJqX21lc3NhZ2UoW10pIDotIG5sLCBmbHVzaF9vdXRwdXQodXNlcl9vdXRwdXQpLgorYW0yal9tZXNzYWdlKFtNfE1zXSkgOi0gd3JpdGUoTSksIHdyaXRlKCcgJyksIGFtMmpfbWVzc2FnZShNcykuCisKKyUlJSBsaXN0CithbTJqX2FwcGVuZChbXSwgWnMsIFpzKS4KK2FtMmpfYXBwZW5kKFtYfFhzXSwgWXMsIFtYfFpzXSkgOi0gYW0yal9hcHBlbmQoWHMsIFlzLCBacykuCisKK2ZsYXR0ZW5fbGlzdChbXSkgLS0+ICEuCitmbGF0dGVuX2xpc3QoW0wxfEwyXSkgLS0+ICEsIGZsYXR0ZW5fbGlzdChMMSksIGZsYXR0ZW5fbGlzdChMMikuCitmbGF0dGVuX2xpc3QoTCkgLS0+IFtMXS4KKworbGlzdF90b19zdHJpbmcoTGlzdCwgU3RyaW5nKSA6LQorCWxpc3RfdG9fY2hhcnMoTGlzdCwgQ2hhcnMwKSwKKwlmbGF0dGVuX2xpc3QoQ2hhcnMwLCBDaGFycywgW10pLAorCWF0b21fY29kZXMoU3RyaW5nLCBDaGFycykuCisKK2xpc3RfdG9fY2hhcnMoW10sIFtdKSA6LSAhLgorbGlzdF90b19jaGFycyhbTHxMc10sIFtDfENzXSkgOi0gYXRvbShMKSwgISwKKwlhdG9tX2NvZGVzKEwsIEMpLAorCWxpc3RfdG9fY2hhcnMoTHMsIENzKS4KK2xpc3RfdG9fY2hhcnMoW0x8THNdLCBbQ3xDc10pIDotIG51bWJlcihMKSwgISwKKwludW1iZXJfY29kZXMoTCwgQyksCisJbGlzdF90b19jaGFycyhMcywgQ3MpLgorCislIEVORAorJSB3cml0dGVuIGJ5IFNJQ1N0dXMgUHJvbG9nIDMuMTIuOApkaWZmIC0tZ2l0IGEvc3JjL2NvbXBpbGVyL2FtMmoudHh0IGIvc3JjL2NvbXBpbGVyL2FtMmoudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMjg0NDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29tcGlsZXIvYW0yai50eHQKQEAgLTAsMCArMSwxMTcgQEAKKyMhIC91c3IvYmluL3BlcmwKK3JlcXVpcmUgJ2dldG9wdHMucGwnOwordXNlIHN0cmljdDsKK3VzZSBHZXRvcHQ6Okxvbmc7CisKKyMgb3B0aW9ucworbXkgQG9wdGxpc3QgPSAoImh8aGVscCEiLCJ2fHZlcmJvc2UhIiwiZD1zIiwiSj1zIik7CitteSAkcmVzdWx0ID0gR2V0T3B0aW9ucyBAb3B0bGlzdDsKK291ciAoJG9wdF9oLCAkb3B0X3YsICRvcHRfZCwgJG9wdF9KKTsKKworIyAtaCBvcHRpb24gfHwgY2hlY2sgdGhlIG51bWJlciBvZiBhcmd1bWVudHMKK2lmICgkb3B0X2ggfHwgQEFSR1YgIT0gMSApIHsKKyAgICB1c2FnZSgpOworICAgIGV4aXQgMTsKK30KKworIyBsb2NhbCB2YXJpYWJsZXMKK215ICRlY2hvID0gIi9iaW4vZWNobyI7CitteSAkYW1fZmlsZSA9ICRBUkdWWzBdOworCitteSAlZW52OworJmluaXQoKTsKKworIyAtZCBvcHRpb24KK2lmICgkb3B0X2QgJiYgKCEgLWQgJG9wdF9kKSkgeworICAgICZlcnJvcigiZGlyZWN0b3J5ICRvcHRfZCBkb2VzIG5vdCBleGlzdC4iKTsKK30KKworIyAtSiBvcHRpb24KK2lmICgkb3B0X0opIHsKKyAgICBpZiAoJG9wdF9KID1+IC8oLWNwfC1jbGFzc3BhdGgpXHMrLykgeworCSZlcnJvcigiY2FuIG5vdCB1c2UgJDEgaW4gLUogb3B0aW9uIik7CisgICAgfQorICAgICRlbnZ7InN5c3RlbV9vcHRzIn0gLj0gIiAkb3B0X0oiOworfQorCisjIG1haW4KK2lmICghIC1lICRhbV9maWxlKSB7CisgICAgJmVycm9yKCJmaWxlICRhbV9maWxlIGRvZXMgbm90IGV4aXN0LiIpOworfQorCitteSAkYXJnOworaWYgKCRlbnZ7ImdvYWwifSkgeworICAgICRhcmcgLj0gJGVudnsiZ29hbCJ9IC4gIiAiOworfQorJGFyZyAuPSAiW1wnJGFtX2ZpbGVcJyI7CitpZiAoJG9wdF9kKSB7ICMgY2hlY2sgLWQgb3B0aW9uCisgICAgJGFyZyAuPSAiLCBcJyRvcHRfZFwnIjsKK30KKyRhcmcgLj0gIl0uIjsKKworbXkgJGNtZCA9ICIkZWNobyBcIiRhcmdcIiB8ICIgLiAkZW52eyJzeXN0ZW0ifTsKK2lmICgkZW52eyJzeXN0ZW1fb3B0cyJ9KSB7CisgICAgJGNtZCAuPSAiICIgLiAkZW52eyJzeXN0ZW1fb3B0cyJ9OworfQoraWYgKCRlbnZ7InN5c3RlbV9hcmdzIn0pIHsKKyAgICAkY21kIC49ICIgIiAuICRlbnZ7InN5c3RlbV9hcmdzIn07Cit9CitpZiAoISAkb3B0X3YpIHsjIGNoZWNrIC12IG9wdGlvbgorICAgICRjbWQgLj0gIiAyPiAvZGV2L251bGwiOworfQorCismbWVzc2FnZSgie1NUQVJUIHRyYW5zbGF0aW5nICRhbV9maWxlIC0tPiBKYXZhfSIpOworJm1lc3NhZ2UoJGNtZCk7CitzeXN0ZW0oJGNtZCkgJiYgZXJyb3IoInRyYW5zbGF0aW9uIGZhaWxzIik7CismbWVzc2FnZSgie0VORCB0cmFuc2xhdGluZyAkYW1fZmlsZSAtLT4gSmF2YX1cbiIpOworCitleGl0IDA7CisKKyMgc3ViCitzdWIgdXNhZ2UgeworICAgIHByaW50ICJcblVzYWdlOiAkMCBbLW9wdGlvbnNdIGFtX2ZpbGVcbiI7CisgICAgcHJpbnQgIlxuIHdoZXJlIG9wdGlvbnMgaW5jbHVkZTpcbiI7CisgICAgcHJpbnQgIlx0LWggLWhlbHAgICAgICAgICA6IHByaW50IHRoaXMgaGVscCBtZXNzYWdlXG4iOworICAgIHByaW50ICJcdC12IC12ZXJib3NlICAgICAgOiBlbmFibGUgdmVyYm9zZSBvdXRwdXRcbiI7CisgICAgcHJpbnQgIlx0LWQgZGlyZWN0b3J5ICAgICA6IHNldCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGZvciBhbV9maWxlLlxuIjsKKyAgICBwcmludCAiXHQgICAgICAgICAgICAgICAgIDogVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBtdXN0IGFscmVhZHkgZXhpc3RcbiI7CisgICAgcHJpbnQgIlx0LUogb3B0aW9uICAgICAgICA6IG9wdGlvbiBtdXN0IGJlIGVuY2xvc2VkIGJ5ICcuXG4iOworICAgIHByaW50ICJcdCAgICAgICAgICAgICAgICAgOiBwYXNzIG9wdGlvbiB0byB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmVcbiI7CisgICAgcHJpbnQgIlx0ICAgICAgICAgICAgICAgICA6IChleC4gLUogJy1YbXgxMDBtIC12ZXJib3NlOmdjJylcbiI7CisgICAgcHJpbnQgIlxuIjsKK30KKworc3ViIG1lc3NhZ2UgeworICAgIG15ICgkeCkgPSBAXzsKKyAgICBpZiAoJG9wdF92KSB7ICMgY2hlY2sgLXYgb3B0aW9uCisJcHJpbnQgIlwlICR4XG4iOworICAgIH0KK30KKworc3ViIGVycm9yIHsKKyAgICBteSAoJHgpID0gQF87CisgICAgcHJpbnQgIlwlIEVSUk9SOiAkeDogJDBcbiI7CisgICAgZXhpdCAxOworfQorCisjc3ViIGluaXQgeworIyAgICAlZW52ID0gKAorIwkiZ29hbCIsICAgICAgICAiIiwKKyMJInN5c3RlbSIsICAgICAgIi9Vc2Vycy9iYW5iYXJhL3Byb2cvcGxjYWZlL1Byb2xvZ0NhZmUwOTUvc3JjL2NvbXBpbGVyL2FtMmouc2F2IiwKKyMJInN5c3RlbV9vcHRzIiwgIiIsCisjCSJzeXN0ZW1fYXJncyIsICIiLAorIwkpOworIyAgICAlZW52ID0gKAorIwkiZ29hbCIsICAgICAgICAibG9hZCgnL1VzZXJzL2JhbmJhcmEvcHJvZy9wbGNhZmUvUHJvbG9nQ2FmZTA5NS9zcmMvY29tcGlsZXIvcGwyYW0ucWwnKSwgbWFpbi4gIiwKKyMJInN5c3RlbSIsICAgICAgInNpY3N0dXMiLAorIwkic3lzdGVtX29wdHMiLCAiIiwKKyMJInN5c3RlbV9hcmdzIiwgIiIsCisjCSk7CisjICAgICVlbnYgPSAoCisjCSJnb2FsIiwgICAgICAgICIiLAorIwkic3lzdGVtIiwgICAgICAiamF2YSIsCisjCSJzeXN0ZW1fb3B0cyIsICItY3AgXCRQTENBRkVESVIvcGxjYWZlLmphcjpcJENMQVNTUEFUSCIsCisjCSJzeXN0ZW1fYXJncyIsICJqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuUHJvbG9nTWFpbiBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmNvbXBpbGVyLnBsMmFtOm1haW4iLAorIwkpOworI30KKwpkaWZmIC0tZ2l0IGEvc3JjL2NvbXBpbGVyL2NvbXBfcGwgYi9zcmMvY29tcGlsZXIvY29tcF9wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOGZiZDJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvbXBpbGVyL2NvbXBfcGwKQEAgLTAsMCArMSwxNTUgQEAKKyMhIC91c3IvYmluL3BlcmwKK3JlcXVpcmUgJ2dldG9wdHMucGwnOwordXNlIHN0cmljdDsKK3VzZSBHZXRvcHQ6Okxvbmc7Cit1c2UgRmlsZTo6Q29weTsKKworIyBvcHRpb25zCitteSBAb3B0bGlzdCA9ICgiaHxoZWxwISIsInZ8dmVyYm9zZSEiKTsKK215ICRyZXN1bHQgPSBHZXRPcHRpb25zIEBvcHRsaXN0Oworb3VyICgkb3B0X2gsICRvcHRfdik7CisKKyMgLWggb3B0aW9uIHx8IGNoZWNrIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzCitpZiAoJG9wdF9oIHx8IEBBUkdWIDwgMiB8fCBAQVJHViA+IDQpIHsKKyAgICB1c2FnZSgpOworICAgIGV4aXQgMTsKK30KKworIyBnZXQgYXJndW1lbnRzCitteSAkcHJvbG9nX2ZpbGUgICA9ICRBUkdWWzBdOworbXkgJGNvbW1hbmRfZmlsZSAgPSAkQVJHVlsxXTsKK215ICRwcm9sb2cgICAgICAgID0gJEFSR1ZbMl07CitteSAkcHJvbG9nX3N5c3RlbSA9ICRBUkdWWzNdOworCisjIGNoZWNrIGFyZ3VtZW50cworaWYgKCEgLWUgJHByb2xvZ19maWxlKSB7CisgICAgJmVycm9yKCJGaWxlICRwcm9sb2dfZmlsZSBkb2VzIG5vdCBleGlzdCIpOworfQorCitpZiAoISAkcHJvbG9nKSB7CisgICAgJHByb2xvZyA9ICJwcm9sb2ciOworfQorCitpZiAoISAkcHJvbG9nX3N5c3RlbSkgeworICAgICRwcm9sb2dfc3lzdGVtID0gIlVua25vd24iOworfQorCisjIG1haW4KK215ICRub3N1ZmZpeCA9ICRwcm9sb2dfZmlsZTsKKyRub3N1ZmZpeCA9fiBzLy5wbCQvL2c7CitteSAkY21kX3RlbXAgPSAkbm9zdWZmaXggLiAiLnR4dCI7CisKK2lmICgkcHJvbG9nX3N5c3RlbSBlcSAiU0lDU3R1cyIgfHwgJHByb2xvZ19zeXN0ZW0gZXEgIlNXSS1Qcm9sb2ciKSB7ICMgU0lDU3R1cyBvciBTV0ktUHJvbG9nCisgICAgbXkgJHdhbTsKKyAgICBteSAkZHVtcDsKKyAgICBteSAkZ29hbDsKKyAgICBteSAkZ29hbDI7CisgICAgaWYgKCRwcm9sb2dfc3lzdGVtIGVxICJTSUNTdHVzIikgeworCSR3YW0gID0gJG5vc3VmZml4IC4gIi5xbCI7CisJJGR1bXAgPSAkbm9zdWZmaXggLiAiLnNhdiI7CisJIyRnb2FsID0gIlwiW29wZXJhdG9yc10sIGZjb21waWxlKFwnJHByb2xvZ19maWxlXCcpLCBsb2FkKFwnJHdhbVwnKSwgc2F2ZV9wcm9ncmFtKFwnJGR1bXBcJywgbWFpbiksIGhhbHQuXCIiOworCSRnb2FsID0gIlwiW29wZXJhdG9yc10sIGZjb21waWxlKFtcJyRwcm9sb2dfZmlsZVwnLHN5c3RlbV0pLCBsb2FkKFwnJHdhbVwnKSwgbG9hZChzeXN0ZW0pLCBzYXZlX3Byb2dyYW0oXCckZHVtcFwnLCBtYWluKSwgaGFsdC5cIiI7CisJJGdvYWwyID0gImxvYWQoXCckd2FtXCcpLCBtYWluLiI7CisgICAgfQorICAgIGlmICgkcHJvbG9nX3N5c3RlbSBlcSAiU1dJLVByb2xvZyIpIHsKKwkkd2FtICA9ICRub3N1ZmZpeCAuICIucWxmIjsKKwkkZHVtcCA9ICRub3N1ZmZpeCAuICIucXNhdiI7CisjCSRnb2FsID0gIlwiW29wZXJhdG9yc10sIHFjb21waWxlKFwnJHByb2xvZ19maWxlXCcpLCBsb2FkX2ZpbGVzKFwnJHdhbVwnKSwgcXNhdmVfcHJvZ3JhbShcJyRkdW1wXCcsIFtnb2FsPW1haW5dKSwgaGFsdC5cIiI7CisJJGdvYWwgPSAiXCJbb3BlcmF0b3JzXSwgcWNvbXBpbGUoW1wnJHByb2xvZ19maWxlXCcsc3lzdGVtXSksIGxvYWRfZmlsZXMoXCckd2FtXCcpLCBsb2FkX2ZpbGVzKHN5c3RlbSkscXNhdmVfcHJvZ3JhbShcJyRkdW1wXCcsIFtnb2FsPW1haW5dKSwgaGFsdC5cIiI7CisJJGdvYWwyID0gImxvYWRfZmlsZXMoXCckd2FtXCcpLCBtYWluLiI7CisgICAgfQorICAgICZtZXNzYWdlKCJ1bmxpbmsgJHdhbSwgJGR1bXAiKTsKKyAgICB1bmxpbmsgJHdhbSwgJGR1bXA7CisgICAgbXkgJGNtZCA9ICJlY2hvICRnb2FsIHwgJHByb2xvZyI7CisgICAgaWYgKCEgJG9wdF92KSB7IyBjaGVjayAtdiBvcHRpb24KKwkkY21kIC49ICIgMj4gL2Rldi9udWxsIjsKKyAgICB9CisgICAgJm1lc3NhZ2UoIm1ha2luZyAkd2FtLCAkZHVtcCIpOworICAgICZtZXNzYWdlKCRjbWQpOworICAgIHN5c3RlbSgkY21kKTsKKyAgICBpZiAoLWUgJGR1bXApIHsgIyBzYXZpbmcgcHJvZ3JhbSBzdWNjZWVkcworCXVubGluayAkd2FtOworCSZtZXNzYWdlKCJtYWtpbmcgJGNvbW1hbmRfZmlsZSIpOworCSZta19jb21tYW5kKCRjb21tYW5kX2ZpbGUsICRjbWRfdGVtcCwgdW5kZWYsICRkdW1wLCB1bmRlZiwgdW5kZWYpOworCWNobW9kIDA3NTUsICRjb21tYW5kX2ZpbGU7CisJZXhpdCAwOworICAgIH0gZWxzaWYgKC1lICR3YW0pIHsgIyBjb21waWxhdGlvbiBzdWNjZWVkcywgYnV0IHNhdmluZyBwcm9ncmFtIGZhaWxzCisJJm1lc3NhZ2UoIm1ha2luZyAkY29tbWFuZF9maWxlIik7CisJJm1rX2NvbW1hbmQoJGNvbW1hbmRfZmlsZSwgJGNtZF90ZW1wLCAkZ29hbDIsICRwcm9sb2csIHVuZGVmLCB1bmRlZik7CisJY2htb2QgMDc1NSwgJGNvbW1hbmRfZmlsZTsKKwlleGl0IDA7CisgICAgfSBlbHNlIHsKKwkmZXJyb3IoIiQwIGZhaWxzIik7CisgICAgfQorfSBlbHNpZiAoJHByb2xvZ19zeXN0ZW0gZXEgIlByb2xvZ0NhZmUiKSB7CisgICAgbXkgJGZpbGU7CisgICAgbXkgJHN5c3RlbV9vcHRzOworICAgIG15ICRzeXN0ZW1fYXJnczsKKyAgICAjIHNldCAkc3lzdGVtX29wdHMKKyAgICAjJHN5c3RlbV9vcHRzID0gIi1jcCBcXFwkUExDQUZFRElSL2xhbmcuamFyOlxcXCRQTENBRkVESVIvYnVpbHRpbi5qYXI6XFxcJFBMQ0FGRURJUi9jb21waWxlci5qYXIiOworICAgICRzeXN0ZW1fb3B0cyA9ICItY3AgXFxcJFBMQ0FGRURJUi9wbGNhZmUuamFyIjsKKyAgICBpZiAoJHByb2xvZ19maWxlID1+IG18LiovKC4qKS5wbCR8aSkgeworCSRmaWxlID0gJDE7CisgICAgfSBlbHNlIHsKKwkmZXJyb3IoImludmFsaWQgcHJvbG9nIGZpbGUgZm91bmQsICRwcm9sb2dfZmlsZSIpOworICAgIH0KKyAgICAjIHNldCAkc3lzdGVtX2FyZ3MKKyAgICAkc3lzdGVtX2FyZ3MgPSAianAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLlByb2xvZ01haW4ganAuYWMua29iZV91LmNzLnByb2xvZy5jb21waWxlci4kZmlsZTptYWluIjsKKyAgICAmbWVzc2FnZSgibWFraW5nICRjb21tYW5kX2ZpbGUiKTsKKyAgICAmbWtfY29tbWFuZCgkY29tbWFuZF9maWxlLCAkY21kX3RlbXAsIHVuZGVmLCAkcHJvbG9nLCAkc3lzdGVtX29wdHMsICRzeXN0ZW1fYXJncyk7CisgICAgY2htb2QgMDc1NSwgJGNvbW1hbmRfZmlsZTsKKyAgICBleGl0IDA7ICAgIAorfSBlbHNlIHsKKyAgICBteSAkZ29hbDMgPSAiW1wnJHByb2xvZ19maWxlXCcsc3lzdGVtXSwgbWFpbi4iOworIyAgICBteSAkZ29hbDMgPSAiW1wnJHByb2xvZ19maWxlXCddLCBtYWluLiI7CisgICAgJm1lc3NhZ2UoIm1ha2luZyAkY29tbWFuZF9maWxlIik7CisgICAgJm1rX2NvbW1hbmQoJGNvbW1hbmRfZmlsZSwgJGNtZF90ZW1wLCAkZ29hbDMsICRwcm9sb2csIHVuZGVmLCB1bmRlZik7CisgICAgY2htb2QgMDc1NSwgJGNvbW1hbmRfZmlsZTsKKyAgICBleGl0IDA7Cit9CisKK2V4aXQgMDsKKworIyBzdWIKK3N1YiB1c2FnZSB7CisgICAgcHJpbnQgIlxuVXNhZ2U6ICQwIFstb3B0aW9uc10gcHJvbG9nX2ZpbGUgY29tbWFuZF9maWxlIFtwcm9sb2ddIFtwcm9sb2dfc3lzdGVtXVxuIjsKKyAgICBwcmludCAiXG4gd2hlcmUgb3B0aW9ucyBpbmNsdWRlOlxuIjsKKyAgICBwcmludCAiXHQtaCAtaGVscCAgICAgICAgIDogcHJpbnQgdGhpcyBoZWxwIG1lc3NhZ2VcbiI7CisgICAgcHJpbnQgIlx0LXYgLXZlcmJvc2UgICAgICA6IGVuYWJsZSB2ZXJib3NlIG91dHB1dFxuIjsKKyAgICBwcmludCAiXG4gd2hlcmUgcHJvbG9nIGlzIHRoZSBjb21tYW5kIG9mIFByb2xvZyBzeXN0ZW06XG4iOworICAgIHByaW50ICJcdChleC4pIHNpY3N0dXMsIHBsLCBzd2lwbCwgcHJvbG9nLi4uXG4iOworICAgIHByaW50ICJcbiB3aGVyZSBwcm9sb2dfc3lzdGVtIGluY2x1ZGU6XG4iOworICAgIHByaW50ICJcdFNJQ1N0dXNcbiI7CisgICAgcHJpbnQgIlx0U1dJLVByb2xvZ1xuXG4iOworfQorCitzdWIgbWVzc2FnZSB7CisgICAgbXkgKCR4KSA9IEBfOworICAgIGlmICgkb3B0X3YpIHsgIyBjaGVjayAtdiBvcHRpb24KKwlwcmludCAiXCUgJHhcbiI7CisgICAgfQorfQorCitzdWIgZXJyb3IgeworICAgIG15ICgkeCkgPSBAXzsKKyAgICBwcmludCAiXCUgRVJST1I6ICR4XG4iOworICAgIGV4aXQoMSk7Cit9CisKK3N1YiBta19jb21tYW5kIHsKKyAgICBteSAoJGNvbW1hbmRfZmlsZSwgJGNvbW1hbmRfdGVtcCwgQHZhbCkgPSBAXzsKKyAgICBteSBAa2V5ID0gKCJnb2FsIiwgInN5c3RlbSIsICJzeXN0ZW1fb3B0cyIsICJzeXN0ZW1fYXJncyIpOworICAgIGNvcHkoJGNvbW1hbmRfdGVtcCwgJGNvbW1hbmRfZmlsZSkgfHwgJmVycm9yKCJjYW4gbm90IGNvcHkgJGNvbW1hbmRfdGVtcCB0byAkY29tbWFuZF9maWxlIik7CisgICAgb3BlbihPVVQsICI+PiRjb21tYW5kX2ZpbGUiKSB8fCAmZXJyb3IoImNhbiBub3Qgb3BlbiAkY29tbWFuZF9maWxlIik7CisgICAgcHJpbnQgT1VUICJzdWIgaW5pdCB7XG4iOworICAgIHByaW50IE9VVCAiXHQlZW52ID0gKFxuIjsKKyAgICBmb3IgKG15ICRpPTA7ICRpIDwgc2NhbGFyKEBrZXkpOyAkaSsrKSB7CisJbmV4dCBpZiAoISAkdmFsWyRpXSk7CisJcHJpbnQgT1VUICJcdFx0XCIka2V5WyRpXVwiLCBcIiR2YWxbJGldXCIsXG4iOworICAgIH0KKyAgICBwcmludCBPVVQgIlx0KVxuIjsKKyAgICBwcmludCBPVVQgIn1cbiI7CisgICAgY2xvc2UoT1VUKSB8fCAmZXJyb3IoImNhbiBub3QgY2xvc2UgJGNvbW1hbmRfZmlsZSIpOworfQorCisKZGlmZiAtLWdpdCBhL3NyYy9jb21waWxlci9vcGVyYXRvcnMucGwgYi9zcmMvY29tcGlsZXIvb3BlcmF0b3JzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNDQ1ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29tcGlsZXIvb3BlcmF0b3JzLnBsCkBAIC0wLDAgKzEsMTUgQEAKKzotIG9wKDExNzAsIHhmeCwgKDotKSkuCis6LSBvcCgxMTcwLCB4ZngsICgtLT4pKS4KKzotIG9wKDExNzAsICBmeCwgKDotKSkuCis6LSBvcCgxMTcwLCAgZngsICg/LSkpLgorOi0gb3AoIDUwMCwgeWZ4LCAoIykpLgorOi0gb3AoMTE1MCwgIGZ4LCAoZHluYW1pYykpLgorOi0gb3AoMTE1MCwgIGZ4LCAobWV0YV9wcmVkaWNhdGUpKS4KKzotIG9wKDExNTAsICBmeCwgKHBhY2thZ2UpKS4KKzotIG9wKDExNTAsICBmeCwgKHB1YmxpYykpLgorOi0gb3AoMTE1MCwgIGZ4LCAoaW1wb3J0KSkuCis6LSBvcCgxMTUwLCAgZngsIChtb2RlKSkuCis6LSBvcCgxMTUwLCAgZngsIChtdWx0aWZpbGUpKS4KKzotIG9wKDExNTAsICBmeCwgKGJsb2NrKSkuCisKKwpkaWZmIC0tZ2l0IGEvc3JjL2NvbXBpbGVyL3BhY2thZ2UuaHRtbCBiL3NyYy9jb21waWxlci9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkN2FlMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb21waWxlci9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwxMCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMi8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUVVQy1KUCI+Cis8dGl0bGU+PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGJnY29sb3I9IiNmZmZmZmYiPgorUHJvdmlkZXMgY2xhc3NlcyBmb3IgdHJhbnNsYXRpbmcgUHJvbG9nIGZpbGVzIGludG8gSmF2YSBmaWxlcy4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NyYy9jb21waWxlci9wbDJhbS5wbCBiL3NyYy9jb21waWxlci9wbDJhbS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGRjODY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvbXBpbGVyL3BsMmFtLnBsCkBAIC0wLDAgKzEsMTgwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitUaW1lLXN0YW1wOiA8MjAwOC0xMC0yOSAxMDo0MToxOSBiYW5iYXJhPgorCitOQU1FCisgICAgICAgcGwyYW06IFRyYW5zbGF0aW5nIFByb2xvZyBpbnRvIFdBTS1iYXNlZCBJbnRlcm1lZGlhdGUgQ29kZQorCitVU0FHRQorICAgICAgICMgc2ljc3R1cworICAgICAgID8tIFtwbDJhbV0uICAgCisgICAgICAgPy0gcGwyYW0oW0ZpbGUxLCBGaWxlMiwgW09wMSwuLixPcE5dXSkuCisKK1BBUkFNRVRFUlMKKyAgICAgICBGaWxlMSBpcyBhbiBpbnB1dCBwcm9sb2cgZmlsZSBuYW1lLgorICAgICAgIEZpbGUyIGlzIGFuIG91dHB1dCBmaWxlIG5hbWUuCisgICAgICAgT3AgICAgOjo9IGVkIHwgYWMgfCBpZSB8IHJjIHwgaWR4IHwgY2xvCisgICAgICAgICAgZWQgOiBlbGltaW5hdGUgZGlzanVuY3Rpb25zCisgICAgICAgICAgYWMgOiBhcml0aG1ldGljIGNvbXBpbGF0aW9uCisgICAgICAgICAgaWUgOiBpbmxpbmUgZXhwYW5zaW9uCisgICAgICAgICAgcmMgOiBvcHRpbWlzZSByZWN1cnNpdmUgY2FsbAorICAgICAgICAgIGlkeDogc3dpdGNoX29uX2hhc2ggKDJuZC4gbGV2ZWwgaW5kZXhpbmcpCisgICAgICAgICAgY2xvOiBnZW5lcmF0ZSBjbG9zdXJlIGZvciBtZXRhIHByZWRpY2F0ZXMKKworREVTQ1JJUFRJT04KKyAgICAgICBUaGlzIHByb2dyYW0gdHJhbnNsYXRlcyBQcm9sb2cgcHJvZ3JhbSBpbnRvIFdBTS1iYXNlZCBpbnRlcm1lZGlhdGUgY29kZXMuCisgICAgICAgR2VuZXJhdGVkIGNvZGVzIGNhbiBiZSB0cmFuc2xhdGVkIGludG8gSmF2YSBwcm9ncmFtIGJ5IHVzaW5nIGFtMmoucGwsCisgICAgICAgYW5kIHRoZW4gY29tcGlsZWQgYW5kIGV4ZWN1dGVkIGJ5IHVzdWFsIGphdmEgdXRpbGl0aWVzIAorICAgICAgIHdpdGggdGhlIFByb2xvZyBDYWZlIHJ1bnRpbWUgc3lzdGVtLgorCitDT1BZUklHSFQKKyAgICAgICBwbDJhbSAoVHJhbnNsYXRpbmcgUHJvbG9nIGludG8gV0FNLWJhc2VkIEludGVybWVkaWF0ZSBDb2RlKQorICAgICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA4IGJ5IAorICAgICAgICAgIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkgYW5kCisgICAgICAgICAgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisKK1NFRSBBTFNPCisgICAgICAgaHR0cDovL2thbWluYXJpLmlzdGMua29iZS11LmFjLmpwL1Byb2xvZ0NhZmUvCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgV0FNLUJBU0VEIElOVEVSTUVESUFURSBJTlNUUlVDVElPTlMKKworUHV0IEluc3RydWN0aW9ucworPT09PT09PT09PT09PT09PQorICBwdXRfdmFyKFgpCisgIHB1dF9pbnQoaSwgWCkKKyAgcHV0X2Zsb2F0KGYsIFgpCisgIHB1dF9jb24oZi9uLCBYKQorICBwdXRfY29uKGMsIFgpLCAKKyAgcHV0X2xpc3QoWGksIFhqLCBYaykKKyAgcHV0X3N0cihYaSwgWSwgWGopCisgIHB1dF9zdHJfYXJncyhbWGksLi4sWG5dLCBZKQorICBwdXRfY2xvKHA6RywgWCkKKyAgcHV0X2NvbnQocDpCaW5HLCBDKQorICBwdXRfY29udChCaW5HLCBDKQorCitHZXQgSW5zdHJ1Y3Rpb25zCis9PT09PT09PT09PT09PT09CisgIGdldF92YWwoWGksIFhqKQorICBnZXRfaW50KGksIFhpLCBYaikKKyAgZ2V0X2Zsb2F0KGYsIFhpLCBYaikKKyAgZ2V0X2NvbihjLCBYaSwgWGopCisgIGdldF9ncm91bmQoZywgWGksIFhqKQorICBnZXRfbGlzdChYKQorICBnZXRfc3RyKGYvbiwgWGksIFhqKQorCitVbmlmeSBJbnN0cnVjdGlvbnMKKz09PT09PT09PT09PT09PT09PQorICB1bmlmeV92YXIoWCkKKyAgdW5pZnlfdmFsKFgpCisgIHVuaWZ5X2ludChpLCBYKQorICB1bmlmeV9mbG9hdChmLCBYKQorICB1bmlmeV9jb24oYywgWCkKKyAgdW5pZnlfZ3JvdW5kKGcsIFgpCisgIHVuaWZ5X3ZvaWQoaSkKKworQ2hvaWNlIEluc3RydWN0aW9ucworPT09PT09PT09PT09PT09PT09PQorICB0cnkoTGksIExqKQorICByZXRyeShMaSwgTGopCisgIHRydXN0KEwpCisKK0luZGV4aW5nIEluc3RydWN0aW9ucworPT09PT09PT09PT09PT09PT09PT09CisgIHN3aXRjaF9vbl90ZXJtKEx2LCBMaSwgTGYsIExjLCBMcywgTGwpCisgIHN3aXRjaF9vbl9oYXNoKFRBRywgaSwgTCwgaGFzaHRhYmxlKQorCitDb250cm9sIEluc3RydWN0aW9ucworPT09PT09PT09PT09PT09PT09PT0KKyAgZXhlY3V0ZShwOkJpbkcpCisgIGV4ZWN1dGUoQmluRykKKyAgaW5saW5lKEcpCisgICckSU5TRVJUJyhMaXN0T2ZBdG9tKQorCitPdGhlciBJbnN0cnVjdGlvbnMKKz09PT09PT09PT09PT09PT09PQorICAoOi0gRykKKworICBjb21tZW50KE1lc3NhZ2UpCisgIGRlYnVnKE1lc3NhZ2UpCisgIGluZm8oTWVzc2FnZSkKKworICBiZWdpbl9wcmVkaWNhdGUoZi9uKQorICBlbmRfcHJlZGljYXRlKGYvbikKKworICBwYWNrYWdlX25hbWUocCkKKyAgaW1wb3J0X3BhY2thZ2UocCkKKyAgaW1wb3J0X3BhY2thZ2UocCwgZi9uKQorCisgIG1haW4oZi9uLCBwdWJsaWMpOiBbSW5zdHJ1Y3Rpb25zXQorICBtYWluKGYvbiwgbm9uLXB1YmxpYyk6IFtJbnN0cnVjdGlvbnNdCisgIEw6IFtJbnN0cnVjdGlvbnNdCisKKyAgbGFiZWwoTCkKKyAgZGVyZWYoUmksIFJqKQorICBzZXQoUmksIFJqKQorICBzZXRCMAorICBnb3RvKEwpCisKKyAgZGVjbF90ZXJtX3ZhcnMoW1IxLC4uLixSbl0pCisgIGRlY2xfcHJlZF92YXJzKFtSMSwuLi4sUm5dKQorCisgIG5ld19oYXNoKFRBRywgaSkKKyAgcHV0X2hhc2goWCwgTCwgVEFHKQorCisgIHN0YXRpYyhbSW5zdHJ1Y3Rpb25zXSkKKworTm90YXRpb24KKyoqKioqKioqCisgIFggOjo9IGEoaSkgfCBTCisgIFkgOjo9IHkoaSkgfCBTCisgIFMgOjo9IHMoaSkgfCBzaShpKSB8IHNmKGkpCisgIEwgOjo9IGYvbiB8IGYvbitpIHwgZi9uK1RBRyB8IGYvbitUQUcraSB8IGYvbitUQUcraStpCisgIFRBRyA6Oj0gdmFyIHwgaW50IHwgZmxvIHwgY29uIHwgc3RyIHwgbGlzIHwgdG9wIHwgc3ViIHwgbmlsCisgIEJpbkcgOjo9IEMgfCBmKEExLC4uLEFuLCBDKSAKKyAgRyA6Oj0gZihBMSwuLixBbikgCisgIEEgOjo9IHZvaWQgfCBYCisgIEMgOjo9IGNvbnQgfCBwKE4pCisgIFIgOjo9IGNvbnQgfCBlY29udCB8IGEoaSkgfCBhcmcoaSkgfCBlYShpKQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIERlY2xhcmF0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCis6LSBvcCgxMTcwLCB4ZngsICg6LSkpLgorOi0gb3AoMTE3MCwgeGZ4LCAoLS0+KSkuCis6LSBvcCgxMTcwLCAgZngsICg6LSkpLgorOi0gb3AoMTE3MCwgIGZ4LCAoPy0pKS4KKzotIG9wKCA1MDAsIHlmeCwgKCMpKS4KKworOi0gb3AoMTE1MCwgIGZ4LCAoZHluYW1pYykpLgorOi0gb3AoMTE1MCwgIGZ4LCAobWV0YV9wcmVkaWNhdGUpKS4KKzotIG9wKDExNTAsICBmeCwgKHBhY2thZ2UpKS4gICUgUHJvbG9nIENhZmUgc3BlY2lmaWMKKzotIG9wKDExNTAsICBmeCwgKHB1YmxpYykpLgorOi0gb3AoMTE1MCwgIGZ4LCAoaW1wb3J0KSkuICAgJSBQcm9sb2cgQ2FmZSBzcGVjaWZpYworOi0gb3AoMTE1MCwgIGZ4LCAobW9kZSkpLgorOi0gb3AoMTE1MCwgIGZ4LCAobXVsdGlmaWxlKSkuCis6LSBvcCgxMTUwLCAgZngsIChibG9jaykpLgorCis6LSBkeW5hbWljIGludGVybmFsX2NsYXVzZS8yLgorOi0gZHluYW1pYyBpbnRlcm5hbF9wcmVkaWNhdGVzLzIuCis6LSBkeW5hbWljIGR5bmFtaWNfcHJlZGljYXRlcy8yLgorOi0gZHluYW1pYyBtZXRhX3ByZWRpY2F0ZXMvMy4KKzotIGR5bmFtaWMgcGFja2FnZV9uYW1lLzEuCis6LSBkeW5hbWljIHB1YmxpY19wcmVkaWNhdGVzLzIuCis6LSBkeW5hbWljIGltcG9ydF9wYWNrYWdlLzIuCis6LSBkeW5hbWljIGludGVybmFsX2RlY2xhcmF0aW9ucy8xLgorOi0gZHluYW1pYyBmaWxlX25hbWUvMS4KKzotIGR5bmFtaWMgZHVtbXlfY2xhdXNlX2NvdW50ZXIvMS4KKzotIGR5bmFtaWMgcGwyYW1fZmxhZy8xLgorOi0gZHluYW1pYyBmYWlsX2ZsYWcvMC4gICUgdXNlZCBmb3IgZ2VuZXJhdGluZyBsYWJlbChmYWlsLzApIG9yIG5vdAorCislIDotIG1vZHVsZSgnanAuYWMua29iZV91LmNzLnByb2xvZy5jb21waWxlci5wbDJhbScsIFttYWluLzAscGwyYW0vMV0pLgorcGFja2FnZShfKS4gCis6LSBwYWNrYWdlICdqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmNvbXBpbGVyLnBsMmFtJy4KKworOi0gcHVibGljIG1haW4vMCwgcGwyYW0vMS4KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBNYWluCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK21haW4gOi0gCisJcmVhZChYKSwgCisJcGwyYW0oWCkuCisKK3BsMmFtKFtQcm9sb2dGaWxlLCBBc21GaWxlLCBPcHRzXSkgOi0KKwlyZWFkX2luX3Byb2dyYW0oUHJvbG9nRmlsZSwgT3B0cyksCisJb3BlbihBc21GaWxlLCB3cml0ZSwgT3V0KSwKKwljb21waWxlX2FsbF9wcmVkaWNhdGVzKE91dCksCisJY2xvc2UoT3V0KS4KK3BsMmFtKF8pLgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgUmVhZCBpbiBQcm9ncmFtCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3JlYWRfaW5fcHJvZ3JhbShGaWxlLCBPcHRzKSA6LQorCXBsMmFtX3ByZXJlYWQoRmlsZSwgT3B0cyksCisJb3BlbihGaWxlLCByZWFkLCBJbiksCisJcmVwZWF0LAorCSAgcmVhZChJbiwgWCksCisJICBhc3NlcnRfY2xhdXNlKFgpLAorCVggPT0gZW5kX29mX2ZpbGUsCisJISwKKwljbG9zZShJbiksCisJcGwyYW1fcG9zdHJlYWQuCisKKyUlJSBQcmUtaW5pdAorcGwyYW1fcHJlcmVhZChGaWxlLCBPcHRzKSA6LQorCXJldHJhY3RhbGwoaW50ZXJuYWxfY2xhdXNlKF8sXykpLAorCXJldHJhY3RhbGwoaW50ZXJuYWxfcHJlZGljYXRlcyhfLF8pKSwKKwlyZXRyYWN0YWxsKGR5bmFtaWNfcHJlZGljYXRlcyhfLF8pKSwKKwlyZXRyYWN0YWxsKG1ldGFfcHJlZGljYXRlcyhfLF8sXykpLAorCXJldHJhY3RhbGwocGFja2FnZV9uYW1lKF8pKSwKKwlyZXRyYWN0YWxsKHB1YmxpY19wcmVkaWNhdGVzKF8sXykpLAorCXJldHJhY3RhbGwoaW1wb3J0X3BhY2thZ2UoXyxfKSksCisJcmV0cmFjdGFsbChpbnRlcm5hbF9kZWNsYXJhdGlvbnMoXykpLAorCXJldHJhY3RhbGwoZmlsZV9uYW1lKF8pKSwKKwlyZXRyYWN0YWxsKGR1bW15X2NsYXVzZV9jb3VudGVyKF8pKSwKKwlyZXRyYWN0YWxsKHBsMmFtX2ZsYWcoXykpLAorCXJldHJhY3RhbGwoZmFpbF9mbGFnKSwKKwlhc3NlcnQoZmlsZV9uYW1lKEZpbGUpKSwKKwlhc3NlcnQoZHVtbXlfY2xhdXNlX2NvdW50ZXIoMCkpLAorCWFzc2VydF9jb21waWxlX29wdHMoT3B0cyksCisJYXNzZXJ0X2RlZmF1bHRfZGVjbHMuCisKK2Fzc2VydF9kZWZhdWx0X2RlY2xzIDotIAorCWJ1aWx0aW5fbWV0YV9wcmVkaWNhdGVzKFByZWQsIEFyaXR5LCBNb2RlKSwgCisJYXNzZXJ0KG1ldGFfcHJlZGljYXRlcyhQcmVkLCBBcml0eSwgTW9kZSkpLAorCWZhaWwuCithc3NlcnRfZGVmYXVsdF9kZWNscy4KKworYXNzZXJ0X2NvbXBpbGVfb3B0cyhbXSkgOi0gIS4KK2Fzc2VydF9jb21waWxlX29wdHMoW098T3NdKSA6LSAKKwlhc3NlcnRfY29wdHMoTyksCisJYXNzZXJ0X2NvbXBpbGVfb3B0cyhPcykuCisKK2Fzc2VydF9jb3B0cyhPKSA6LSAKKwljbGF1c2UocGwyYW1fZmxhZyhPKSwgXyksCisJIS4KK2Fzc2VydF9jb3B0cyhPKSA6LSAKKwljb3B0X2V4cHIoTyksCisJISwKKwlhc3NlcnQocGwyYW1fZmxhZyhPKSkuCithc3NlcnRfY29wdHMoTykgOi0gCisJcGwyYW1fZXJyb3IoW08saXMsYW4saW52YWxpZCxvcHRpb24sZm9yLHBsMmFtXSksCisJZmFpbC4KKworY29wdF9leHByKGVkKS4KK2NvcHRfZXhwcihhYykuCitjb3B0X2V4cHIoaWUpLgorY29wdF9leHByKHJjKS4KK2NvcHRfZXhwcihyYyhfLF8pKS4KK2NvcHRfZXhwcihpZHgpLgorY29wdF9leHByKGNsbykuCisKKyUlJSBQb3N0LWluaXQKK3BsMmFtX3Bvc3RyZWFkIDotIAorCWFzc2VydF9pbXBvcnQoJ2pwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZycpLAorCWFzc2VydF9pbXBvcnQoJ2pwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbicpLAorCWFzc2VydF9kdW1teV9wYWNrYWdlLAorCWFzc2VydF9kdW1teV9wdWJsaWMuCisKK2Fzc2VydF9kdW1teV9wYWNrYWdlIDotIAorCWNsYXVzZShwYWNrYWdlX25hbWUoXyksIF8pLAorCSEuCithc3NlcnRfZHVtbXlfcGFja2FnZSA6LSAKKwlhc3NlcnQocGFja2FnZV9uYW1lKHVzZXIpKS4KKworYXNzZXJ0X2R1bW15X3B1YmxpYyA6LSAKKwljbGF1c2UocHVibGljX3ByZWRpY2F0ZXMoXyxfKSwgXyksCisJIS4KK2Fzc2VydF9kdW1teV9wdWJsaWMgOi0gCisJYXNzZXJ0KHB1YmxpY19wcmVkaWNhdGVzKF8sXykpLgorCislJSUgQXNzZXJ0IENsYXVzZXMKK2Fzc2VydF9jbGF1c2UoZW5kX29mX2ZpbGUpIDotICEuCithc3NlcnRfY2xhdXNlKCg6LSBkeW5hbWljIEcpKSA6LSAhLAorCWNvbmpfdG9fbGlzdChHLCBHMSksCisJYXNzZXJ0X2R5bmFtaWNfcHJlZGljYXRlcyhHMSkuCithc3NlcnRfY2xhdXNlKCg6LSBtb2R1bGUoTSwgUExpc3QpKSkgOi0gISwKKwlhc3NlcnRfcGFja2FnZShNKSwKKwlhc3NlcnRfcHVibGljX3ByZWRpY2F0ZXMoUExpc3QpLgorYXNzZXJ0X2NsYXVzZSgoOi0gbWV0YV9wcmVkaWNhdGUgRykpIDotICEsCisJY29ual90b19saXN0KEcsIEcxKSwKKwlhc3NlcnRfbWV0YV9wcmVkaWNhdGVzKEcxKS4KK2Fzc2VydF9jbGF1c2UoKDotIHBhY2thZ2UgRykpIDotICEsIAorCWFzc2VydF9wYWNrYWdlKEcpLgorYXNzZXJ0X2NsYXVzZSgoOi0gcHVibGljIEcpKSA6LSAhLAorCWNvbmpfdG9fbGlzdChHLCBHMSksCisJYXNzZXJ0X3B1YmxpY19wcmVkaWNhdGVzKEcxKS4KK2Fzc2VydF9jbGF1c2UoKDotIGltcG9ydCBHKSkgOi0gISwKKwlhc3NlcnRfaW1wb3J0KEcpLgorYXNzZXJ0X2NsYXVzZSgoOi0gbW9kZSBfRykpIDotICEsCisJcGwyYW1fbWVzc2FnZShbJyoqKiBXQVJOSU5HJyxtb2RlLGRlY2xhcmF0aW9uLGlzLG5vdCxzdXBwb3J0ZWQseWV0XSkuCithc3NlcnRfY2xhdXNlKCg6LSBtdWx0aWZpbGUgX0cpKSA6LSAhLAorCXBsMmFtX21lc3NhZ2UoWycqKiogV0FSTklORycsbXVsdGlmaWxlLGRlY2xhcmF0aW9uLGlzLG5vdCxzdXBwb3J0ZWQseWV0XSkuCithc3NlcnRfY2xhdXNlKCg6LSBibG9jayBfRykpIDotICEsCisJcGwyYW1fbWVzc2FnZShbJyoqKiBXQVJOSU5HJyxibG9jayxkZWNsYXJhdGlvbixpcyxub3Qsc3VwcG9ydGVkLHlldF0pLgorYXNzZXJ0X2NsYXVzZSgoOi0gRykpIDotICEsIAorCWNhbGwoRyksCisJYXNzZXJ0X2RlY2xhcmF0aW9ucyhHKS4KK2Fzc2VydF9jbGF1c2UoQ2xhdXNlKSA6LQorCXByZXByb2Nlc3MoQ2xhdXNlLCBDbCksCisJYXNzZXJ0X2NscyhDbCkuCisKKyUlJSBEeW5hbWljIERlY2xhcmF0aW9uCithc3NlcnRfZHluYW1pY19wcmVkaWNhdGVzKFtdKSA6LSAhLgorYXNzZXJ0X2R5bmFtaWNfcHJlZGljYXRlcyhbR3xHc10pIDotCisJYXNzZXJ0X2R5bmFtaWMoRyksCisJYXNzZXJ0X2R5bmFtaWNfcHJlZGljYXRlcyhHcykuCisKK2Fzc2VydF9keW5hbWljKEcpIDotCisJXCsgY2xhdXNlKHBhY2thZ2VfbmFtZSgnanAuYWMua29iZV91LmNzLnByb2xvZy5idWlsdGluJyksIF8pLAorCUcgPSBGL0EsCisJZnVuY3RvcihIZWFkLCBGLCBBKSwKKwlzeXN0ZW1fcHJlZGljYXRlKEhlYWQpLAorCSEsCisJcGwyYW1fZXJyb3IoW2Nhbixub3QscmVkZWZpbmUsYnVpbHRpbixwcmVkaWNhdGUsRi9BXSksCisJZmFpbC4KK2Fzc2VydF9keW5hbWljKEcpIDotCisJRyA9IEYvQSwKKwljbGF1c2UoZHluYW1pY19wcmVkaWNhdGVzKEYsQSksIF8pLCAhLgorYXNzZXJ0X2R5bmFtaWMoRykgOi0KKwlHID0gRi9BLAorCWFzc2VydChkeW5hbWljX3ByZWRpY2F0ZXMoRixBKSksICEuCithc3NlcnRfZHluYW1pYyhHKSA6LSAKKwlwbDJhbV9lcnJvcihbRyxpcyxhbixpbnZhbGlkLGR5bmFtaWMsZGVjbGFyYXRpb25dKSwKKwlmYWlsLgorCislJSUgTWV0YSBQcmVkaWNhdGVzIERlY2xhcmF0aW9uCithc3NlcnRfbWV0YV9wcmVkaWNhdGVzKFtdKSA6LSAhLgorYXNzZXJ0X21ldGFfcHJlZGljYXRlcyhbR3xHc10pIDotCisJYXNzZXJ0X21ldGEoRyksCisJYXNzZXJ0X21ldGFfcHJlZGljYXRlcyhHcykuCisKK2Fzc2VydF9tZXRhKEcpIDotCisJZnVuY3RvcihHLCBGLCBBKSwKKwljbGF1c2UobWV0YV9wcmVkaWNhdGVzKEYsIEEsIF8pLCBfKSwKKwkhLgorYXNzZXJ0X21ldGEoRykgOi0KKwlmdW5jdG9yKEcsIEYsIEEpLAorCUcgPS4uIFtffE1dLAorCW1vZGVfZXhwcihNKSwKKwkhLAorCWFzc2VydChtZXRhX3ByZWRpY2F0ZXMoRiwgQSwgTSkpLgorYXNzZXJ0X21ldGEoRykgOi0KKwlwbDJhbV9lcnJvcihbRyxpcyxhbixpbnZhbGlkLG1ldGFfcHJlZGljYXRlLGRlY2xhcmF0aW9uXSksCisJZmFpbC4KKworJSUlIFBhY2thZ2UgRGVjbGFyYXRpb24KK2Fzc2VydF9wYWNrYWdlKEcpIDotIAorCWNsYXVzZShwYWNrYWdlX25hbWUoRzEpLCBfKSwKKwlHIFw9PSBHMSwKKwkhLAorCXBsMmFtX2Vycm9yKFtkdXBsaWNhdGUscGFja2FnZSxkZWNsYXJhdGlvbnMsOixHMSxhbmQsR10pLAorCWZhaWwuCithc3NlcnRfcGFja2FnZShHKSA6LSAKKwlhdG9tKEcpLCAKKwkhLAorCWFzc2VydChwYWNrYWdlX25hbWUoRykpLAorCXJldHJhY3RhbGwoaW1wb3J0X3BhY2thZ2UoRywgXykpLgorYXNzZXJ0X3BhY2thZ2UoRykgOi0gCisJcGwyYW1fZXJyb3IoW0csaXMsaW52YWxpZCxwYWNrYWdlLGRlY2xhcmF0aW9uXSksIAorCWZhaWwuCisKKyUlJSBQdWJsaWMgRGVjbGFyYXRpb24KK2Fzc2VydF9wdWJsaWNfcHJlZGljYXRlcyhbXSkgOi0gIS4KK2Fzc2VydF9wdWJsaWNfcHJlZGljYXRlcyhbR3xHc10pIDotCisJYXNzZXJ0X3B1YmxpYyhHKSwKKwlhc3NlcnRfcHVibGljX3ByZWRpY2F0ZXMoR3MpLgorCithc3NlcnRfcHVibGljKEYvQSkgOi0gCisJcHJlZHNwZWNfZXhwcihGL0EpLAorCWNsYXVzZShwdWJsaWNfcHJlZGljYXRlcyhGLCBBKSwgXyksCisJIS4KK2Fzc2VydF9wdWJsaWMoRi9BKSA6LQorCXByZWRzcGVjX2V4cHIoRi9BKSwKKwlhc3NlcnQocHVibGljX3ByZWRpY2F0ZXMoRiwgQSkpLgorCislJSUgSW1wb3J0IERlY2xhcmF0aW9uCithc3NlcnRfaW1wb3J0KEcpIDotIAorCWF0b20oRyksIAorCSEsIAorCWFzc2VydF9pbXB0KEcsICgqKSkuCithc3NlcnRfaW1wb3J0KE06UCkgOi0gCisJYXRvbShNKSwKKwkocHJlZHNwZWNfZXhwcihQKSA7IGF0b20oUCkpLAorCSEsIAorCWFzc2VydF9pbXB0KE0sIFApLgorYXNzZXJ0X2ltcG9ydChHKSA6LSAKKwlwbDJhbV9lcnJvcihbRyxpcyxpbnZhbGlkLGltcG9ydCxkZWNsYXJhdGlvbl0pLCAKKwlmYWlsLgorCithc3NlcnRfaW1wdChNLCBfUCkgOi0KKwljbGF1c2UocGFja2FnZV9uYW1lKE0pLCBfKSwKKwkhLgorYXNzZXJ0X2ltcHQoTSwgUCkgOi0KKwljbGF1c2UoaW1wb3J0X3BhY2thZ2UoTSwgUDApLCBfKSwKKwkoUDAgPT0gKCopIDsgUDAgPT0gUCksCisJIS4KK2Fzc2VydF9pbXB0KE0sIFApIDotIAorCWFzc2VydChpbXBvcnRfcGFja2FnZShNLCBQKSkuCisKKyUlJSBBc3NlcnQgRGVjbGFyYXRpb24gKDotIEcpCithc3NlcnRfZGVjbGFyYXRpb25zKEcpIDotIAorCWNsYXVzZShpbnRlcm5hbF9kZWNsYXJhdGlvbnMoRyksIF8pLAorCSEuCithc3NlcnRfZGVjbGFyYXRpb25zKEcpIDotIAorCWFzc2VydChpbnRlcm5hbF9kZWNsYXJhdGlvbnMoRykpLgorCislJSUgQXNzZXJ0IENsdWFzZQorYXNzZXJ0X2NscygoSGVhZCA6LSBCb2R5KSkgOi0gISwKKwlhc3NlcnRfcHJlZGljYXRlKEhlYWQpLAorCWFzc2VydChpbnRlcm5hbF9jbGF1c2UoSGVhZCwgQm9keSkpLgorYXNzZXJ0X2NscyhIZWFkKSA6LSAhLAorCWFzc2VydF9wcmVkaWNhdGUoSGVhZCksCisJYXNzZXJ0KGludGVybmFsX2NsYXVzZShIZWFkLCB0cnVlKSkuCisKK2Fzc2VydF9wcmVkaWNhdGUoSGVhZCkgOi0KKwlcKyBjbGF1c2UocGFja2FnZV9uYW1lKCdqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW4nKSwgXyksCisJc3lzdGVtX3ByZWRpY2F0ZShIZWFkKSwKKwkhLAorCWZ1bmN0b3IoSGVhZCwgRnVuY3RvciwgQXJpdHkpLAkKKwlwbDJhbV9lcnJvcihbY2FuLG5vdCxyZWRlZmluZSxidWlsdGluLHByZWRpY2F0ZSxGdW5jdG9yL0FyaXR5XSksCisJZmFpbC4KK2Fzc2VydF9wcmVkaWNhdGUoSGVhZCkgOi0KKwlmdW5jdG9yKEhlYWQsIEZ1bmN0b3IsIEFyaXR5KSwKKwljbGF1c2UoaW50ZXJuYWxfcHJlZGljYXRlcyhGdW5jdG9yLCBBcml0eSksIF8pLAorCSEuCithc3NlcnRfcHJlZGljYXRlKEhlYWQpIDotCisJZnVuY3RvcihIZWFkLCBGdW5jdG9yLCBBcml0eSksCisJYXNzZXJ0KGludGVybmFsX3ByZWRpY2F0ZXMoRnVuY3RvciwgQXJpdHkpKS4KKworJSUlIFByZXByb2Nlc3MKK3ByZXByb2Nlc3MoQ2wwLCBDbCkgOi0KKwljbGF1c2UocGwyYW1fZmxhZyhlZCksIF8pLAorCSEsCisJZXhwYW5kX3Rlcm0oQ2wwLCBDbDEpLAorCWVsaW1pbmF0ZV9kaXNqdW5jdGlvbihDbDEsIENsKS4KK3ByZXByb2Nlc3MoQ2wwLCBDbCkgOi0KKwlleHBhbmRfdGVybShDbDAsIENsKS4KKworZWxpbWluYXRlX2Rpc2p1bmN0aW9uKENsMCwgQ2wpIDotIAorCWVsaW1pbmF0ZV9kaXNqKENsMCwgQ2wsIER1bW15Q2xzKSwKKwlhc3NlcnRfZHVtbXlfY2xhdXNlcyhEdW1teUNscykuCisKK2Fzc2VydF9kdW1teV9jbGF1c2VzKFtdKSA6LSAhLgorYXNzZXJ0X2R1bW15X2NsYXVzZXMoW0N8Q3NdKSA6LSAKKwlhc3NlcnRfY2xhdXNlKEMpLAorCWFzc2VydF9kdW1teV9jbGF1c2VzKENzKS4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIENvbXBpbGUgUHJvbG9nIFByb2dyYW0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY29tcGlsZV9hbGxfcHJlZGljYXRlcyhPdXQpIDotICUgb3V0cHV0IGRlY2xhcmF0aW9ucyAoZXguIG9wLzMpCisJY2xhdXNlKGludGVybmFsX2RlY2xhcmF0aW9ucyhHKSwgXyksCisJd3JpdGVxKE91dCwgKDotIEcpKSwgd3JpdGUoT3V0LCAnLicpLCBubChPdXQpLCAKKwlmYWlsLgorY29tcGlsZV9hbGxfcHJlZGljYXRlcyhfKSA6LSAgICUgdHJlYXQgZHluYW1pYyBkZWNsYXJhdGlvbgorCWZpbmRhbGwoRnVuY3Rvci9Bcml0eSwgZHluYW1pY19wcmVkaWNhdGVzKEZ1bmN0b3IsIEFyaXR5KSwgUHJlZFNwZWNzKSwKKwlhc3NlcnRfaW5pdF9jbGF1c2VzKFByZWRTcGVjcyksCisJZmFpbC4KK2NvbXBpbGVfYWxsX3ByZWRpY2F0ZXMoT3V0KSA6LSAlIGNvbXBpbGUgcHJlZGljYXRlCisJY2xhdXNlKGludGVybmFsX3ByZWRpY2F0ZXMoRnVuY3RvciwgQXJpdHkpLCBfKSwKKwljb21waWxlX3ByZWRpY2F0ZShGdW5jdG9yLCBBcml0eSwgSW5zdHJ1Y3Rpb25zLCBbXSksCisJd3JpdGVfYXNtKE91dCwgSW5zdHJ1Y3Rpb25zKSwgCisJbmwoT3V0KSwgCisJZmFpbC4KK2NvbXBpbGVfYWxsX3ByZWRpY2F0ZXMoT3V0KTotIG5sKE91dCkuCisKK3dyaXRlX2FzbShfLCBbXSkgOi0gIS4KK3dyaXRlX2FzbShPdXQsIFtJbnN0cnVjdGlvbnxJbnN0cnVjdGlvbnNdKSA6LSAhLAorCXdyaXRlX2FzbShPdXQsIEluc3RydWN0aW9uKSwKKwl3cml0ZV9hc20oT3V0LCBJbnN0cnVjdGlvbnMpLgord3JpdGVfYXNtKE91dCwgYmVnaW5fcHJlZGljYXRlKEZBKSkgOi0gISwKKwl3cml0ZXEoT3V0LCBiZWdpbl9wcmVkaWNhdGUoRkEpKSwgd3JpdGUoT3V0LCAnLicpLCBubChPdXQpLgord3JpdGVfYXNtKE91dCwgZW5kX3ByZWRpY2F0ZShGQSkpIDotICEsCisJd3JpdGVxKE91dCwgZW5kX3ByZWRpY2F0ZShGQSkpLCB3cml0ZShPdXQsICcuJyksIG5sKE91dCkuCit3cml0ZV9hc20oT3V0LCBjb21tZW50KENvbW1lbnQwKSkgOi0gISwKKwljb3B5X3Rlcm0oQ29tbWVudDAsIENvbW1lbnQpLAorCW51bWJlcnZhcnMoQ29tbWVudCwgMCwgXyksCisgICAgICAgIHRhYihPdXQsIDgpLCB3cml0ZXEoT3V0LCBjb21tZW50KENvbW1lbnQpKSwgd3JpdGUoT3V0LCAnLicpLCBubChPdXQpLgord3JpdGVfYXNtKE91dCwgKExhYmVsOiBJbnN0cnVjdGlvbikpIDotICEsCisJd3JpdGVxKE91dCwgTGFiZWwpLCB3cml0ZShPdXQsICcgOicpLCBubChPdXQpLAorCXdyaXRlX2FzbShPdXQsIEluc3RydWN0aW9uKS4KK3dyaXRlX2FzbShPdXQsIEluc3RydWN0aW9uKSA6LQorCXRhYihPdXQsIDgpLCB3cml0ZXEoT3V0LCBJbnN0cnVjdGlvbiksIHdyaXRlKE91dCwgJy4nKSwgbmwoT3V0KS4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgVHJlYXQgRHluYW1pYyBEZWNsYXJhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Fzc2VydF9pbml0X2NsYXVzZXMoW10pIDotICEuCithc3NlcnRfaW5pdF9jbGF1c2VzKFByZWRTcGVjcykgOi0KKwljb2xsZWN0X2luaXRfY2xzKFByZWRTcGVjcywgQ2xzKSwKKwlhc3NlcnRfaW5pdF9jbHMoQ2xzKSwKKwkhLgorCitjb2xsZWN0X2luaXRfY2xzKFtdLCBbXSkgOi0gIS4KK2NvbGxlY3RfaW5pdF9jbHMoW0YvQXxGQXNdLCBbQ2xzfENsczFdKSA6LQorCWNsYXVzZShpbnRlcm5hbF9wcmVkaWNhdGVzKEYsQSksIF8pLAorCSEsCisJZnVuY3RvcihIZWFkLCBGLCBBKSwKKwlmaW5kYWxsKGFzc2VydHooKEhlYWQgOi0gQm9keSkpLCBpbnRlcm5hbF9jbGF1c2UoSGVhZCwgQm9keSksIENscyksCisJcmV0cmFjdGFsbChpbnRlcm5hbF9wcmVkaWNhdGVzKEYsQSkpLAorCXJldHJhY3RhbGwoaW50ZXJuYWxfY2xhdXNlKEhlYWQsIF8pKSwKKwljb2xsZWN0X2luaXRfY2xzKEZBcywgQ2xzMSkuCislY29sbGVjdF9pbml0X2NscyhbRkF8RkFzXSwgW2hhc2hfcHV0KFAsRkEsW10pfENsc10pIDotCitjb2xsZWN0X2luaXRfY2xzKFtGQXxGQXNdLCBbJyRuZXdfaW5kZXhpbmdfaGFzaCcoUCxGQSxfKXxDbHNdKSA6LQorCWNsYXVzZShwYWNrYWdlX25hbWUoUCksIF8pLAorCSEsCisJY29sbGVjdF9pbml0X2NscyhGQXMsIENscykuCisKK2Fzc2VydF9pbml0X2NscyhbXSkgOi0gIS4KK2Fzc2VydF9pbml0X2NscyhDbHMpIDotIAorCWxpc3RfdG9fY29uaihDbHMsIEJvZHkpLAorCWFzc2VydF9jbGF1c2UoKCckaW5pdCcgOi0gQm9keSkpLgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBDb21waWxlIFByZWRpY2F0ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NvbXBpbGVfcHJlZGljYXRlKEZ1bmN0b3IsIEFyaXR5KSAtLT4KKwl7ZnVuY3RvcihIZWFkLCBGdW5jdG9yLCBBcml0eSl9LAorCXtmaW5kYWxsKChIZWFkIDotIEJvZHkpLCBpbnRlcm5hbF9jbGF1c2UoSGVhZCwgQm9keSksIENsYXVzZXMpfSwKKwlbYmVnaW5fcHJlZGljYXRlKEZ1bmN0b3IvQXJpdHkpXSwKKwlnZW5lcmF0ZV9wYWNrYWdlLAorCWdlbmVyYXRlX2ltcG9ydCwKKwlnZW5lcmF0ZV9pbmZvKEZ1bmN0b3IsIEFyaXR5KSwKKyAgICAgICAgY29tcGlsZV9wcmVkKENsYXVzZXMsIEZ1bmN0b3IvQXJpdHkpLAorCVtlbmRfcHJlZGljYXRlKEZ1bmN0b3IvQXJpdHkpXS4KKworJSUlIFByb2dyYW0gQ29kZQorY29tcGlsZV9wcmVkKFtdLCBfKSAtLT4gW10sICEuCitjb21waWxlX3ByZWQoW0NsYXVzZV0sIEZBKSAtLT4gISwKKwl7Y2hlY2tfbW9kaWZpZXIoRkEsIE1GKX0sICUgY2hlY2tzIHB1YmxpYyBvciBub24tcHVibGljCisJW21haW4oRkEsIE1GKTogW11dLAorCVtQdXRHcm91bmRUZXJtXSwgICAgJSBnZW5lcmF0ZXMgcHV0IGluc3RydWN0aW9ucyBvZiBncm91bmQgdGVybXMKKwlbRkE6IFtdXSwKKwlbY29tbWVudChDbGF1c2UpXSwgIAorCVtzZXRCMF0sICAgICAgICAgICAgJSBzZXQgQjAgcmVnaXN0ZXIgZm9yIGN1dAorCVtEZWNsTG9jYWxWYXJzXSwgICAgJSBnZW5lcmF0ZXMgdGhlIGRlY2xhcmF0aW9ucyBvZiBsb2NhbCB2YXJpYWJsZXMKKwl7RkEgPSBfL0F9LAorCXNldF9hcmd1bWVudHMoMSwgQSwgYXJnLCBhLCBzZXQpLCAlIHNldCBhcmcoTikgdG8gYShOKS4KKwl7R1RJMCA9IFsxLFtdLFtdXX0sICUgR1RJMCA9IFtTTixTQWxsb2MsUHV0R3JvdW5kVGVybV0KKwljb21waWxlX2NsYXVzZShDbGF1c2UsIEdUSTAsIEdUSSwgTFRJKSwKKwl7R1RJID0gW18sXyxQdXRHcm91bmRUZXJtMF0sIHBsMmFtX3JldihQdXRHcm91bmRUZXJtMCwgUHV0R3JvdW5kVGVybSl9LAorCXtMVEkgPSBbWE4sXyxQTnxfXSwgZ2VuZXJhdGVfdmFyX2RlY2woWzEsMV0sIFtYTixQTl0sIERlY2xMb2NhbFZhcnMsIFtdKX0uCitjb21waWxlX3ByZWQoQ2xhdXNlcywgRkEpIC0tPiAKKwl7Y2hlY2tfbW9kaWZpZXIoRkEsIE1GKX0sICUgY2hlY2tzIHB1YmxpYyBvciBub24tcHVibGljCisJW21haW4oRkEsTUYpOiBbXV0sCisJW1B1dEdyb3VuZFRlcm1dLCAgICAlIGdlbmVyYXRlcyBncm91bmQgdGVybXMKKwlbT1BUMV0sCisJW1B1dExhYmVsXSwgICAgICAgICAlIGdlbmVyYXRlcyBsYWJlbCBkZWNsYXJhdGlvbnMKKwlbTmV3SGFzaF0sICAgICAgICAgICUgZ2VuZXJhdGVzIG5ld19oYXNoCisJW1B1dEhhc2hdLCAgICAgICAgICAlIGdlbmVyYXRlcyBwdWJfaGFzaAorCSUKKwlbRkE6IFtdXSwKKwl7RkEgPSBGdW5jdG9yL0FyaXR5fSwKKwlzZXRfYXJndW1lbnRzKDEsIEFyaXR5LCBhcmcsIGVhLCBzZXQpLCAlIHNldCBhcmcoTikgdG8gZW5naW5lLmFyZWcoTikKKwlbc2V0KGNvbnQsIGVjb250KV0sICUgc2V0IGNvbnQgdG8gZW5naW5lLmNvbnQKKwlbT1BUMl0sCisJW09QVDNdLAorCVtzZXRCMF0sICAgICAgICAgICAgJSBzZXQgQjAgcmVnaXN0ZXIgZm9yIGN1dAorCWdlbmVyYXRlX3N3aXRjaChDbGF1c2VzLCBGQSwgR0xJKSwgJSBnZW5lcmF0ZXMgY29udHJvbCBhbmQgaW5kZXhpbmcgaW5zdHJ1Y3Rpb25zLgorCXtHVEkwID0gWzEsW10sW11dfSwgJSBHVEkwID0gW1NOLFNBbGxvYyxQdXRHcm91bmRUZXJtXQorCWNvbXBpbGVfcHJlZDIoQ2xhdXNlcywgRkEsIDEsIEdUSTAsIEdUSSksCisJJQorCXtHVEkgPSBbXyxTQWxsb2MsUHV0R3JvdW5kVGVybTBdLCBwbDJhbV9yZXYoUHV0R3JvdW5kVGVybTAsIFB1dEdyb3VuZFRlcm0pfSwKKwl7R0xJID0gW1B1dExhYmVsLCBIYXNoMF19LAorCSUgcmVwbGFjZSB0aGUgaGFzaCBrZXkgd2l0aCBzKGkpLCBzaShpKSwgb3Igc2YoaSkKKwl7cmVwbGFjZV9oYXNoX2tleXMoSGFzaDAsIFNBbGxvYywgTmV3SGFzaCwgUHV0SGFzaDApfSwKKwl7UHV0SGFzaDAgPT0gW10gLT4gUHV0SGFzaCA9IFtdIDsgUHV0SGFzaCA9IHN0YXRpYyhQdXRIYXNoMCl9LAorCSUgZ2VuZXJhdGUgY29kZSBmb3IgdGhlIHJlY3Vyc2l6ZSBjYWxsIG9wdGltaXphdGlvbgorCXtjbGF1c2UocGwyYW1fZmxhZyhyYyhGdW5jdG9yLEFyaXR5KSksIF8pIC0+IAorICAgICAgICAgICAgICBPUFQxID0gbGFiZWwoRkErdG9wKSwgT1BUMiA9IGdvdG8oRkErdG9wKSwgT1BUMyA9IEZBK3RvcDogW10KKyAgICAgICAgICAgICAgOworICAgICAgICAgICAgICBPUFQxID0gW10sIE9QVDIgPSBbXSwgT1BUMyA9IFtdCisJfS4KKworY29tcGlsZV9wcmVkMihbXSwgXywgXywgR1RJLCBHVEkpIC0tPiAhLgorY29tcGlsZV9wcmVkMihbQ2xhdXNlfENsYXVzZXNdLCBGQSwgTiwgR1RJMCwgR1RJKSAtLT4KKwlbRkErTjogW11dLAorCVtjb21tZW50KENsYXVzZSldLCAgCisJW0RlY2xMb2NhbFZhcnNdLCAgICAlIGdlbmVyYXRlcyB0aGUgZGVjbGFyYXRpb25zIG9mIGxvY2FsIHZhcmlhYmxlcworCVtkZWNsX3ByZWRfdmFycyhbY29udF0pXSwKKwl7RkEgPSBfL0FyaXR5fSwKKwlzZXRfYXJndW1lbnRzKDEsIEFyaXR5LCBlYSwgYSwgc2V0KSwgJSBzZXQgZW5naW5lLmFyZWcoTikgdG8gYShOKS4KKwlbc2V0KGVjb250LCBjb250KV0sICUgc2V0IGVuZ2luZS5jb250IHRvIGNvbnQKKwljb21waWxlX2NsYXVzZShDbGF1c2UsIEdUSTAsIEdUSTEsIExUSSksCisJe04xIGlzIE4gKyAxfSwKKwljb21waWxlX3ByZWQyKENsYXVzZXMsIEZBLCBOMSwgR1RJMSwgR1RJKSwKKwl7TFRJID0gW1hOLF8sUE58X10sIGdlbmVyYXRlX3Zhcl9kZWNsKFsxLDFdLCBbWE4sUE5dLCBEZWNsTG9jYWxWYXJzLCBbXSl9LgorCislJSUgQ29udHJvbCBhbmQgSW5kZXhpbmcgaW5zdHJ1Y3Rpb25zCitnZW5lcmF0ZV9zd2l0Y2goQ2xhdXNlcywgRkEsIFtMYWJlbCwgSGFzaF0pIC0tPiAKKwklIGdlbmVyYXRlcyB0cnksIHJldHJ5LCB0cnVzdCwgc3dpdGNoX29uX3Rlcm0sIGFuZCBzd2l0Y2hfb25faGFzaAorCXtnZW5lcmF0ZV9zd2l0Y2gwKENsYXVzZXMsIEZBLCBJbnN0cnMsIFtdKX0sCisJJSBnZW5lcmF0ZXMgc3ViLWxhYmVscyBmb3IgQlAKKwlnZW5lcmF0ZV9icF9sYWJlbChJbnN0cnMsIEZBK3N1YiwgMSwgTHMwLCBTV1RzKSwKKwklIGdlbmVyYXRlcyBmYWlsIGxhYmVsIChmYWlsX2ZsYWcgbWF5IGJlIGFzc2VydGVkIGJ5IGdlbmVyYXRlX3N3aXRjaDAvNCkKKwl7KHJldHJhY3QoZmFpbF9mbGFnKSAtPiBMczEgPSBbbGFiZWwoZmFpbC8wKXxMczBdIDsgTHMxID0gTHMwKX0sCisJJSBnZW5lcmF0ZXMgbGFiZWxzIGZvciBjbGF1c2VzCisJe2xlbmd0aChDbGF1c2VzLCBOKX0sCisJe2dlbmVyYXRlX2NsX2xhYmVsKEZBLCAxLCBOLCBMczIpfSwKKwl7cGwyYW1fYXBwZW5kKExzMSwgTHMyLCBMYWJlbCl9LAorCSUgZ2VuZXJhdGVzIG5ld19oYXNoIGFuZCBwdXRfaGFzaCBpbnN0cnVjdGlvbnMgZm9yIHN3aXRjaF9vbl9oYXNoCisJe2dlbl9oYXNoKFNXVHMsIEhhc2gsIFtdKX0uCisKK2dlbmVyYXRlX3N3aXRjaDAoQ2xhdXNlcywgRkEpIC0tPiAKKwl7Z2V0X2luZGljZXMoQ2xhdXNlcywgRkEsIDEsIElzKX0sCisJZ2VuZXJhdGVfc3dpdGNoMShJcywgRkEpLgorCislJSUgMXN0LiBJbmRleGluZworZ2VuZXJhdGVfc3dpdGNoMShJcywgRkEpIC0tPgorCXtGQSA9IF8vMH0sCisJISwKKwlnZW5lcmF0ZV90cmllcyhJcykuCitnZW5lcmF0ZV9zd2l0Y2gxKElzLCBfKSAtLT4KKwl7YWxsX3ZhcmlhYmxlX2luZGljZXMoSXMpfSwKKwkhLAorCWdlbmVyYXRlX3RyaWVzKElzKS4KK2dlbmVyYXRlX3N3aXRjaDEoSXMsIEZBKSAtLT4KKwlbc3dpdGNoX29uX3Rlcm0oTFYsTEksTEYsTEMsTFMsTEwpXSwKKwlnZW5lcmF0ZV9zdyhJcywgRkEsIHZhciwgTFYsIFtdLCBQSXMwKSwKKwlnZW5lcmF0ZV9zdyhJcywgRkEsIGludCwgTEksIFBJczAsIFBJczEpLAorCWdlbmVyYXRlX3N3KElzLCBGQSwgZmxvLCBMRiwgUElzMSwgUElzMiksCisJZ2VuZXJhdGVfc3coSXMsIEZBLCBjb24sIExDLCBQSXMyLCBQSXMzKSwKKwlnZW5lcmF0ZV9zdyhJcywgRkEsIHN0ciwgTFMsIFBJczMsIFBJczQpLAorCWdlbmVyYXRlX3N3KElzLCBGQSwgbGlzLCBMTCwgUElzNCwgXykuCisKK2dlbmVyYXRlX3N3KElzLCBGQSwgVGFnLCBMLCBQSXMwLCBQSXMpIC0tPgorCXtzZWxlY3RfaW5kaWNlcyhJcywgVGFnLCBJczEpfSwKKwlnZW5lcmF0ZV9zdzEoSXMxLCBGQSwgVGFnLCBMLCBQSXMwLCBQSXMpLgorCislJSUgMm5kLiBJbmRleGluZworZ2VuZXJhdGVfc3cxKFtdLCBfLCBfLCBmYWlsLzAsIFBJcywgUElzKSAtLT4gISwge2Fzc2VydF9mYWlsfS4KK2dlbmVyYXRlX3N3MShbSV0sIF8sIF8sIEwsIFBJcywgUElzKSAtLT4gISwge0kgPSBbTHxfXX0uCitnZW5lcmF0ZV9zdzEoSXMsIEZBLCBUYWcsIEwsIFBJczAsIFBJcykgLS0+CisJe25vX3N3aXRjaF9vbl9oYXNoKElzLCBUYWcpfSwKKwkhLAorCWdlbmVyYXRlX3N3MihJcywgRkEsIFRhZywgTCwgUElzMCwgUElzKS4KK2dlbmVyYXRlX3N3MShJcywgRkEsIFRhZywgRkErVGFnLCBQSXMwLCBQSXMpIC0tPgorCWdlbmVyYXRlX3N3KElzLCBGQSwgbmlsLCBMLCBQSXMwLCBQSXMpLAorCXtjb3VudF91bmlxdWVfaGFzaChJcywgU2l6ZSwgS2V5cyl9LAorCVtGQStUYWc6IHN3aXRjaF9vbl9oYXNoKFRhZywgU2l6ZSwgTCwgSFQpXSwgCisJe2dlbmVyYXRlX2hhc2hfdGFibGUoS2V5cywgSXMsIExJcyl9LAorCWdlbmVyYXRlX2hhc2hfdHJpZXMoTElzLCBGQStUYWcsIDAsIEhUKS4KKworbm9fc3dpdGNoX29uX2hhc2goSXMsIFRhZykgOi0gCisJY2xhdXNlKHBsMmFtX2ZsYWcoaWR4KSwgXyksIAorCSEsCisJKFRhZyA9IHZhciA7IFRhZyA9IGxpcyA7IFRhZyA9IG5pbCA7IGNvdW50X3VuaXF1ZV9oYXNoKElzLCBDLCBfKSwgQyA8IDIpLgorbm9fc3dpdGNoX29uX2hhc2goXywgXykuCisKK2dlbmVyYXRlX3N3MihJcywgXywgXywgTCwgUElzLCBQSXMpIC0tPgorCXtwbDJhbV9tZW1iZXIoKEwsSXMpLCBQSXMpfSwKKwkhLgorZ2VuZXJhdGVfc3cyKElzLCBGQSwgVGFnLCBGQStUYWcsIFBJczAsIFsoRkErVGFnLElzKXxQSXMwXSkgLS0+CisJW0ZBK1RhZzogW11dLCAKKwlnZW5lcmF0ZV90cmllcyhJcykuCisKK2dlbmVyYXRlX2hhc2hfdHJpZXMoW10sIF8sIF8sIFtdKSAtLT4gIS4KK2dlbmVyYXRlX2hhc2hfdHJpZXMoW0s6W118TElzXSwgTDAsIE4sIFtLOmZhaWwvMHxMc10pIC0tPiAhLAorCXthc3NlcnRfZmFpbH0sCisJZ2VuZXJhdGVfaGFzaF90cmllcyhMSXMsIEwwLCBOLCBMcykuCitnZW5lcmF0ZV9oYXNoX3RyaWVzKFtLOltJXXxMSXNdLCBMMCwgTiwgW0s6THxMc10pIC0tPiAhLAorCXtJID0gW0x8X119LAorCWdlbmVyYXRlX2hhc2hfdHJpZXMoTElzLCBMMCwgTiwgTHMpLgorZ2VuZXJhdGVfaGFzaF90cmllcyhbSzpJc3xMSXNdLCBMMCwgTiwgW0s6TDArTnxMc10pIC0tPgorCVtMMCtOOiBbXV0sIAorCWdlbmVyYXRlX3RyaWVzKElzKSwKKwl7TjEgaXMgTiArIDF9LAorCWdlbmVyYXRlX2hhc2hfdHJpZXMoTElzLCBMMCwgTjEsIExzKS4KKworZ2VuZXJhdGVfaGFzaF90YWJsZShbXSwgXywgW10pIDotICEuCitnZW5lcmF0ZV9oYXNoX3RhYmxlKFtLfEtzXSwgSXMwLCBbSzpJc3xMSXNdKSA6LQorCXNlbGVjdF9oYXNoKElzMCwgSywgSXMpLAorCWdlbmVyYXRlX2hhc2hfdGFibGUoS3MsIElzMCwgTElzKS4KKworc2VsZWN0X2hhc2goW10sIF8sIFtdKS4KK3NlbGVjdF9oYXNoKFtJfElzMF0sIEssIFtJfElzXSkgOi0KKwlJID0gW18sXyxUYWcsSGFzaF0sCisJKFRhZyA9IHZhciA7IEsgPSBIYXNoKSwKKwkhLAorCXNlbGVjdF9oYXNoKElzMCwgSywgSXMpLgorc2VsZWN0X2hhc2goW198SXMwXSwgSywgSXMpIDotCisJc2VsZWN0X2hhc2goSXMwLCBLLCBJcykuCisKKyUlJSBDaG9pY2UgUG9pbnQgKHRyeSwgcmV0cnksIHRydXN0KQorZ2VuZXJhdGVfdHJpZXMoW0l8SXNdKSAtLT4KKwl7SSA9IFtMfF9dfSwKKwlbdHJ5KEwpXSwKKwlnZW5lcmF0ZV90cmllczEoSXMpLgorCitnZW5lcmF0ZV90cmllczEoW0ldKSAtLT4gISwKKwl7SSA9IFtMfF9dfSwKKwlbdHJ1c3QoTCldLgorZ2VuZXJhdGVfdHJpZXMxKFtJfElzXSkgLS0+CisJe0kgPSBbTHxfXX0sCisJW3JldHJ5KEwpXSwKKwlnZW5lcmF0ZV90cmllczEoSXMpLgorCitnZXRfaW5kaWNlcyhbXSwgXywgXywgW10pLgorZ2V0X2luZGljZXMoW198Q2xhdXNlc10sIEZBLCBOLCBbW0ZBK05dfElzXSkgOi0KKwlGQSA9IF8vMCwKKwkhLAorCU4xIGlzIE4gKyAxLAorCWdldF9pbmRpY2VzKENsYXVzZXMsIEZBLCBOMSwgSXMpLgorZ2V0X2luZGljZXMoW0NsYXVzZXxDbGF1c2VzXSwgRkEsIE4sIFtbRkErTixBMSxUYWcsSGFzaF18SXNdKSA6LQorCUNsYXVzZSA9IChIZWFkIDotIF8pLAorCWFyZygxLCBIZWFkLCBBMSksCisJZ2V0X2hhc2goQTEsIFRhZywgSGFzaCksCisJTjEgaXMgTiArIDEsCisJZ2V0X2luZGljZXMoQ2xhdXNlcywgRkEsIE4xLCBJcykuCisKK2dldF9oYXNoKFgsIHZhciwgMCkgOi0gdmFyKFgpLCAhLgorZ2V0X2hhc2goWCwgaW50LCBYKSA6LSBpbnRlZ2VyKFgpLCAhLgorZ2V0X2hhc2goWCwgZmxvLCBYKSA6LSBmbG9hdChYKSwgIS4KK2dldF9oYXNoKFgsIGNvbiwgWCkgOi0gYXRvbShYKSwgIS4KK2dldF9oYXNoKFgsIGxpcywgJy4nLzIpIDotIFggPSBbX3xfXSwgIS4KK2dldF9oYXNoKFgsIHN0ciwgRi9BKSA6LSBmdW5jdG9yKFgsIEYsIEEpLCAhLgorCithbGxfdmFyaWFibGVfaW5kaWNlcyhbXSkuCithbGxfdmFyaWFibGVfaW5kaWNlcyhbW18sXyx2YXIsX118SXNdKSA6LQorCWFsbF92YXJpYWJsZV9pbmRpY2VzKElzKS4KKworY291bnRfdW5pcXVlX2hhc2goW10sIDAsIFtdKS4KK2NvdW50X3VuaXF1ZV9oYXNoKFtJfElzXSwgQywgSykgOi0KKwljb3VudF91bmlxdWVfaGFzaChJcywgQzAsIEswKSwKKwlJID0gW18sXyxUYWcsSGFzaF0sCisJKChUYWcgPSB2YXIgOyBwbDJhbV9tZW1iZXIoW18sXyxfLEhhc2hdLCBJcykpIC0+CisJICAgIEMgPSBDMCwgSyA9IEswCisJOworCSAgICBDIGlzIEMwICsgMSwgSyA9IFtIYXNofEswXQorCSkuCisKK3NlbGVjdF9pbmRpY2VzKFtdLCBfLCBbXSkuCitzZWxlY3RfaW5kaWNlcyhbSXxJczBdLCBUYWcsIFtJfElzXSkgOi0KKwlJID0gW18sXyxUfF9dLAorCShUYWcgPSB2YXIgOyBUYWcgPSBUIDsgVCA9IHZhciksCisJISwKKwlzZWxlY3RfaW5kaWNlcyhJczAsIFRhZywgSXMpLgorc2VsZWN0X2luZGljZXMoW198SXMwXSwgVGFnLCBJcykgOi0KKwlzZWxlY3RfaW5kaWNlcyhJczAsIFRhZywgSXMpLgorCislJSUgQXNzZXJ0IEZhaWwgRmxhZworYXNzZXJ0X2ZhaWw6LSBjbGF1c2UoZmFpbF9mbGFnLCBfKSwgIS4KK2Fzc2VydF9mYWlsOi0gYXNzZXJ0KGZhaWxfZmxhZykuCisKKyUlJSBHZW5lcmF0ZSBMYWJlbHMgZm9yIEJhY2t0cmFjayBQb2ludAorZ2VuZXJhdGVfYnBfbGFiZWwoW10sIF8sIF8sIFtdLCBbXSkgLS0+ICEuCitnZW5lcmF0ZV9icF9sYWJlbChbWHxYc10sIENMLCBOLCBMcywgW1h8SHNdKSAtLT4gCisJe1ggPSBzd2l0Y2hfb25faGFzaChfLF8sXyxfKX0sCisJISwKKwlbWF0sCisJZ2VuZXJhdGVfYnBfbGFiZWwoWHMsIENMLCBOLCBMcywgSHMpLgorZ2VuZXJhdGVfYnBfbGFiZWwoW3RyeShMKXxYc10sIENMLCBOLCBbbGFiZWwoQ0wrTil8THNdLCBIcykgLS0+ICEsCisJW3RyeShMLCBDTCtOKV0sCisJW0NMK046IFtdXSwKKwl7TjEgaXMgTisxfSwKKwlnZW5lcmF0ZV9icF9sYWJlbChYcywgQ0wsIE4xLCBMcywgSHMpLgorZ2VuZXJhdGVfYnBfbGFiZWwoW3JldHJ5KEwpfFhzXSwgQ0wsIE4sIFtsYWJlbChDTCtOKXxMc10sIEhzKSAtLT4gISwKKwlbcmV0cnkoTCwgQ0wrTildLAorCVtDTCtOOiBbXV0sCisJe04xIGlzIE4rMX0sCisJZ2VuZXJhdGVfYnBfbGFiZWwoWHMsIENMLCBOMSwgTHMsIEhzKS4KK2dlbmVyYXRlX2JwX2xhYmVsKFsoTDpYKXxYc10sIF8sIF8sIFtsYWJlbChMKXxMc10sIEhzKSAtLT4gISwKKwlbTDogW11dLAorCWdlbmVyYXRlX2JwX2xhYmVsKFtYfFhzXSwgTCwgMSwgTHMsIEhzKS4KK2dlbmVyYXRlX2JwX2xhYmVsKFtYfFhzXSwgQ0wsIE4sIExzLCBIcykgLS0+IAorCVtYXSwKKwlnZW5lcmF0ZV9icF9sYWJlbChYcywgQ0wsIE4sIExzLCBIcykuCisKK2dlbmVyYXRlX2NsX2xhYmVsKF8sIEksIE4sIFtdKSA6LSAKKwlJID4gTiwgCisJIS4KK2dlbmVyYXRlX2NsX2xhYmVsKEZBLCBJLCBOLCBbbGFiZWwoRkErSSl8THNdKSA6LSAKKwlJMSBpcyBJKzEsCisJZ2VuZXJhdGVfY2xfbGFiZWwoRkEsIEkxLCBOLCBMcykuCisKKyUlJSBHZW5lcmF0ZSBIYXNoIGluc3RydWN0aW9ucyBmb3Igc3dpdGNoX29uX2hhc2gKK2dlbl9oYXNoKFtdKSAtLT4gIS4KK2dlbl9oYXNoKFtzd2l0Y2hfb25faGFzaChULFMsXyxIKXxYc10pIC0tPiAhLAorCVtuZXdfaGFzaChULFMpXSwKKwlnZW5fcHV0X2hhc2goSCwgVCksCisJZ2VuX2hhc2goWHMpLgorCitnZW5fcHV0X2hhc2goW10sIF8pIC0tPiAhLgorZ2VuX3B1dF9oYXNoKFtLOlZ8WHNdLCBUKSAtLT4KKwlbcHV0X2hhc2goSywgViwgVCldLAorCWdlbl9wdXRfaGFzaChYcywgVCkuCisKK3JlcGxhY2VfaGFzaF9rZXlzKFtdLCBfLCBbXSwgW10pIDotICEuCityZXBsYWNlX2hhc2hfa2V5cyhbcHV0X2hhc2goSyxMLEgpfFhzXSwgU0EsIE5IcywgW3B1dF9oYXNoKFgsTCxIKXxQSHNdKSA6LSAhLAorCXJlcGxhY2Vfa2V5KEssIFNBLCBYKSwKKwlyZXBsYWNlX2hhc2hfa2V5cyhYcywgU0EsIE5IcywgUEhzKS4KK3JlcGxhY2VfaGFzaF9rZXlzKFtYfFhzXSwgU0EsIFtYfE5Ic10sIFBIcykgOi0KKwlyZXBsYWNlX2hhc2hfa2V5cyhYcywgU0EsIE5IcywgUEhzKS4KKworcmVwbGFjZV9rZXkoSywgQWxsb2MsIFgpIDotCisJaW50ZWdlcihLKSwKKwlhbGxvY2F0ZWQoQWxsb2MsIEs6aW50LCBbWCx5ZXNdKSwKKwkhLgorcmVwbGFjZV9rZXkoSywgQWxsb2MsIFgpIDotCisJZmxvYXQoSyksCisJYWxsb2NhdGVkKEFsbG9jLCBLOmZsbywgW1gseWVzXSksCisJIS4KK3JlcGxhY2Vfa2V5KEssIEFsbG9jLCBYKSA6LQorCWF0b20oSyksCisJYWxsb2NhdGVkKEFsbG9jLCBLOmNvbiwgW1gseWVzXSksCisJIS4KK3JlcGxhY2Vfa2V5KEssIEFsbG9jLCBYKSA6LQorCW5vbnZhcihLKSwKKwlLID0gRi9BLAorCWF0b20oRiksCisJaW50ZWdlcihBKSwKKwlhbGxvY2F0ZWQoQWxsb2MsIEs6Y29uLCBbWCx5ZXNdKSwKKwkhLgorcmVwbGFjZV9rZXkoSywgXywgXykgOi0KKwlwbDJhbV9lcnJvcihbcmVwbGFjZW1lbnQsb2YsaGFzaCxrZXksSyxmYWlsZWRdKSwKKwlmYWlsLgorCislJSUgUGFja2FnZSBhbmQgSW1wb3J0IERlY2xhcmF0aW9ucworZ2VuZXJhdGVfcGFja2FnZSAtLT4gCisJe2NsYXVzZShwYWNrYWdlX25hbWUoUCksIF8pfSwgCisJW3BhY2thZ2VfbmFtZShQKV0uCisKK2dlbmVyYXRlX2ltcG9ydCAtLT4gCisJe2ZpbmRhbGwoKFAsQyksIGltcG9ydF9wYWNrYWdlKFAsIEMpLCBYKX0sCisJZ2VuX2ltcG9ydChYKS4KKworZ2VuX2ltcG9ydChbXSkgLS0+ICEuCitnZW5faW1wb3J0KFsoUCwnKicpfFhzXSkgLS0+ICEsIAorCVtpbXBvcnRfcGFja2FnZShQKV0sCisJZ2VuX2ltcG9ydChYcykuCitnZW5faW1wb3J0KFsoUCxDKXxYc10pIC0tPiAKKwlbaW1wb3J0X3BhY2thZ2UoUCwgQyldLAorCWdlbl9pbXBvcnQoWHMpLgorCislJSUgSW5mb3JtYXRpb24KK2dlbmVyYXRlX2luZm8oRnVuY3RvciwgQXJpdHkpIC0tPiAKKwl7Y2xhdXNlKGZpbGVfbmFtZShGaWxlKSwgXyl9LAorCVtpbmZvKFtGdW5jdG9yL0FyaXR5LCBGaWxlXSldLgorCislJSUgQ2hlY2sgdGhlIE1vZGlmaWVyIG9mIFByZWRpY2F0ZSBGL0EuCitjaGVja19tb2RpZmllcignJGluaXQnLzAsIHB1YmxpYykgOi0gIS4KK2NoZWNrX21vZGlmaWVyKEYvQSwgcHVibGljKSA6LQorCWNsYXVzZShwdWJsaWNfcHJlZGljYXRlcyhGLCBBKSwgXyksCisJIS4KK2NoZWNrX21vZGlmaWVyKF8sIG5vbi1wdWJsaWMpLgorCislJSUgZ2VuZXJhdGUgYSBsaXN0IG9mIHJlZ2lzdGVycyB3aXRoIGdpdmVuIHJhbmdlLgorcmFuZ2VfcmVnKEksIE4sIF8sIFtdKSA6LSBJID4gTiwgIS4KK3JhbmdlX3JlZyhJLCBOLCBBLCBbUnxSc10pIDotIAorCUkgPTwgTiwgCisJSTEgaXMgSSsxLCAKKwlSID0uLiBbQSwgSV0sCisJcmFuZ2VfcmVnKEkxLCBOLCBBLCBScykuCisKKyUlJSBnZW5lcmF0ZSBzZXQgaW5zdHJ1Y3Rpb25zCitnZW5fc2V0KFtdLCBbXSkgLS0+ICEuCitnZW5fc2V0KFtYfFhzXSwgW1l8WXNdKSAtLT4gW3NldChYLCBZKV0sIGdlbl9zZXQoWHMsIFlzKS4KKworJSUlIGdlbmVyYXRlIGRlcmVmIGluc3RydWN0aW9ucworZ2VuX2RlcmVmKFtdLCBbXSkgLS0+ICEuCitnZW5fZGVyZWYoW1h8WHNdLCBbWXxZc10pIC0tPiBbZGVyZWYoWCwgWSldLCBnZW5fZGVyZWYoWHMsIFlzKS4KKworJSUlIGdlbmVyYXRlIHNldCBhbmQgZGVyZWYgaW5zdHJ1Y3Rpb25zCitzZXRfYXJndW1lbnRzKFNOLCBFTiwgUjEsIFIyLCBGbGFnKSAtLT4KKwl7cmFuZ2VfcmVnKFNOLCBFTiwgUjEsIEwxKX0sCisJe3JhbmdlX3JlZyhTTiwgRU4sIFIyLCBMMil9LAorCWdlbl9zZXRfYXJnKEZsYWcsIEwxLCBMMikuCisKK2dlbl9zZXRfYXJnKHNldCwgTDEsIEwyKSAtLT4gZ2VuX3NldChMMSwgTDIpLgorZ2VuX3NldF9hcmcoZGVyZWYsIEwxLCBMMikgLS0+IGdlbl9kZXJlZihMMSwgTDIpLgorCislJSUgZ2VuZXJhdGUgZGVjbF92YXIgaW5zdHJ1Y3Rpb25zCitnZW5lcmF0ZV92YXJfZGVjbChbWDAsUDBdLCBbWE4sUE5dKSAtLT4KKwl7WDEgaXMgWE4tMSwgUDEgaXMgUE4tMX0sCisJe3JhbmdlX3JlZyhYMCwgWDEsIGEsIFhMKX0sCisJe3JhbmdlX3JlZyhQMCwgUDEsIHAsIFBMKX0sCisJZ2VuX2RlY2xfdGVybV92YXJzKFhMKSwKKwlnZW5fZGVjbF9wcmVkX3ZhcnMoUEwpLgorCitnZW5fZGVjbF90ZXJtX3ZhcnMoW10pIC0tPiAhLgorZ2VuX2RlY2xfdGVybV92YXJzKFhMKSAtLT4gW2RlY2xfdGVybV92YXJzKFhMKV0uCisKK2dlbl9kZWNsX3ByZWRfdmFycyhbXSkgLS0+ICEuCitnZW5fZGVjbF9wcmVkX3ZhcnMoUEwpIC0tPiBbZGVjbF9wcmVkX3ZhcnMoUEwpXS4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgQ29tcGlsZSBDbGF1c2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb21waWxlX2NsYXVzZSgoSGVhZCA6LSBCb2R5KSwgR1RJMCwgR1RJLCBMVEkpIC0tPiAKKwl7cHJldHJlYXRfYm9keShCb2R5LCBHb2FsczApfSwgICAgICUgY3V0LCByZW5hbWUsIGNvbXBpbGUgYWl0aCBleHAuCisJe2xvY2FsaXplX21ldGEoR29hbHMwLCBHb2Fscyl9LCAgICAlIGFkZCBwYWNrYWdlIG5hbWUgZm9yIG1ldGEgcHJlZGljYXRlcworCXtwcmVjb21waWxlKEhlYWQsIEdvYWxzLCBJbnN0cnMpfSwgJSBnZW5lcmF0ZSBnZXQsIHB1dCwgcHV0X2NsbywgcHV0X2NvbnQsIGlubGluZQorCVtjb21tZW50KChIZWFkIDotIEdvYWxzKSldLCAgICAgICAgJSBvdXRwdXQgcHJlY29tcGlsZWQgY2xhdXNlCisJY29tcGlsZV9jaHVua3MoSW5zdHJzLCBHVEkwLCBHVEksIExUSSksCisJIS4KK2NvbXBpbGVfY2xhdXNlKENsYXVzZSwgXywgXywgXykgLS0+CisJe3BsMmFtX2Vycm9yKFtjb21waWxhdGlvbixvZixDbGF1c2UsZmFpbGVkXSl9LCAKKwl7ZmFpbH0uCisKKyUlJSUlJSUlJSUgUHJldHJlYXQgQm9keSBhbmQgQ29tcGlsZSBBcml0aG1ldGljIEV4cHJlc3Npb25zCitwcmV0cmVhdF9ib2R5KEJvZHksIEdvYWxzKSA6LSAKKwlwcmV0cmVhdF9ib2R5MChCb2R5LCBDdXQsIEdvYWxzMCwgW10pLAorCXByZXRyZWF0X2N1dChDdXQsIEdvYWxzMCwgR29hbHMpLgorCitwcmV0cmVhdF9jdXQoQ3V0LCBHcywgR3MpIDotIHZhcihDdXQpLCAhLgorcHJldHJlYXRfY3V0KCckY3V0JyhMZXZlbCksIFsnJGN1dCcoTGV2ZWwpfEdzXSwgWyckbmVja19jdXQnfEdzXSkgOi0gIS4KK3ByZXRyZWF0X2N1dCgnJGN1dCcoTGV2ZWwpLCBHcywgWyckZ2V0X2xldmVsJyhMZXZlbCl8R3NdKS4KKworcHJldHJlYXRfYm9keTAoRywgXykgLS0+IHt2YXIoRyl9LCAhLCBbY2FsbChHKV0uCitwcmV0cmVhdF9ib2R5MCghLCBDdXQpIC0tPiAhLCB7Q3V0ID0gJyRjdXQnKExldmVsKX0sIFsnJGN1dCcoTGV2ZWwpXS4KK3ByZXRyZWF0X2JvZHkwKG90aGVyd2lzZSwgXykgLS0+ICEuCitwcmV0cmVhdF9ib2R5MCh0cnVlLCBfKSAgLS0+ICEuCitwcmV0cmVhdF9ib2R5MChmYWlsLCBfKSAgLS0+ICEsIFtmYWlsXS4KK3ByZXRyZWF0X2JvZHkwKGZhbHNlLCBfKSAtLT4gISwgW2ZhaWxdLgorcHJldHJlYXRfYm9keTAoaGFsdCwgXykgIC0tPiAhLCBbaGFsdF0uCitwcmV0cmVhdF9ib2R5MChhYm9ydCwgXykgLS0+ICEsIFthYm9ydF0uCitwcmV0cmVhdF9ib2R5MCgoRzEsRzIpLCBDdXQpIC0tPiAhLCBwcmV0cmVhdF9ib2R5MChHMSwgQ3V0KSwgcHJldHJlYXRfYm9keTAoRzIsIEN1dCkuCitwcmV0cmVhdF9ib2R5MChHLCBfKSAtLT4gcHJldHJlYXRfYnVpbHRpbihHKSwgIS4KK3ByZXRyZWF0X2JvZHkwKEcsIF8pIC0tPiB7ZnVuY3RvcihHLCBGLCBBKSwgY2xhdXNlKGR5bmFtaWNfcHJlZGljYXRlcyhGLCBBKSwgXyl9LCAhLCBbY2FsbChHKV0uCitwcmV0cmVhdF9ib2R5MChHLCBfKSAtLT4gW0ddLgorCislJSUgcmVuYW1lIGJ1aWx0aW5zCitwcmV0cmVhdF9idWlsdGluKFggPSBZKSAgICAtLT4gISwgWyckdW5pZnknKFgsIFkpXS4KK3ByZXRyZWF0X2J1aWx0aW4oWCBcPSBZKSAgICAtLT4gISwgWyckbm90X3VuaWZpYWJsZScoWCwgWSldLgorcHJldHJlYXRfYnVpbHRpbihYID09IFkpICAgLS0+ICEsIFsnJGVxdWFsaXR5X29mX3Rlcm0nKFgsIFkpXS4KK3ByZXRyZWF0X2J1aWx0aW4oWCBcPT0gWSkgIC0tPiAhLCBbJyRpbmVxdWFsaXR5X29mX3Rlcm0nKFgsIFkpXS4KK3ByZXRyZWF0X2J1aWx0aW4oPz0oWCwgWSkpIC0tPiAhLCBbJyRpZGVudGljYWxfb3JfY2Fubm90X3VuaWZ5JyhYLCBZKV0uCitwcmV0cmVhdF9idWlsdGluKFggQDwgWSkgICAtLT4gISwgWyckYmVmb3JlJyhYLCBZKV0uCitwcmV0cmVhdF9idWlsdGluKFggQD4gWSkgICAtLT4gISwgWyckYWZ0ZXInKFgsIFkpXS4KK3ByZXRyZWF0X2J1aWx0aW4oWCBAPTwgWSkgIC0tPiAhLCBbJyRub3RfYWZ0ZXInKFgsIFkpXS4KK3ByZXRyZWF0X2J1aWx0aW4oWCBAPj0gWSkgIC0tPiAhLCBbJyRub3RfYmVmb3JlJyhYLCBZKV0uCitwcmV0cmVhdF9idWlsdGluKGNvbXBhcmUoT3AsWCxZKSkgLS0+IHtPcCA9PSAoPSl9LCAhLCBbJyRlcXVhbGl0eV9vZl90ZXJtJyhYLCBZKV0uCitwcmV0cmVhdF9idWlsdGluKGNvbXBhcmUoT3AsWCxZKSkgLS0+IHtPcCA9PSAoPCl9LCAhLCBbJyRiZWZvcmUnKFgsIFkpXS4KK3ByZXRyZWF0X2J1aWx0aW4oY29tcGFyZShPcCxYLFkpKSAtLT4ge09wID09ICg+KX0sICEsIFsnJGFmdGVyJyhYLCBZKV0uCitwcmV0cmVhdF9idWlsdGluKFggPS4uIFkpICAtLT4gISwgWyckdW5pdicoWCwgWSldLgorcHJldHJlYXRfYnVpbHRpbihYID06PSBZKSAgLS0+ICEsIHByZXRyZWF0X2lzKFUsIFgpLCBwcmV0cmVhdF9pcyhWLCBZKSwgWyckYXJpdGhfZXF1YWwnKFUsIFYpXS4KK3ByZXRyZWF0X2J1aWx0aW4oWCA9XD0gWSkgIC0tPiAhLCBwcmV0cmVhdF9pcyhVLCBYKSwgcHJldHJlYXRfaXMoViwgWSksIFsnJGFyaXRoX25vdF9lcXVhbCcoVSwgVildLgorcHJldHJlYXRfYnVpbHRpbihYID4gWSkgICAgLS0+ICEsIHByZXRyZWF0X2lzKFUsIFgpLCBwcmV0cmVhdF9pcyhWLCBZKSwgWyckZ3JlYXRlcl90aGFuJyhVLCBWKV0uCitwcmV0cmVhdF9idWlsdGluKFggPj0gWSkgICAtLT4gISwgcHJldHJlYXRfaXMoVSwgWCksIHByZXRyZWF0X2lzKFYsIFkpLCBbJyRncmVhdGVyX29yX2VxdWFsJyhVLCBWKV0uCitwcmV0cmVhdF9idWlsdGluKFggPCBZKSAgICAtLT4gISwgcHJldHJlYXRfaXMoVSwgWCksIHByZXRyZWF0X2lzKFYsIFkpLCBbJyRsZXNzX3RoYW4nKFUsIFYpXS4KK3ByZXRyZWF0X2J1aWx0aW4oWCA9PCBZKSAgIC0tPiAhLCBwcmV0cmVhdF9pcyhVLCBYKSwgcHJldHJlYXRfaXMoViwgWSksIFsnJGxlc3Nfb3JfZXF1YWwnKFUsIFYpXS4KK3ByZXRyZWF0X2J1aWx0aW4oWiBpcyBYKSAgIC0tPiAhLCBwcmV0cmVhdF9pczAoWiwgWCkuCisKK3ByZXRyZWF0X2lzKFosIFgpIC0tPiB7dmFyKFgpfSwgISwge1ggPSBafS4KK3ByZXRyZWF0X2lzKFosIFgpIC0tPiBwcmV0cmVhdF9pczAoWiwgWCkuCisKK3ByZXRyZWF0X2lzMChaLCBYKSAtLT4ge2NsYXVzZShwbDJhbV9mbGFnKGFjKSwgXyl9LCAhLCBwcmVjb21waWxlX2lzKFgsIFopLgorcHJldHJlYXRfaXMwKFosIFgpIC0tPiBbaXMoWiwgWCldLgorCislJSUgY29tcGlsZSBhaXRobWV0aWMgZXhwcmVzc2lvbnMKK3ByZWNvbXBpbGVfaXMoWCwgQSkgLS0+IHt2YXIoWCl9LCAhLCBbaXMoQSwgWCldLgorcHJlY29tcGlsZV9pcyhYLCBBKSAtLT4ge251bWJlcihYKX0sICEsIHtYID0gQX0uCitwcmVjb21waWxlX2lzKFgsIEEpIC0tPiB7YnVpbHRpbl9hcml0aF9jb25zdGFudChYKX0sICEsIHtYID0gQX0uCitwcmVjb21waWxlX2lzKCsoWCksIEEpIC0tPiAhLCBwcmVjb21wX2lzKFgsIEEpLgorcHJlY29tcGlsZV9pcygtKFgpLCBBKSAtLT4gISwgcHJlY29tcGlsZV9pcygtMSpYLCBBKS4KK3ByZWNvbXBpbGVfaXMoWCtZLCAgQSkgLS0+ICEsIHByZWNvbXBfaXMoWCwgVSksIHByZWNvbXBfaXMoWSwgViksIFsnJHBsdXMnKFUsIFYsIEEpXS4KK3ByZWNvbXBpbGVfaXMoWC1ZLCAgQSkgLS0+ICEsIHByZWNvbXBfaXMoWCwgVSksIHByZWNvbXBfaXMoWSwgViksIFsnJG1pbnVzJyhVLCBWLCBBKV0uCitwcmVjb21waWxlX2lzKFgqWSwgIEEpIC0tPiAhLCBwcmVjb21wX2lzKFgsIFUpLCBwcmVjb21wX2lzKFksIFYpLCBbJyRtdWx0aScoVSwgViwgQSldLgorcHJlY29tcGlsZV9pcyhYL1ksICBBKSAtLT4gISwgcHJlY29tcF9pcyhYLCBVKSwgcHJlY29tcF9pcyhZLCBWKSwgWyckZmxvYXRfcXVvdGllbnQnKFUsIFYsIEEpXS4KK3ByZWNvbXBpbGVfaXMoWC8vWSwgQSkgLS0+ICEsIHByZWNvbXBfaXMoWCwgVSksIHByZWNvbXBfaXMoWSwgViksIFsnJGludF9xdW90aWVudCcoVSwgViwgQSldLgorcHJlY29tcGlsZV9pcyhYIG1vZCBZLCBBKSAtLT4gISwgcHJlY29tcF9pcyhYLCBVKSwgcHJlY29tcF9pcyhZLCBWKSwgWyckbW9kJyhVLCBWLCBBKV0uCitwcmVjb21waWxlX2lzKFggcmVtIFksIEEpIC0tPiAhLCBwcmVjb21wX2lzKFgsIFUpLCBwcmVjb21wX2lzKFksIFYpLCBbJyRtb2QnKFUsIFYsIEEpXS4KK3ByZWNvbXBpbGVfaXMoWC9cWSwgQSkgLS0+ICEsIHByZWNvbXBfaXMoWCwgVSksIHByZWNvbXBfaXMoWSwgViksIFsnJGJpdHdpc2VfY29uaicoVSwgViwgQSldLgorcHJlY29tcGlsZV9pcyhYXC9ZLCBBKSAtLT4gISwgcHJlY29tcF9pcyhYLCBVKSwgcHJlY29tcF9pcyhZLCBWKSwgWyckYml0d2lzZV9kaXNqJyhVLCBWLCBBKV0uCitwcmVjb21waWxlX2lzKFgjWSwgIEEpIC0tPiAhLCBwcmVjb21wX2lzKFgsIFUpLCBwcmVjb21wX2lzKFksIFYpLCBbJyRiaXR3aXNlX2V4Y2x1c2l2ZV9vcicoVSwgViwgQSldLgorcHJlY29tcGlsZV9pcyhcKFgpLCBBKSAtLT4gISwgcHJlY29tcF9pcyhYLCBVKSwgWyckYml0d2lzZV9uZWcnKFUsIEEpXS4KK3ByZWNvbXBpbGVfaXMoWDw8WSwgQSkgLS0+ICEsIHByZWNvbXBfaXMoWCwgVSksIHByZWNvbXBfaXMoWSwgViksIFsnJHNoaWZ0X2xlZnQnKFUsIFYsIEEpXS4KK3ByZWNvbXBpbGVfaXMoWD4+WSwgQSkgLS0+ICEsIHByZWNvbXBfaXMoWCwgVSksIHByZWNvbXBfaXMoWSwgViksIFsnJHNoaWZ0X3JpZ2h0JyhVLCBWLCBBKV0uCitwcmVjb21waWxlX2lzKFtYXSwgIEEpIC0tPiAhLCBwcmVjb21wX2lzKFgsIEEpLgorcHJlY29tcGlsZV9pcyhhYnMoWCksICAgICBBKSAtLT4gISwgcHJlY29tcF9pcyhYLCBVKSwgWyckYWJzJyhVLCBBKV0uCitwcmVjb21waWxlX2lzKG1pbihYLFkpLCAgIEEpIC0tPiAhLCBwcmVjb21wX2lzKFgsIFUpLCBwcmVjb21wX2lzKFksIFYpLCBbJyRtaW4nKFUsIFYsIEEpXS4KK3ByZWNvbXBpbGVfaXMobWF4KFgsWSksICAgQSkgLS0+ICEsIHByZWNvbXBfaXMoWCwgVSksIHByZWNvbXBfaXMoWSwgViksIFsnJG1heCcoVSwgViwgQSldLgorcHJlY29tcGlsZV9pcyhyb3VuZChYKSwgICBBKSAtLT4gISwgcHJlY29tcF9pcyhYLCBVKSwgWyckcm91bmQnKFUsIEEpXS4KK3ByZWNvbXBpbGVfaXMoZmxvb3IoWCksICAgQSkgLS0+ICEsIHByZWNvbXBfaXMoWCwgVSksIFsnJGZsb29yJyhVLCBBKV0uCitwcmVjb21waWxlX2lzKGNlaWxpbmcoWCksICAgIEEpIC0tPiAhLCBwcmVjb21wX2lzKFgsIFUpLCBbJyRjZWlsJyhVLCBBKV0uCitwcmVjb21waWxlX2lzKHNpbihYKSwgICAgIEEpIC0tPiAhLCBwcmVjb21wX2lzKFgsIFUpLCBbJyRzaW4nKFUsIEEpXS4KK3ByZWNvbXBpbGVfaXMoY29zKFgpLCAgICAgQSkgLS0+ICEsIHByZWNvbXBfaXMoWCwgVSksIFsnJGNvcycoVSwgQSldLgorcHJlY29tcGlsZV9pcyh0YW4oWCksICAgICBBKSAtLT4gISwgcHJlY29tcF9pcyhYLCBVKSwgWyckdGFuJyhVLCBBKV0uCitwcmVjb21waWxlX2lzKGFzaW4oWCksICAgIEEpIC0tPiAhLCBwcmVjb21wX2lzKFgsIFUpLCBbJyRhc2luJyhVLCBBKV0uCitwcmVjb21waWxlX2lzKGFjb3MoWCksICAgIEEpIC0tPiAhLCBwcmVjb21wX2lzKFgsIFUpLCBbJyRhY29zJyhVLCBBKV0uCitwcmVjb21waWxlX2lzKGF0YW4oWCksICAgIEEpIC0tPiAhLCBwcmVjb21wX2lzKFgsIFUpLCBbJyRhdGFuJyhVLCBBKV0uCitwcmVjb21waWxlX2lzKHNxcnQoWCksICAgIEEpIC0tPiAhLCBwcmVjb21wX2lzKFgsIFUpLCBbJyRzcXJ0JyhVLCBBKV0uCitwcmVjb21waWxlX2lzKGxvZyhYKSwgICAgIEEpIC0tPiAhLCBwcmVjb21wX2lzKFgsIFUpLCBbJyRsb2cnKFUsIEEpXS4KK3ByZWNvbXBpbGVfaXMoZXhwKFgpLCAgICAgQSkgLS0+ICEsIHByZWNvbXBfaXMoWCwgVSksIFsnJGV4cCcoVSwgQSldLgorcHJlY29tcGlsZV9pcyhYKipZLCAgIEEpIC0tPiAhLCBwcmVjb21wX2lzKFgsIFUpLCBwcmVjb21wX2lzKFksIFYpLCBbJyRwb3cnKFUsIFYsIEEpXS4KK3ByZWNvbXBpbGVfaXMoZGVncmVlcyhYKSwgQSkgLS0+ICEsIHByZWNvbXBfaXMoWCwgVSksIFsnJGRlZ3JlZXMnKFUsIEEpXS4KK3ByZWNvbXBpbGVfaXMocmFkaWFucyhYKSwgQSkgLS0+ICEsIHByZWNvbXBfaXMoWCwgVSksIFsnJHJhZGlhbnMnKFUsIEEpXS4KK3ByZWNvbXBpbGVfaXMocmludChYKSwgICAgQSkgLS0+ICEsIHByZWNvbXBfaXMoWCwgVSksIFsnJHJpbnQnKFUsIEEpXS4KK3ByZWNvbXBpbGVfaXMoZmxvYXQoWCksICAgQSkgLS0+ICEsIHByZWNvbXBfaXMoWCwgVSksIFsnJGZsb2F0JyhVLCBBKV0uCitwcmVjb21waWxlX2lzKGZsb2F0X2ludGVnZXJfcGFydChYKSwgICAgQSkgLS0+ICEsIHByZWNvbXBfaXMoWCwgVSksIFsnJGZsb2F0X2ludGVnZXJfcGFydCcoVSwgQSldLgorcHJlY29tcGlsZV9pcyhmbG9hdF9mcmFjdGlvbmFsX3BhcnQoWCksIEEpIC0tPiAhLCBwcmVjb21wX2lzKFgsIFUpLCBbJyRmbG9hdF9mcmFjdGlvbmFsX3BhcnQnKFUsIEEpXS4KK3ByZWNvbXBpbGVfaXModHJ1bmNhdGUoWCksQSkgLS0+ICEsIHByZWNvbXBfaXMoWCwgVSksIFsnJHRydW5jYXRlJyhVLCBBKV0uCitwcmVjb21waWxlX2lzKHNpZ24oWCksICAgIEEpIC0tPiAhLCBwcmVjb21wX2lzKFgsIFUpLCBbJyRzaWduJyhVLCBBKV0uCitwcmVjb21waWxlX2lzKFgsIF8pIC0tPgorCXtwbDJhbV9lcnJvcihbdW5rbm93bixhcml0aGVtZXRpYyxleHByZXNzaW9uLFhdKX0sCisJe2ZhaWx9LgorCitwcmVjb21wX2lzKFgsIEEpIC0tPiB7dmFyKFgpfSwge3ZhcihBKX0sICEsIHtYID0gQX0uCitwcmVjb21wX2lzKFgsIEEpIC0tPiBwcmVjb21waWxlX2lzKFgsIEEpLgorCislJSUlJSUlJSUlIEFkZCBQYWNha2dlIChtb2R1bGUpIG5hbWUgdG8gbWV0YSBwcmVkaWNhdGVzCitsb2NhbGl6ZV9tZXRhKEcwLCBHKSA6LQorCWNsYXVzZShwYWNrYWdlX25hbWUoUCksIF8pLAorCWxvY2FsaXplX21ldGEoRzAsIFAsIEcpLAorCSEuCisKK2xvY2FsaXplX21ldGEoW10sIF8sIFtdKSA6LSAhLgorbG9jYWxpemVfbWV0YShbR3xHc10sIFAsIFtHMXxHczFdKSA6LQorCWxvY2FsaXplX21ldGFfZ29hbChHLCBQLCBYKSwKKwkoWCA9IFA6WSAtPiBHMSA9IFkgOyBHMSA9IFgpLAorCWxvY2FsaXplX21ldGEoR3MsIFAsIEdzMSkuCisKK2xvY2FsaXplX21ldGFfZ29hbChHLCBQLCBHMSkgOi0gdmFyKEcpLCAhLAorCWxvY2FsaXplX21ldGFfZ29hbChjYWxsKEcpLCBQLCBHMSkuCitsb2NhbGl6ZV9tZXRhX2dvYWwoUDpHLCBfLCBHMSkgOi0gISwKKwlsb2NhbGl6ZV9tZXRhX2dvYWwoRywgUCwgRzEpLgorbG9jYWxpemVfbWV0YV9nb2FsKChYLFkpLCBQLCAoWDEsWTEpKSA6LSAhLAorCWxvY2FsaXplX21ldGFfZ29hbChYLCBQLCBYMSksCisJbG9jYWxpemVfbWV0YV9nb2FsKFksIFAsIFkxKS4KK2xvY2FsaXplX21ldGFfZ29hbCgoWC0+WSksIFAsIChYMS0+WTEpKSA6LSAhLAorCWxvY2FsaXplX21ldGFfZ29hbChYLCBQLCBYMSksCisJbG9jYWxpemVfbWV0YV9nb2FsKFksIFAsIFkxKS4KK2xvY2FsaXplX21ldGFfZ29hbCgoWDtZKSwgUCwgKFgxO1kxKSkgOi0gISwKKwlsb2NhbGl6ZV9tZXRhX2dvYWwoWCwgUCwgWDEpLAorCWxvY2FsaXplX21ldGFfZ29hbChZLCBQLCBZMSkuCQorbG9jYWxpemVfbWV0YV9nb2FsKEcsIFAsIEcxKSA6LQorCWZ1bmN0b3IoRywgRiwgQSksCisJKGNsYXVzZShtZXRhX3ByZWRpY2F0ZXMoRiwgQSwgTSksIF8pIDsgYnVpbHRpbl9sb2NhbF9wcmVkaWNhdGVzKEYsIEEsIE0pKSwKKwkhLAorCUcgID0uLiBbRnxBc10sCisJbG9jYWxpemVfbWV0YV9hcmdzKE0sIEFzLCBQLCBBczEpLAorCUcxID0uLiBbRnxBczFdLgorbG9jYWxpemVfbWV0YV9nb2FsKEcsIFAsIGNhbGwoUDpHKSkgOi0gdmFyKFApLCAhLgorbG9jYWxpemVfbWV0YV9nb2FsKEcsIF8sIEcpIDotIHN5c3RlbV9wcmVkaWNhdGUoRyksICEuCitsb2NhbGl6ZV9tZXRhX2dvYWwoRywgUCwgUDpHKS4KKworbG9jYWxpemVfbWV0YV9hcmdzKFtdLCBbXSwgXywgW10pIDotICEuCitsb2NhbGl6ZV9tZXRhX2FyZ3MoWzp8TXNdLCBbQXxBc10sIFAsIFtQOkF8QXMxXSkgOi0KKwkodmFyKEEpIDsgQSBcPSBfOl8pLAorCSEsCisJbG9jYWxpemVfbWV0YV9hcmdzKE1zLCBBcywgUCwgQXMxKS4KK2xvY2FsaXplX21ldGFfYXJncyhbX3xNc10sIFtBfEFzXSwgUCwgW0F8QXMxXSkgOi0KKwlsb2NhbGl6ZV9tZXRhX2FyZ3MoTXMsIEFzLCBQLCBBczEpLgorCislJSUlJSUlJSUlIFByZWNvbXBpbGUgQ2xhdXNlIGFuZCBPcHRpbWl6ZSBSZWN1cnNpdmUgQ2FsbAorcHJlY29tcGlsZShIZWFkLCBHb2FscywgSW5zdHJzKSA6LQorCXByZWNvbXBpbGVfaGVhZChIZWFkLCBJbnN0cnMwLCBCcyksCisJcHJlY29tcGlsZV9ib2R5KEdvYWxzLCBCcywgW10pLAorCW9wdGltaXplX3JlY3Vyc2l2ZV9jYWxsKEhlYWQsIEluc3RyczAsIEluc3RycykuCisKKyUlJSBQcmVjb21waWxlIGhlYWQgKGdlbmVyYXRlcyBnZXQgaW5zdHJ1Y3Rpb25zKQorcHJlY29tcGlsZV9oZWFkKEhlYWQpIC0tPgorCXtIZWFkID0uLiBbX3xBcmdzXX0sCisJcHJlY29tcF9oZWFkKEFyZ3MsIDEpLgorCitwcmVjb21wX2hlYWQoW10sIF8pIC0tPiAhLgorcHJlY29tcF9oZWFkKFtBfEFzXSwgSSkgLS0+CisJW2dldChBLCBhKEkpKV0sCisJe0kxIGlzIEkgKyAxfSwKKwlwcmVjb21wX2hlYWQoQXMsIEkxKS4KKworJSUlIFByZWNvbXBpbGUgYm9keQorJSUlIChnZW5lcmF0ZXMgcHV0LCBwdXRfY2xvLCBwdXRfY29udCwgYW5kIGlubGluZSBpbnN0cnVjdGlvbnMpCitwcmVjb21waWxlX2JvZHkoR29hbHMpIC0tPgorCXtjbGF1c2UocGwyYW1fZmxhZyhpZSksIF8pfSwKKwkhLAorCXtwaWNrdXBfaW5saW5lX2dvYWxzKEdvYWxzLCBJR3MsIEdzKX0sCisJcHJlY29tcF9pbmxpbmUoSUdzLCBHcykuCitwcmVjb21waWxlX2JvZHkoR29hbHMpIC0tPgorCXByZWNvbXBfYm9keShHb2FscykuCisKK3ByZWNvbXBfYm9keShbXSkgLS0+ICEsIFtleGVjdXRlKGNvbnQpXS4KK3ByZWNvbXBfYm9keShbJyRJTlNFUlRfQU0nKENvZGUpfF9dKSAtLT4gISwgCisJe3BsMmFtX2Vycm9yKFtpbnZhbGlkLGluc3RydWN0aW9uLCckSU5TRVJUX0FNJyhDb2RlKV0pfSwKKwl7ZmFpbH0uCitwcmVjb21wX2JvZHkoWyckSU5TRVJUJyhDb2RlKXxfXSkgLS0+ICEsIAorCXtwbDJhbV9lcnJvcihbaW52YWxpZCxpbnN0cnVjdGlvbiwnJElOU0VSVCcoQ29kZSldKX0sCisJe2ZhaWx9LgorcHJlY29tcF9ib2R5KFtNOkd8Q29udF0pIC0tPiAhLCAKKwliaW5hcml6ZV9ib2R5KEcsIENvbnQsIEcxKSwgCisJW2V4ZWN1dGUoTTpHMSldLgorcHJlY29tcF9ib2R5KFtHfENvbnRdKSAtLT4KKwliaW5hcml6ZV9ib2R5KEcsIENvbnQsIEcxKSwgCisJW2V4ZWN1dGUoRzEpXS4KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBCaW5hcml6YXRpb24gdGVjaG5pcXVlIHdhcyBkZXZlbG9wZWQgYnkgUC5UYXJhdSBhbmQgTS5Cb3llciwKKyBwbGVhc2Ugc2VlOgorICAgKiAiRWxlbWVudGFyeSBMb2dpYyBQcm9ncmFtcyIKKyAgICAgUC5UYXJhdSBhbmQgTS5Cb3llcgorICAgICBQcm9ncmFtbWluZyBMYW5ndWFnZSBJbXBsZW1lbnRhdGlvbiBhbmQgTG9naWMgUHJvZ3JhbW1pbmcsCisgICAgIHBwLjE1OS0tMTczLCBMTkNTIDQ1NiwgU3ByaW5nZXIgVmVybGFnLCAxOTkwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2JpbmFyaXplX2JvZHkoRywgQ29udCwgRzEpIC0tPgorCXtHICA9Li4gW0Z8QXJnc119LAorCXtmdW5jdG9yKEcsIEYsIEEpfSwKKwlwcmVjb21wX2NhbGwoQXJncywgVXMsIEYsIEEpLAorCSVwcmVjb21wX2NhbGwoQXJncywgVXMpLCAlIGZvciBubyBjbG9zdXJlCisJcHJlY29tcF9jb250KENvbnQsIFYpLAorCXtwbDJhbV9hcHBlbmQoVXMsIFtWXSwgV3MpfSwKKwl7RzEgPS4uIFtGfFdzXX0uCisKK3ByZWNvbXBfY2FsbChbXSwgW10pIC0tPiAhLgorcHJlY29tcF9jYWxsKFtBfEFzXSwgW1V8VXNdKSAtLT4KKwlbcHV0KEEsIFUpXSwKKwlwcmVjb21wX2NhbGwoQXMsIFVzKS4KKworcHJlY29tcF9jb250KFtdLCBjb250KSAtLT4gIS4KK3ByZWNvbXBfY29udChbTTpHfENvbnRdLCBWKSAtLT4gISwKKwliaW5hcml6ZV9ib2R5KEcsIENvbnQsIEcxKSwKKwlbcHV0X2NvbnQoTTpHMSwgVildLgorcHJlY29tcF9jb250KFtHfENvbnRdLCBWKSAtLT4KKwliaW5hcml6ZV9ib2R5KEcsIENvbnQsIEcxKSwKKwlbcHV0X2NvbnQoRzEsIFYpXS4KKworcHJlY29tcF9pbmxpbmUoW10sIEdzMSkgLS0+ICEsIHByZWNvbXBfYm9keShHczEpLgorcHJlY29tcF9pbmxpbmUoW2ZhaWx8X10sIF8pIC0tPiAhLCBbaW5saW5lKGZhaWwpXS4KK3ByZWNvbXBfaW5saW5lKFsnJElOU0VSVF9BTScoQ29kZSl8R3NdLCBHczEpIC0tPiAhLCAKKwlbQ29kZV0sIHByZWNvbXBfaW5saW5lKEdzLCBHczEpLgorcHJlY29tcF9pbmxpbmUoWyckSU5TRVJUJyhDb2RlKXxHc10sIEdzMSkgLS0+ICEsIAorCVsnJElOU0VSVCcoQ29kZSldLCBwcmVjb21wX2lubGluZShHcywgR3MxKS4KK3ByZWNvbXBfaW5saW5lKFtHfEdzXSwgR3MxKSAtLT4gCisJe0cgID0uLiBbRnxBcmdzXX0sCisJe2Z1bmN0b3IoRywgRiwgQSl9LAorCXByZWNvbXBfY2FsbChBcmdzLCBVcywgRiwgQSksCisJJXByZWNvbXBfY2FsbChBcmdzLCBVcyksCisJe0cxID0uLiBbRnxVc119LAorCVtpbmxpbmUoRzEpXSwKKwlwcmVjb21wX2lubGluZShHcywgR3MxKS4KKworcGlja3VwX2lubGluZV9nb2FscyhbXSwgW10sIFtdKSA6LSAhLgorcGlja3VwX2lubGluZV9nb2FscyhbR3xHc10sIFtHfElHc10sIEJHcykgOi0KKwlidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKEcpLAorCSEsCisJcGlja3VwX2lubGluZV9nb2FscyhHcywgSUdzLCBCR3MpLgorcGlja3VwX2lubGluZV9nb2FscyhHcywgW10sIEdzKS4KKworJSUlIEdlbmVyYXRlIENsb3N1cmUKK3ByZWNvbXBfY2FsbChBcywgVXMsIEZ1bmN0b3IsIEFyaXR5KSAtLT4gCisJe2NsYXVzZShwbDJhbV9mbGFnKGNsbyksIF8pfSwKKwl7Y2xhdXNlKG1ldGFfcHJlZGljYXRlcyhGdW5jdG9yLCBBcml0eSwgTW9kZSksIF8pfSwKKwkhLAorCXtjbGF1c2UocGFja2FnZV9uYW1lKFApLCBfKX0sCisJcHJlY29tcF9jbG9zdXJlKE1vZGUsIEFzLCBQLCBVcykuCitwcmVjb21wX2NhbGwoQXMsIFVzLCBfLCBfKSAtLT4gcHJlY29tcF9jYWxsKEFzLCBVcykuCisKK3ByZWNvbXBfY2xvc3VyZShbXSwgW10sIF8sIFtdKSAtLT4gIS4KK3ByZWNvbXBfY2xvc3VyZShbOnxNc10sIFtBfEFzXSwgUCwgW1V8VXNdKSAtLT4KKwl7Z2V0X2Nsb3N1cmUoQSwgUCwgQyl9LAorCSEsCisJW3B1dF9jbG8oQywgVSldLAorCXByZWNvbXBfY2xvc3VyZShNcywgQXMsIFAsIFVzKS4KK3ByZWNvbXBfY2xvc3VyZShbX3xNc10sIFtBfEFzXSwgUCwgW1V8VXNdKSAtLT4KKwlbcHV0KEEsIFUpXSwKKwlwcmVjb21wX2Nsb3N1cmUoTXMsIEFzLCBQLCBVcykuCisKK2dldF9jbG9zdXJlKEcsIF8sIF8pIDotIHZhcihHKSwgISwgZmFpbC4KK2dldF9jbG9zdXJlKF8sIFAsIF8pIDotIHZhcihQKSwgISwgZmFpbC4KK2dldF9jbG9zdXJlKFA6RywgXywgQ2xvKSA6LSAhLCBnZXRfY2xvc3VyZShHLCBQLCBDbG8pLgorZ2V0X2Nsb3N1cmUoRywgUCwgUDpHKSA6LSAgJSA/Pz8KKwlhdG9tKFApLCAKKwljYWxsYWJsZShHKSwKKwlmdW5jdG9yKEcsIEYsIEEpLAorCVwrIGNsYXVzZShkeW5hbWljX3ByZWRpY2F0ZXMoRixBKSwgXyksIAorCSEuCisKKyUlJSBPcHRpbWl6ZSBSZWN1cnNpdmUgQ2FsbAorb3B0aW1pemVfcmVjdXJzaXZlX2NhbGwoSGVhZCwgSW5zdHJzMCwgSW5zdHJzKSA6LSAKKwljbGF1c2UocGwyYW1fZmxhZyhyYyksIF8pLAorCSEsCisJb3B0aW1pemVfcmMoSW5zdHJzMCwgSGVhZCwgSW5zdHJzLCBbXSkuCitvcHRpbWl6ZV9yZWN1cnNpdmVfY2FsbChfLCBJbnN0cnMsIEluc3RycykuCisKK29wdGltaXplX3JjKFtdLCBfKSAtLT4gIS4KK29wdGltaXplX3JjKFtleGVjdXRlKEdvYWwpfFhzXSwgSGVhZCkgLS0+CisJe2Z1bmN0b3IoSGVhZCwgRiwgQSl9LAorCXtmdW5jdG9yKEdvYWwsIEYsIEExKX0sCisJe0ErMSA9Oj0gQTF9LAorCSEsCisJe2Fzc2VydF9jb3B0cyhyYyhGLCBBKSl9LAorCXtHb2FsID0uLiBbRnxBcmdzXX0sCisJe3JhbmdlX3JlZygxLCBBLCBlYSwgUnMwKX0sCisJe3BsMmFtX2FwcGVuZChSczAsIFtlY29udF0sIFJzKX0sCisJZ2VuX3NldChBcmdzLCBScyksCisJW2dvdG8oRi9BK3RvcCldLAorCW9wdGltaXplX3JjKFhzLCBIZWFkKS4KK29wdGltaXplX3JjKFtYfFhzXSwgSGVhZCkgLS0+CisJW1hdLAorCW9wdGltaXplX3JjKFhzLCBIZWFkKS4KKworJSUlJSUlJSUlJSBDb21waWxlIENsYXVzZQorY29tcGlsZV9jaHVua3MoQ2h1bmssIEdUSTAsIEdUSSwgTFRJKSAtLT4KKwl7YWxsb2Nfdm9pZHMoQ2h1bmssIFtdLCBBbGxvYyl9LCAgJSBjaGVjayB2b2lkIHZhcmlhYmxlcworICAgICAgICBjb21waWxlX2NodW5rKENodW5rLCBBbGxvYywgR1RJMCwgR1RJLCBMVEkpLgorCitjb21waWxlX2NodW5rKFtdLCBfLCBHVEksIEdUSSwgW10pIC0tPiAhLgorY29tcGlsZV9jaHVuayhDaHVuaywgQWxsb2MsIEdUSTAsIEdUSSwgTFRJKSAtLT4KKwl7ZnJlZV94X3JlZyhDaHVuaywgMSwgWE4pLCBZTiA9IDEsIFBOID0gMX0sIAorCXtMVEkwID0gW1hOLCBZTiwgUE4sIEFsbG9jXX0sCisJY29tcF9jaHVuayhDaHVuaywgTFRJMCwgTFRJLCBHVEkwLCBHVEkpLgorCitjb21wX2NodW5rKFtdLCBMVEksIExUSSwgR1RJLCBHVEkpIC0tPiAhLgorY29tcF9jaHVuayhbKEw6W10pfENzXSwgTFRJMCwgTFRJLCBHVEkwLCBHVEkpIC0tPiAhLAorCVtMOltdXSwKKwljb21wX2NodW5rKENzLCBMVEkwLCBMVEksIEdUSTAsIEdUSSkuCitjb21wX2NodW5rKFsoTDpDKXxDc10sIExUSTAsIExUSSwgR1RJMCwgR1RJKSAtLT4gISwKKwlbTDpbXV0sCisJY29tcF9jaHVuayhbQ3xDc10sIExUSTAsIExUSSwgR1RJMCwgR1RJKS4KK2NvbXBfY2h1bmsoW0N8Q3NdLCBMVEkwLCBMVEksIEdUSTAsIEdUSSkgLS0+ICEsCisJY29tcF9pbnN0cihDLCBMVEkwLCBMVEkxLCBHVEkwLCBHVEkxKSwKKwljb21wX2NodW5rKENzLCBMVEkxLCBMVEksIEdUSTEsIEdUSSkuCisKKyUlJSBmaW5kcyBhbiBhdmFpbGFibGUgbnVtYmVyIEEtcmVnaXN0ZXIKK2ZyZWVfeF9yZWcoW10sIFhOLCBYTikuCitmcmVlX3hfcmVnKFtnZXQoXyxWKXxDc10sIFhOMCwgWE4pIDotIG5vbnZhcihWKSwgViA9IGEoTiksICEsCisJWE4xIGlzIG1heChOKzEsIFhOMCksCisJZnJlZV94X3JlZyhDcywgWE4xLCBYTikuCitmcmVlX3hfcmVnKFtwdXQoXyxWKXxDc10sIFhOMCwgWE4pIDotIG5vbnZhcihWKSwgViA9IGEoTiksICEsCisJWE4xIGlzIG1heChOKzEsIFhOMCksCisJZnJlZV94X3JlZyhDcywgWE4xLCBYTikuCitmcmVlX3hfcmVnKFtffENzXSwgWE4wLCBYTikgOi0KKwlmcmVlX3hfcmVnKENzLCBYTjAsIFhOKS4KKworJSUlIGZpbmRzIHZvaWQgdmFyaWFibGVzIGFuZCBhbGxvY2F0ZXMgdGhlbSBpbiBBbGxvYy4KK2FsbG9jX3ZvaWRzKENodW5rcywgQWxsb2MwLCBBbGxvYykgOi0KKwl2YXJpYWJsZXMoQ2h1bmtzLCBWYXJzKSwKKwlhbGxvY192b2lkczEoVmFycywgQ2h1bmtzLCBBbGxvYzAsIEFsbG9jKS4KKworYWxsb2Nfdm9pZHMxKFtdLCBfLCBBbGxvYywgQWxsb2MpLgorYWxsb2Nfdm9pZHMxKFtWfFZhcnNdLCBDaHVua3MsIEFsbG9jMCwgQWxsb2MpIDotCisJY291bnRfdmFyaWFibGUoViwgQ2h1bmtzLCAxKSwKKwkhLAorCUFsbG9jMSA9IFtbVix2b2lkLF9TZWVuXXxBbGxvYzBdLAorCWFsbG9jX3ZvaWRzMShWYXJzLCBDaHVua3MsIEFsbG9jMSwgQWxsb2MpLgorYWxsb2Nfdm9pZHMxKFtffFZhcnNdLCBDaHVua3MsIEFsbG9jMCwgQWxsb2MpIDotCisJYWxsb2Nfdm9pZHMxKFZhcnMsIENodW5rcywgQWxsb2MwLCBBbGxvYykuCisKKyUlJSUlJSUlJSUgQ29tcGlsZSBQcmVjb21waWxlZCBJbnN0cnVjdGlvbnM6IGdldCwgcHV0LCBwdXRfY2xvLCBhbmQgcHV0X2NvbnQKKy8qCisgIGNvbXBfaW5zdHIoK0luc3RyLCArTFRJMCwgP0xUSSwgK0dUSTAsID9HVEkpCisgIEluc3RyICAgIDogSW50ZXJtZWRpYXRlIGluc3RydWN0aW9uCisgIExUSSAgICAgIDogW1hOLCBZTiwgUE4sIEFsbG9jXQorICAgWE4gICAgICA6IFRoZSByZWdpc3RlciBhKFhOKSBpcyBhdmFpbGFibGUgZm9yICJUZXJtIi4KKyAgIFlOICAgICAgOiBUaGUgcmVnaXN0ZXIgeShZTikgaXMgYXZhaWxhYmxlIGZvciAiVGVybVtdIi4KKyAgIFBOICAgICAgOiBUaGUgcmVnaXN0ZXIgcChQTikgaXMgYXZhaWxhYmxlIGZvciAiUHJlZGljYXRlIi4KKyAgIEFsbG9jICAgOiBbW1ZhclRlcm0sIFJlZ2lzdGVyLCBTZWVuXSwuLi5dCisgIEdUSSAgICAgIDogW1NOLCBTQWxsb2MsIFNJbnN0cnNdCisgICBTTiAgICAgIDogVGhlIHJlZ2lzdGVycyBzKFNOKSwgc2koU04pLCBvciBzZihTTikgYXJlIGF2YWlsYWJsZSBmb3Igc3RhdGljICJUZXJtIi4KKyAgIFNBbGxvYyAgOiBbW05vblZhclRlcm06VHlwZSwgUmVnaXN0ZXIsIFNlZW5dLC4uLl0KKyAgIFNJbnN0cnMgOiBsaXN0IG9mIGluc3RydWN0aW9ucyBmb3Igc3RhdGljIHRlcm1zLgorICBTZWVuICAgICA6IFVuYm91bmQgdmFyaWFibGUgfCB5ZXMgfCB2b2lkCisgIFR5cGUgICAgIDogaW50IHwgZmxvIHwgY29uIHwgc3RyIHwgbGlzIHwgYXJyCisqLworY29tcF9pbnN0cihnZXQoWCwgQSksIExUSTAsIExUSSwgR1RJMCwgR1RJKSAtLT4gISwgCisJZ2VuX2dldChYLCBBLCBMVEkwLCBMVEksIEdUSTAsIEdUSSkuCitjb21wX2luc3RyKHB1dChYLCBWKSwgTFRJMCwgTFRJLCBHVEkwLCBHVEkpIC0tPiAhLCAKKwlnZW5fcHV0KFgsIFYsIExUSTAsIExUSSwgR1RJMCwgR1RJKS4KK2NvbXBfaW5zdHIocHV0X2NsbyhYLCBWKSwgTFRJMCwgTFRJLCBHVEkwLCBHVEkpIC0tPiAhLCAKKwlnZW5fcHV0X2NsbyhYLCBWLCBMVEkwLCBMVEksIEdUSTAsIEdUSSkuCitjb21wX2luc3RyKHB1dF9jb250KFgsIFYpLCBMVEkwLCBMVEksIEdUSTAsIEdUSSkgLS0+ICEsIAorCWdlbl9wdXRfY29udChYLCBWLCBMVEkwLCBMVEksIEdUSTAsIEdUSSkuCitjb21wX2luc3RyKEluc3RyLCBMVEksIExUSSwgR1RJLCBHVEkpIC0tPiAKKwlbSW5zdHJdLgorCislJSUlJSUlJSUlIHB1dCBpbnN0cnVjdGlvbnMKK2dlbl9wdXQoXywgQSwgXywgXywgXywgXykgLS0+IHtub252YXIoQSl9LCAhLAorCXtwbDJhbV9lcnJvcihbQSxzaG91bGQsYmUsYW4sdW5ib3VuZCx2YXJpYWJsZV0pfSwKKwl7ZmFpbH0uCitnZW5fcHV0KFgsIEEsIExUSTAsIExUSSwgR1RJLCBHVEkpIC0tPiB7dmFyKFgpfSwgISwKKwl7YXNzaWduX3JlZyhYLCBSLCBTZWVuLCBMVEkwLCBMVEkpfSwKKwlnZW5fcHV0X3ZhcihSLCBTZWVuLCBBKS4KK2dlbl9wdXQoWCwgQSwgTFRJLCBMVEksIEdUSTAsIEdUSSkgLS0+IHtpbnRlZ2VyKFgpfSwgISwKKwl7YXNzaWduX3NyZWcoWDppbnQsIFIsIFNlZW4sIEdUSTAsIEdUSTEpfSwKKwlnZW5fcHV0X2ludChYLCBSLCBTZWVuLCBBLCBHVEkxLCBHVEkpLgorZ2VuX3B1dChYLCBBLCBMVEksIExUSSwgR1RJMCwgR1RJKSAtLT4ge2Zsb2F0KFgpfSwgISwKKwl7YXNzaWduX3NyZWcoWDpmbG8sIFIsIFNlZW4sIEdUSTAsIEdUSTEpfSwKKwlnZW5fcHV0X2Zsb2F0KFgsIFIsIFNlZW4sIEEsIEdUSTEsIEdUSSkuCitnZW5fcHV0KFgsIEEsIExUSSwgTFRJLCBHVEkwLCBHVEkpIC0tPiB7YXRvbShYKX0sICEsCisJe2Fzc2lnbl9zcmVnKFg6Y29uLCBSLCBTZWVuLCBHVEkwLCBHVEkxKX0sCisJZ2VuX3B1dF9jb24oWCwgUiwgU2VlbiwgQSwgR1RJMSwgR1RJKS4KK2dlbl9wdXQoWCwgQSwgTFRJMCwgTFRJLCBHVEkwLCBHVEkpIC0tPiAKKwl7Z3JvdW5kKFgpLCBYID0gW1gxfFgyXX0sIAorCSEsCisJZ2VuX3B1dF9hcmdzKFtYMSxYMl0sIFtSMSxSMl0sIExUSTAsIExUSSwgR1RJMCwgR1RJMSksCisJe2Fzc2lnbl9zcmVnKFg6bGlzLCBSLCBTZWVuLCBHVEkxLCBHVEkyKX0sCisJZ2VuX3B1dF9saXN0KFtSMSxSMl0sIFIsIFNlZW4sIEEsIEdUSTIsIEdUSSkuCitnZW5fcHV0KFgsIEEsIExUSTAsIExUSSwgR1RJMCwgR1RJKSAtLT4gCisJe2dyb3VuZChYKSwgWCA9Li5bX3xBcmdzXSwgZnVuY3RvcihYLEYsTil9LAorCSEsCisJe2Fzc2lnbl9zcmVnKEYvTjpjb24sIFIwLCBTZWVuMCwgR1RJMCwgR1RJMSl9LAorCWdlbl9wdXRfY29uKEYvTiwgUjAsIFNlZW4wLCBfLCBHVEkxLCBHVEkyKSwKKwlnZW5fcHV0X2FyZ3MoQXJncywgUmVncywgTFRJMCwgTFRJLCBHVEkyLCBHVEkzKSwKKwl7YXNzaWduX3NyZWcoQXJnczphcnIsIFIxLCBTZWVuMSwgR1RJMywgR1RJNCl9LAorCWdlbl9wdXRfc3RyX2FyZ3MoUmVncywgUjEsIFNlZW4xLCBfLCBHVEk0LCBHVEk1KSwKKwl7YXNzaWduX3NyZWcoWDpzdHIsIFIsIFNlZW4sIEdUSTUsIEdUSTYpfSwKKwlnZW5fcHV0X3N0cihbUjAsUjFdLCBSLCBTZWVuLCBBLCBHVEk2LCBHVEkpLgorZ2VuX3B1dChYLCBBLCBMVEkwLCBMVEksIEdUSTAsIEdUSSkgLS0+IAorCXtYID0gW1gxfFgyXX0sIAorCSEsCisJZ2VuX3B1dF9hcmdzKFtYMSxYMl0sIFtSMSxSMl0sIExUSTAsIExUSTEsIEdUSTAsIEdUSSksCisJe2Fzc2lnbl9yZWcoXywgUiwgU2VlbiwgTFRJMSwgTFRJKX0sCisJe1NlZW4gPSB5ZXMsIFIgPSBBfSwKKwlbcHV0X2xpc3QoUjEsIFIyLCBSKV0uCitnZW5fcHV0KFgsIEEsIExUSTAsIExUSSwgR1RJMCwgR1RJKSAtLT4KKwl7WCA9Li5bX3xBcmdzXSwgZnVuY3RvcihYLEYsTil9LAorCSEsCisJe2Fzc2lnbl9zcmVnKEYvTjpjb24sIFIwLCBTZWVuMCwgR1RJMCwgR1RJMSl9LAorCWdlbl9wdXRfY29uKEYvTiwgUjAsIFNlZW4wLCBfLCBHVEkxLCBHVEkyKSwKKwlnZW5fcHV0X2FyZ3MoQXJncywgUmVncywgTFRJMCwgTFRJMSwgR1RJMiwgR1RJKSwKKwl7aW5jX1lOKFIxLCBMVEkxLCBMVEkyKX0sCisJe2Fzc2lnbl9yZWcoXywgUiwgU2VlbiwgTFRJMiwgTFRJKX0sCisJe1NlZW4gPSB5ZXMsIFIgPSBBfSwKKwlbcHV0X3N0cl9hcmdzKFJlZ3MsIFIxKV0sCisJW3B1dF9zdHIoUjAsIFIxLCBSKV0uCisKK2dlbl9wdXRfdmFyKHZvaWQsIF8sIEEpIC0tPiAhLCB7QSA9IHZvaWR9LiAlIHZvaWQgaXMgYSBzcGVjaWFsIGNvbnN0YW50LgorZ2VuX3B1dF92YXIoUiwgU2VlbiwgQSkgLS0+IHt2YXIoU2Vlbil9LCAhLCAKKwl7U2VlbiA9IHllcywgUiA9IEF9LCAKKwlbcHV0X3ZhcihSKV0uCitnZW5fcHV0X3ZhcihSLCBfLCBBKSAtLT4ge1IgPSBBfS4KKworZ2VuX3B1dF9pbnQoWCwgUiwgU2VlbiwgQSwgR1RJMCwgR1RJKSAgLS0+IHt2YXIoU2Vlbil9LCAhLCAKKwl7U2VlbiA9IHllcywgUiA9IEF9LAorCXthZGRfaW5zdHIocHV0X2ludChYLCBSKSwgR1RJMCwgR1RJKX0uCitnZW5fcHV0X2ludChfLCBSLCBfLCBBLCBHVEksIEdUSSkgIC0tPiB7UiA9IEF9LgorCitnZW5fcHV0X2Zsb2F0KFgsIFIsIFNlZW4sIEEsIEdUSTAsIEdUSSkgIC0tPiB7dmFyKFNlZW4pfSwgISwgCisJe1NlZW4gPSB5ZXMsIFIgPSBBfSwKKwl7YWRkX2luc3RyKHB1dF9mbG9hdChYLCBSKSwgR1RJMCwgR1RJKX0uCitnZW5fcHV0X2Zsb2F0KF8sIFIsIF8sIEEsIEdUSSwgR1RJKSAgLS0+IHtSID0gQX0uCisKK2dlbl9wdXRfY29uKFgsIFIsIFNlZW4sIEEsIEdUSTAsIEdUSSkgIC0tPiB7dmFyKFNlZW4pfSwgISwgCisJe1NlZW4gPSB5ZXMsIFIgPSBBfSwKKwl7YWRkX2luc3RyKHB1dF9jb24oWCwgUiksIEdUSTAsIEdUSSl9LgorZ2VuX3B1dF9jb24oXywgUiwgXywgQSwgR1RJLCBHVEkpICAtLT4ge1IgPSBBfS4KKworZ2VuX3B1dF9saXN0KFtSMSxSMl0sIFIsIFNlZW4sIEEsIEdUSTAsIEdUSSkgLS0+IHt2YXIoU2Vlbil9LCAhLCAKKwl7U2VlbiA9IHllcywgUiA9IEF9LAorCXthZGRfaW5zdHIocHV0X2xpc3QoUjEsIFIyLCBSKSwgR1RJMCwgR1RJKX0uCitnZW5fcHV0X2xpc3QoXywgUiwgXywgQSwgR1RJLCBHVEkpIC0tPiB7UiA9IEF9LgorCitnZW5fcHV0X3N0cl9hcmdzKFJlZ3MsIFIsIFNlZW4sIEEsIEdUSTAsIEdUSSkgLS0+IHt2YXIoU2Vlbil9LCAhLAorCXtTZWVuID0geWVzLCBSID0gQX0sCisJe2FkZF9pbnN0cihwdXRfc3RyX2FyZ3MoUmVncywgUiksIEdUSTAsIEdUSSl9LgorZ2VuX3B1dF9zdHJfYXJncyhfLCBSLCBfLCBBLCBHVEksIEdUSSkgLS0+IHtSID0gQX0uCisKK2dlbl9wdXRfc3RyKFtSMCxSMV0sIFIsIFNlZW4sIEEsIEdUSTAsIEdUSSkgLS0+IHt2YXIoU2Vlbil9LCAhLAorCXtTZWVuID0geWVzLCBSID0gQX0sCisJe2FkZF9pbnN0cihwdXRfc3RyKFIwLCBSMSwgUiksIEdUSTAsIEdUSSl9LgorZ2VuX3B1dF9zdHIoXywgUiwgXywgQSwgR1RJLCBHVEkpIC0tPiB7UiA9IEF9LgorCitnZW5fcHV0X2FyZ3MoW10sIFtdLCBMVEksIExUSSwgR1RJLCBHVEkpIC0tPiAhLgorZ2VuX3B1dF9hcmdzKFtYfFhzXSwgW1J8UnNdLCBMVEkwLCBMVEksIEdUSTAsIEdUSSkgLS0+CisJZ2VuX3B1dChYLCBSLCBMVEkwLCBMVEkxLCBHVEkwLCBHVEkxKSwKKwlnZW5fcHV0X2FyZ3MoWHMsIFJzLCBMVEkxLCBMVEksIEdUSTEsIEdUSSkuCisKK2dlbl9wdXRfY2xvKFA6WCwgQSwgTFRJMCwgTFRJLCBHVEkwLCBHVEkpIC0tPiAKKwl7WCA9Li5bRnxBcmdzXX0sCisJISwKKwlnZW5fcHV0X2FyZ3MoQXJncywgUmVncywgTFRJMCwgTFRJMSwgR1RJMCwgR1RJKSwKKwl7YXNzaWduX3JlZyhfLCBSLCBTZWVuLCBMVEkxLCBMVEkpfSwKKwl7U2VlbiA9IHllcywgUiA9IEF9LAorCXtYMSA9Li5bRnxSZWdzXX0sCisJeyhjbGF1c2UocGFja2FnZV9uYW1lKFApLCBfKSAtPiBDTE8gPSBYMSA7IENMTyA9IFA6WDEpfSwKKwlbcHV0X2NsbyhDTE8sIFIpXS4KKworJSUlJSUlJSUlJSBnZXQgaW5zdHJ1Y3Rpb25zCitnZW5fZ2V0KFgsIEEsIExUSTAsIExUSSwgR1RJMCwgR1RJKSAtLT4gCisJZ2VuX2dldChbQT1YXSwgTFRJMCwgTFRJLCBHVEkwLCBHVEkpLgorCitnZW5fZ2V0KFtdLCBMVEksIExUSSwgR1RJLCBHVEkpIC0tPiAhLgorZ2VuX2dldChbQT1YfF9dLCBMVEksIExUSSwgR1RJLCBHVEkpIC0tPiAKKwl7dmFyKEEpfSwgCisJISwKKwl7cGwyYW1fZXJyb3IoW0EsbXVzdCxub3QsYmUsYSx2YXJpYWJsZSxpbixnZXQoWCxBKV0pfSwKKwl7ZmFpbH0uCitnZW5fZ2V0KFtBPVh8SW5zdHJzXSwgTFRJMCwgTFRJLCBHVEkwLCBHVEkpIC0tPiAKKwl7dmFyKFgpfSwKKwl7YXNzaWduX3JlZyhYLCBSLCBTZWVuLCBMVEkwLCBMVEkxKX0sCisJe25vbnZhcihTZWVuKX0sCisJISwKKwlnZW5fZ2V0X3ZhcihSLCBTZWVuLCBBKSwKKwlnZW5fZ2V0KEluc3RycywgTFRJMSwgTFRJLCBHVEkwLCBHVEkpLgorZ2VuX2dldChbQT1YfEluc3Ryc10sIExUSTAsIExUSSwgR1RJMCwgR1RJKSAtLT4gCisJe3ZhcihYKX0sIAorCSEsCisJe2FkZF9hbGxvYyhbWCxBLHllc10sIExUSTAsIExUSTEpfSwKKwlnZW5fZ2V0KEluc3RycywgTFRJMSwgTFRJLCBHVEkwLCBHVEkpLgorZ2VuX2dldChbQT1YfEluc3Ryc10sIExUSTAsIExUSSwgR1RJMCwgR1RJKSAtLT4gCisJe2ludGVnZXIoWCl9LCAKKwkhLAorCWdlbl9wdXQoWCwgUiwgTFRJMCwgTFRJMSwgR1RJMCwgR1RJMSksCisJW2dldF9pbnQoWCwgUiwgQSldLAorCWdlbl9nZXQoSW5zdHJzLCBMVEkxLCBMVEksIEdUSTEsIEdUSSkuCitnZW5fZ2V0KFtBPVh8SW5zdHJzXSwgTFRJMCwgTFRJLCBHVEkwLCBHVEkpIC0tPiAKKwl7ZmxvYXQoWCl9LCAKKwkhLAorCWdlbl9wdXQoWCwgUiwgTFRJMCwgTFRJMSwgR1RJMCwgR1RJMSksCisJW2dldF9mbG9hdChYLCBSLCBBKV0sCisJZ2VuX2dldChJbnN0cnMsIExUSTEsIExUSSwgR1RJMSwgR1RJKS4KK2dlbl9nZXQoW0E9WHxJbnN0cnNdLCBMVEkwLCBMVEksIEdUSTAsIEdUSSkgLS0+IAorCXthdG9tKFgpfSwgCisJISwKKwlnZW5fcHV0KFgsIFIsIExUSTAsIExUSTEsIEdUSTAsIEdUSTEpLAorCVtnZXRfY29uKFgsIFIsIEEpXSwKKwlnZW5fZ2V0KEluc3RycywgTFRJMSwgTFRJLCBHVEkxLCBHVEkpLgorZ2VuX2dldChbQT1YfEluc3Ryc10sIExUSTAsIExUSSwgR1RJMCwgR1RJKSAtLT4gCisJe2dyb3VuZChYKX0sIAorCSEsCisJZ2VuX3B1dChYLCBSLCBMVEkwLCBMVEkxLCBHVEkwLCBHVEkxKSwKKwlbZ2V0X2dyb3VuZChYLCBSLCBBKV0sCisJZ2VuX2dldChJbnN0cnMsIExUSTEsIExUSSwgR1RJMSwgR1RJKS4KK2dlbl9nZXQoW0E9WHxJbnN0cnNdLCBMVEkwLCBMVEksIEdUSTAsIEdUSSkgLS0+IAorCXtYID0gW1gxfFgyXX0sIAorCSEsCisJW2dldF9saXN0KEEpXSwKKwlnZW5fdW5pZnkoW1gxLFgyXSwgSW5zdHJzMSwgTFRJMCwgTFRJMSwgR1RJMCwgR1RJMSksCisJZ2VuX2dldChJbnN0cnMxLCBMVEkxLCBMVEkyLCBHVEkxLCBHVEkyKSwKKwlnZW5fZ2V0KEluc3RycywgTFRJMiwgTFRJLCBHVEkyLCBHVEkpLgorZ2VuX2dldChbQT1YfEluc3Ryc10sIExUSTAsIExUSSwgR1RJMCwgR1RJKSAtLT4gCisJe1ggPS4uIFtGfEFyZ3NdLCBmdW5jdG9yKFgsIEYsIE4pfSwKKwl7YXNzaWduX3NyZWcoRi9OOmNvbiwgUiwgU2VlbiwgR1RJMCwgR1RJMSl9LAorCWdlbl9wdXRfY29uKEYvTiwgUiwgU2VlbiwgXywgR1RJMSwgR1RJMiksCisJW2dldF9zdHIoRi9OLCBSLCBBKV0sCisJZ2VuX3VuaWZ5KEFyZ3MsIEluc3RyczEsIExUSTAsIExUSTEsIEdUSTIsIEdUSTMpLAorCWdlbl9nZXQoSW5zdHJzMSwgTFRJMSwgTFRJMiwgR1RJMywgR1RJNCksCisJZ2VuX2dldChJbnN0cnMsIExUSTIsIExUSSwgR1RJNCwgR1RJKS4KKworZ2VuX2dldF92YXIodm9pZCwgXywgXykgLS0+ICEuCitnZW5fZ2V0X3ZhcihSLCBfLCBBKSAtLT4gW2dldF92YWwoUiwgQSldLgorCislJSUlJSUlJSUlIHVuaWZ5IGluc3RydWN0aW9ucworZ2VuX3VuaWZ5KFtdLCBbXSwgTFRJLCBMVEksIEdUSSwgR1RJKSAtLT4gIS4KK2dlbl91bmlmeShbWHxYc10sIEluc3RycywgTFRJMCwgTFRJLCBHVEkwLCBHVEkpIC0tPiAKKwl7dmFyKFgpfSwgCisJISwKKwl7YXNzaWduX3JlZyhYLCBSLCBTZWVuLCBMVEkwLCBMVEkxKX0sCisJZ2VuX3VuaWZ5X3ZhcihSLCBTZWVuKSwKKwlnZW5fdW5pZnkoWHMsIEluc3RycywgTFRJMSwgTFRJLCBHVEkwLCBHVEkpLgorZ2VuX3VuaWZ5KFtYfFhzXSwgSW5zdHJzLCBMVEkwLCBMVEksIEdUSTAsIEdUSSkgLS0+IAorCXtpbnRlZ2VyKFgpfSwgCisJISwKKwlnZW5fcHV0KFgsIFIsIExUSTAsIExUSTEsIEdUSTAsIEdUSTEpLAorCVt1bmlmeV9pbnQoWCwgUildLAorCWdlbl91bmlmeShYcywgSW5zdHJzLCBMVEkxLCBMVEksIEdUSTEsIEdUSSkuCitnZW5fdW5pZnkoW1h8WHNdLCBJbnN0cnMsIExUSTAsIExUSSwgR1RJMCwgR1RJKSAtLT4gCisJe2Zsb2F0KFgpfSwgCisJISwKKwlnZW5fcHV0KFgsIFIsIExUSTAsIExUSTEsIEdUSTAsIEdUSTEpLAorCVt1bmlmeV9mbG9hdChYLCBSKV0sCisJZ2VuX3VuaWZ5KFhzLCBJbnN0cnMsIExUSTEsIExUSSwgR1RJMSwgR1RJKS4KK2dlbl91bmlmeShbWHxYc10sIEluc3RycywgTFRJMCwgTFRJLCBHVEkwLCBHVEkpIC0tPiAKKwl7YXRvbShYKX0sIAorCSEsCisJZ2VuX3B1dChYLCBSLCBMVEkwLCBMVEkxLCBHVEkwLCBHVEkxKSwKKwlbdW5pZnlfY29uKFgsIFIpXSwKKwlnZW5fdW5pZnkoWHMsIEluc3RycywgTFRJMSwgTFRJLCBHVEkxLCBHVEkpLgorZ2VuX3VuaWZ5KFtYfFhzXSwgSW5zdHJzLCBMVEkwLCBMVEksIEdUSTAsIEdUSSkgLS0+IAorCXtncm91bmQoWCl9LCAKKwkhLAorCWdlbl9wdXQoWCwgUiwgTFRJMCwgTFRJMSwgR1RJMCwgR1RJMSksCisJW3VuaWZ5X2dyb3VuZChYLCBSKV0sCisJZ2VuX3VuaWZ5KFhzLCBJbnN0cnMsIExUSTEsIExUSSwgR1RJMSwgR1RJKS4KK2dlbl91bmlmeShbWHxYc10sIFtSPVh8SW5zdHJzXSwgTFRJMCwgTFRJLCBHVEkwLCBHVEkpIC0tPiAKKwl7YXNzaWduX3JlZyhfLCBSLCBTZWVuLCBMVEkwLCBMVEkxKX0sCisJZ2VuX3VuaWZ5X3ZhcihSLCBTZWVuKSwKKwlnZW5fdW5pZnkoWHMsIEluc3RycywgTFRJMSwgTFRJLCBHVEkwLCBHVEkpLgorCislJSUgdW5pZnlfdm9pZCwgdW5pZnlfdmFyaWFibGUsIHVuaWZ5X3ZhbHVlCitnZW5fdW5pZnlfdmFyKHZvaWQsIF8pIC0tPiAhLCBbdW5pZnlfdm9pZCgxKV0uCitnZW5fdW5pZnlfdmFyKFIsIFNlZW4pIC0tPiB7dmFyKFNlZW4pfSwgISwKKwl7U2VlbiA9IHllc30sIAorCVt1bmlmeV92YXIoUildLgorZ2VuX3VuaWZ5X3ZhcihSLCBfKSAtLT4gW3VuaWZ5X3ZhbChSKV0uCisKKyUlJSUlJSUlJSUgZ2VuZXJhdGUgY29udGludWF0aW9uIGdvYWwKK2dlbl9wdXRfY29udChYLCBSLCBMVEkwLCBMVEksIEdUSSwgR1RJKSAtLT4KKwl7aW5jX1BOKFIsIExUSTAsIExUSSl9LAorCVtwdXRfY29udChYLCBSKV0uCisKKyUlJSBBIHJlZ2lzdGVyCithc3NpZ25fcmVnKFgsIFJlZywgU2VlbiwgTFRJMCwgTFRJKSA6LSBub252YXIoWCksICEsCisJcGwyYW1fZXJyb3IoW1gsbXVzdCxiZSx1bmJvdW5kLHZhcmlhYmxlLGluLGFzc2lnbl9yZWcoWCxSZWcsU2VlbixMVEkwLExUSSldKSwKKwlmYWlsLgorYXNzaWduX3JlZyhYLCBSZWcsIFNlZW4sIFtYTixZTixQTixBbGxvY10sIFtYTixZTixQTixBbGxvY10pIDotCisJYWxsb2NhdGVkKEFsbG9jLCBYLCBbUmVnLFNlZW5dKSwKKwkhLgorYXNzaWduX3JlZyhYLCBSZWcsIFNlZW4sIFtYTixZTixQTixBbGxvY10sIFtYTjEsWU4sUE4sQWxsb2MxXSkgOi0KKwlSZWcgPSBhKFhOKSwKKwlYTjEgaXMgWE4gKyAxLAorCUFsbG9jMSA9IFtbWCxSZWcsU2Vlbl18QWxsb2NdLgorCithbGxvY2F0ZWQoW1tWfFhdfF9dLCBWMCwgWCkgOi0gViA9PSBWMCwgIS4KK2FsbG9jYXRlZChbX3xBbGxvY10sIFYwLCBYKSA6LSBhbGxvY2F0ZWQoQWxsb2MsIFYwLCBYKS4KKworJSUlIFMgcmVnaXN0ZXIKK2Fzc2lnbl9zcmVnKFgsIFJlZywgU2VlbiwgR1RJMCwgR1RJKSA6LSBcKyBncm91bmQoWCksICEsCisJcGwyYW1fZXJyb3IoW1gsbXVzdCxiZSxncm91bmQsdGVybSxpbixhc3NpZ25fc3JlZyhYLFJlZyxTZWVuLEdUSTAsR1RJKV0pLAorCWZhaWwuCithc3NpZ25fc3JlZyhYLCBSZWcsIFNlZW4sIFtTTixTQWxsb2MsU0luc3Ryc10sIFtTTixTQWxsb2MsU0luc3Ryc10pIDotCisJYWxsb2NhdGVkKFNBbGxvYywgWCwgW1JlZyxTZWVuXSksCisJIS4KK2Fzc2lnbl9zcmVnKFg6VCwgUmVnLCBTZWVuLCBbU04sU0FsbG9jLFNJbnN0cnNdLCBbU04xLFNBbGxvYzEsU0luc3Ryc10pIDotCisJYXNzaWduX3NyZWcwKFQsIFNOLCBSZWcpLAorCVNOMSBpcyBTTisxLAorCVNBbGxvYzEgPSBbW1g6VCxSZWcsU2Vlbl18U0FsbG9jXS4KKworYXNzaWduX3NyZWcwKGludCwgU04sIHNpKFNOKSkgOi0gIS4KK2Fzc2lnbl9zcmVnMChmbG8sIFNOLCBzZihTTikpIDotICEuCithc3NpZ25fc3JlZzAoXywgICBTTiwgIHMoU04pKSA6LSAhLgorJWFzc2lnbl9zcmVnMChjb24sIFNOLCBzYyhTTikpIDotICEuCislYXNzaWduX3NyZWcwKHN0ciwgU04sIHNzKFNOKSkgOi0gIS4KKyVhc3NpZ25fc3JlZzAobGlzLCBTTiwgc2woU04pKSA6LSAhLgorJWFzc2lnbl9zcmVnMChhcnIsIFNOLCBzYShTTikpIDotICEuCisKKyUlJSBpbmNyaW1lbnQgWU4KK2luY19ZTih5KFlOKSwgW1hOLFlOfFpzXSwgW1hOLFlOMXxac10pIDotIFlOMSBpcyBZTisxLgorCislJSUgaW5jcmltZW50IFBOCitpbmNfUE4ocChQTiksIFtYTixZTixQTnxac10sIFtYTixZTixQTjF8WnNdKSA6LSBQTjEgaXMgUE4rMS4KKworJSUlIGFkZCBhbiBpbnN0cnVjdGlvbiB0byBHVEkKK2FkZF9pbnN0cihJbnN0ciwgW1NOLFNBbGxvYyxTSW5zdHJzMF0sIFtTTixTQWxsb2MsW0luc3RyfFNJbnN0cnMwXV0pLgorCislJSUgYWRkIGFuIGFsbG9jYXRpb24gdG8gTFRJCithZGRfYWxsb2MoRSwgW1hOLFlOLFBOLEFsbG9jMF0sIFtYTixZTixQTixbRXxBbGxvYzBdXSkuCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBCdWlsdC1pbiBQcmVkaWNhdGVzIGFuZCBDb25zdGFudHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYnVpbHRpbl9tZXRhX3ByZWRpY2F0ZXMoKF4pLCAyLCBbPyw6XSkuCitidWlsdGluX21ldGFfcHJlZGljYXRlcyhjYWxsLCAxLCBbOl0pLgorYnVpbHRpbl9tZXRhX3ByZWRpY2F0ZXMob25jZSwgMSwgWzpdKS4KK2J1aWx0aW5fbWV0YV9wcmVkaWNhdGVzKChcKyksIDEsIFs6XSkuCitidWlsdGluX21ldGFfcHJlZGljYXRlcyhmaW5kYWxsLCAzLCBbPyw6LD9dKS4KK2J1aWx0aW5fbWV0YV9wcmVkaWNhdGVzKGJhZ29mLCAzLCBbPyw6LD9dKS4KK2J1aWx0aW5fbWV0YV9wcmVkaWNhdGVzKHNldG9mLCAzLCBbPyw6LD9dKS4KK2J1aWx0aW5fbWV0YV9wcmVkaWNhdGVzKG9uX2V4Y2VwdGlvbiwgMywgWz8sOiw6XSkuCitidWlsdGluX21ldGFfcHJlZGljYXRlcyhjYXRjaCwgMywgWzosPyw6XSkuCitidWlsdGluX21ldGFfcHJlZGljYXRlcyhzeW5jaHJvbml6ZWQsIDIsIFs/LDpdKS4KK2J1aWx0aW5fbWV0YV9wcmVkaWNhdGVzKGZyZWV6ZSwgMiwgWz8sOl0pLgorCitidWlsdGluX2xvY2FsX3ByZWRpY2F0ZXMoYXNzZXJ0LCAxLCBbOl0pLgorYnVpbHRpbl9sb2NhbF9wcmVkaWNhdGVzKGFzc2VydGEsIDEsIFs6XSkuCitidWlsdGluX2xvY2FsX3ByZWRpY2F0ZXMoYXNzZXJ0eiwgMSwgWzpdKS4KK2J1aWx0aW5fbG9jYWxfcHJlZGljYXRlcyhyZXRyYWN0LCAxLCBbOl0pLgorYnVpbHRpbl9sb2NhbF9wcmVkaWNhdGVzKHJldHJhY3RhbGwsIDEsIFs6XSkuCitidWlsdGluX2xvY2FsX3ByZWRpY2F0ZXMoY2xhdXNlLCAyLCBbOiw/XSkuCitidWlsdGluX2xvY2FsX3ByZWRpY2F0ZXMoYWJvbGlzaCwgMSwgWzpdKS4KKworJSBDb250cm9sIGNvbnN0cnVjdHMKK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoZmFpbCkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckZ2V0X2xldmVsJyhfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckbmVja19jdXQnKS4KK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoJyRjdXQnKF8pKS4KKyUgVGVybSB1bmlmaWNhdGlvbgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcygnJHVuaWZ5JyhfLF8pKS4KK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoJyRub3RfdW5pZmlhYmxlJyhfLF8pKS4KKyUgVHlwZSB0ZXN0aW5nCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKHZhcihfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKGF0b20oXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcyhpbnRlZ2VyKF8pKS4KK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoZmxvYXQoXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcyhhdG9taWMoXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcyhub252YXIoXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcyhudW1iZXIoXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcyhqYXZhKF8pKS4KK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoamF2YShfLF8pKS4KK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoY2xvc3VyZShfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKGdyb3VuZChfKSkuCislIFRlcm0gY29tcGFyaXNvbgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcygnJGVxdWFsaXR5X29mX3Rlcm0nKF8sXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcygnJGluZXF1YWxpdHlfb2ZfdGVybScoXyxfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckYWZ0ZXInKF8sXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcygnJGJlZm9yZScoXyxfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckbm90X2FmdGVyJyhfLF8pKS4KK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoJyRub3RfYmVmb3JlJyhfLF8pKS4KK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoJyRpZGVudGljYWxfb3JfY2Fubm90X3VuaWZ5JyhfLF8pKS4KKyUgVGVybSBjcmVhdGlvbiBhbmQgZGVjb21wb3NpdGlvbgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcyhjb3B5X3Rlcm0oXyxfKSkuCislIEFyaXRobWV0aWMgZXZhbHVhdGlvbgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcyhpcyhfLF8pKS4KK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoJyRhYnMnKF8sXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcygnJGFzaW4nKF8sXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcygnJGFjb3MnKF8sXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcygnJGF0YW4nKF8sXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcygnJGJpdHdpc2VfY29uaicoXyxfLF8pKS4KK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoJyRiaXR3aXNlX2Rpc2onKF8sXyxfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckYml0d2lzZV9leGNsdXNpdmVfb3InKF8sXyxfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckYml0d2lzZV9uZWcnKF8sXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcygnJGNlaWwnKF8sXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcygnJGNvcycoXyxfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckZGVncmVlcycoXyxfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckZXhwJyhfLF8pKS4KK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoJyRmbG9hdF9xdW90aWVudCcoXyxfLF8pKS4KK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoJyRmbG9vcicoXyxfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckaW50X3F1b3RpZW50JyhfLF8sXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcygnJGxvZycoXyxfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckbWF4JyhfLF8sXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcygnJG1pbicoXyxfLF8pKS4KK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoJyRtaW51cycoXyxfLF8pKS4KK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoJyRtb2QnKF8sXyxfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckbXVsdGknKF8sXyxfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckcGx1cycoXyxfLF8pKS4KK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoJyRwb3cnKF8sXyxfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckcmFkaWFucycoXyxfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckcmludCcoXyxfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckcm91bmQnKF8sXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcygnJHNoaWZ0X2xlZnQnKF8sXyxfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckc2hpZnRfcmlnaHQnKF8sXyxfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckc2luJyhfLF8pKS4KK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoJyRzcXJ0JyhfLF8pKS4KK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoJyR0YW4nKF8sXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcygnJGZsb2F0JyhfLF8pKS4KK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoJyRmbG9hdF9pbnRlZ2VyX3BhcnQnKF8sXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcygnJGZsb2F0X2ZyYWN0aW9uYWxfcGFydCcoXyxfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckdHJ1bmNhdGUnKF8sXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcygnJHNpZ24nKF8sXykpLgorJSBBcml0aG1ldGljIGNvbXBhcmlzb24KK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoJyRhcml0aF9lcXVhbCcoXyxfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckYXJpdGhfbm90X2VxdWFsJyhfLF8pKS4KK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoJyRncmVhdGVyX29yX2VxdWFsJyhfLF8pKS4KK2J1aWx0aW5faW5saW5lX3ByZWRpY2F0ZXMoJyRncmVhdGVyX3RoYW4nKF8sXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcygnJGxlc3Nfb3JfZXF1YWwnKF8sXykpLgorYnVpbHRpbl9pbmxpbmVfcHJlZGljYXRlcygnJGxlc3NfdGhhbicoXyxfKSkuCislIFByb2xvZyBDYWZlIFNwZWNpZmljCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckSU5TRVJUX0FNJyhfKSkuCitidWlsdGluX2lubGluZV9wcmVkaWNhdGVzKCckSU5TRVJUJyhfKSkuCisKK2J1aWx0aW5fYXJpdGhfY29uc3RhbnQocmFuZG9tKS4KK2J1aWx0aW5fYXJpdGhfY29uc3RhbnQocGkpLgorYnVpbHRpbl9hcml0aF9jb25zdGFudChlKS4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIEVsaW1pbmF0ZSBkaXNqdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworJSAgVGhlIGNsYXVzZSBhIDotIGI7YyBpcyBjb252ZXJ0ZWQgaW50byBhIDotIGIuIGFuZCBhIDotIGMuCislICBJbiBhZGRpdGlvbiwgCislICAgIChDMSAtPiBDMikgICAgICAgIGlzIGNvbnZlcnRlZCBpbnRvICgoQzEsISxDMikgOyBmYWlsKS4KKyUgICAgKChDMSAtPiBDMikgOyBDMykgaXMgY29udmVydGVkIGludG8gKChDMSwhLEMyKSA7IEMzKS4KKyUgICAgbm90KEMpICAgICAgICAgICAgaXMgY29udmVydGVkIGludG8gKChDLCEsZmFpbCkgOyB0cnVlKS4KKyUgICAgXCsoQykgICAgICAgICAgICAgaXMgY29udmVydGVkIGludG8gKChDLCEsZmFpbCkgOyB0cnVlKS4KKyUgIEFuZCB0aGVuIGFsbCBvZiBkaXNqdW5jdGlvbnMgYXJlIGVsaW1pbmF0ZWQuCislCislICBOb3RlOiB0aGlzIGlzIGJhc2VkIG9uIGZsYXR0ZW4ucGwgaW4gaG9sbWVyJ3MgYmVuY2htYXJrLgorCitlbGltaW5hdGVfZGlzaihDbCwgTmV3Q2wsIER1bW15Q2xzKSA6LQorCWV4dHJhY3RfZGlzaihDbCwgTmV3Q2wsIERpc2pzLCBbXSksCisJdHJlYXRfZGlzaihEaXNqcywgRHVtbXlDbHMsIFtdKS4KKworZXh0cmFjdF9kaXNqKENsLCBDbCkgLS0+IHt2YXIoQ2wpfSwgIS4KK2V4dHJhY3RfZGlzaihDbCwgKEggOi0gTmV3QikpIC0tPiB7Q2wgPSAoSCA6LSBCKX0sICEsCisJZXh0cmFjdF9kaXNqKEIsIE5ld0IsIENsKS4KK2V4dHJhY3RfZGlzaihDbCwgQ2wpIC0tPiAhLgorCitleHRyYWN0X2Rpc2ooRywgRywgXykgLS0+IHt2YXIoRyl9LCAhLgorZXh0cmFjdF9kaXNqKChHMSwgRzIpLCAoTmV3RzEsIE5ld0cyKSwgQ2wpIC0tPiAhLAorCWV4dHJhY3RfZGlzaihHMSwgTmV3RzEsIENsKSwKKwlleHRyYWN0X2Rpc2ooRzIsIE5ld0cyLCBDbCkuCitleHRyYWN0X2Rpc2ooRywgTmV3RywgQ2wpIC0tPiB7aXNfZGlzaihHLCBEaXNqRyl9LCAhLAorCXtyZXRyYWN0KGR1bW15X2NsYXVzZV9jb3VudGVyKE4pKX0sCisJW2Rpc2ooRGlzakcsIE4sIE5ld0csIENsKV0sCisJe04xIGlzIE4rMX0sCisJe2Fzc2VydChkdW1teV9jbGF1c2VfY291bnRlcihOMSkpfS4KK2V4dHJhY3RfZGlzaihHLCBHLCBfKSAtLT4gIS4KKworaXNfZGlzaigoQzEtPkMyKSwgKChDMSwhLEMyKTtmYWlsKSkgOi0gIS4KK2lzX2Rpc2ooKChDMS0+QzIpO0MzKSwgKChDMSwhLEMyKTtDMykpIDotICEuCitpc19kaXNqKChDMTtDMiksIChDMTtDMikpIDotICEuCitpc19kaXNqKG5vdChDKSwoKEMsISxmYWlsKTt0cnVlKSkgOi0gIS4KK2lzX2Rpc2ooXCsoQyksKChDLCEsZmFpbCk7dHJ1ZSkpLgorCit0cmVhdF9kaXNqKFtdKSAtLT4gIS4KK3RyZWF0X2Rpc2ooW2Rpc2ooKEE7QiksTixYLEMpfERpc2pzXSkgLS0+CisJe3ZhcmlhYmxlcygoQTtCKSwgVmFycyl9LAorCXt2YXJpYWJsZXMoQywgQ1ZhcnMpfSwKKwl7aW50ZXJzZWN0X3ZhcnMoVmFycywgQ1ZhcnMsIEFyZ3MpfSwKKwl7Y2xhdXNlKGZpbGVfbmFtZShGaWxlKSwgXyl9LAorCXtsaXN0X3RvX3N0cmluZyhbJyRkdW1teV8nLCBOLCAnXycsIEZpbGVdLCBOYW1lKX0sCisJe1ggPS4uIFtOYW1lfEFyZ3NdfSwKKwl7Y29weV90ZXJtKChYIDotIEEpLCBEdW1teUNsYSl9LAorCXtjb3B5X3Rlcm0oKFggOi0gQiksIER1bW15Q2xiKX0sCisJW0R1bW15Q2xhXSwKKwlbRHVtbXlDbGJdLAorCXRyZWF0X2Rpc2ooRGlzanMpLgorCitpbnRlcnNlY3RfdmFycyhWMSwgVjIsIE91dCkgOi0KKwlzb3J0KFYxLCBTb3J0ZWQxKSwKKwlzb3J0KFYyLCBTb3J0ZWQyKSwKKwlpbnRlcnNlY3Rfc29ydGVkX3ZhcnMoU29ydGVkMSwgU29ydGVkMiwgT3V0KS4KKworaW50ZXJzZWN0X3NvcnRlZF92YXJzKFtdLCBfLCBbXSkgOi0gIS4KK2ludGVyc2VjdF9zb3J0ZWRfdmFycyhfLCBbXSwgW10pLgoraW50ZXJzZWN0X3NvcnRlZF92YXJzKFtYfFhzXSwgW1l8WXNdLCBbWHxSc10pIDotIFggPT0gWSwgISwKKwlpbnRlcnNlY3Rfc29ydGVkX3ZhcnMoWHMsIFlzLCBScykuCitpbnRlcnNlY3Rfc29ydGVkX3ZhcnMoW1h8WHNdLCBbWXxZc10sIFJzKSA6LSBYIEA8IFksICEsCisJaW50ZXJzZWN0X3NvcnRlZF92YXJzKFhzLFtZfFlzXSxScykuCitpbnRlcnNlY3Rfc29ydGVkX3ZhcnMoW1h8WHNdLCBbWXxZc10sIFJzKSA6LSBYIEA+IFksICEsCisJaW50ZXJzZWN0X3NvcnRlZF92YXJzKFtYfFhzXSxZcyxScykuCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBVdGlsaXRpZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworJSUlIHByaW50CitwbDJhbV9lcnJvcihNKSA6LSBwbDJhbV9tZXNzYWdlKFsnKioqJywnUEwyQVNNJywnRVJST1InfE1dKS4KKworcGwyYW1fbWVzc2FnZShbXSkgOi0gbmwsIGZsdXNoX291dHB1dCh1c2VyX291dHB1dCkuCitwbDJhbV9tZXNzYWdlKFtNfE1zXSkgOi0gd3JpdGUoTSksIHdyaXRlKCcgJyksIHBsMmFtX21lc3NhZ2UoTXMpLgorCislJSUgZm9ybWF0Cittb2RlX2V4cHIoW10pLgorbW9kZV9leHByKFtNfE1zXSkgOi0gbm9udmFyKE0pLCBwbDJhbV9tZW1iZXIoTSwgWzosKywtLD9dKSwgISwgbW9kZV9leHByKE1zKS4KKworcHJlZHNwZWNfZXhwcihGL0EpIDotIGF0b20oRiksIGludGVnZXIoQSkuCisKKyUlJSBsaXN0CitwbDJhbV9hcHBlbmQoW10sIFpzLCBacykuCitwbDJhbV9hcHBlbmQoW1h8WHNdLCBZcywgW1h8WnNdKSA6LSBwbDJhbV9hcHBlbmQoWHMsIFlzLCBacykuCisKK3BsMmFtX3JldihMLCBSKSA6LSBwbDJhbV9yZXYoTCwgW10sIFIpLgorcGwyYW1fcmV2KFtdLCBSLCBSKS4KK3BsMmFtX3JldihbWHxMXSwgWSwgUikgOi0gcGwyYW1fcmV2KEwsIFtYfFldLCBSKS4KKworcGwyYW1fbWVtYmVyKFgsIFtYfF9dKS4KK3BsMmFtX21lbWJlcihYLCBbX3xZc10pIDotIHBsMmFtX21lbWJlcihYLCBZcykuCisKK3BsMmFtX21lbXEoWCwgW1l8X10pIDotIFg9PVksICEuCitwbDJhbV9tZW1xKFgsIFtffFlzXSkgOi0gcGwyYW1fbWVtcShYLCBZcykuCisKK2ZsYXR0ZW5fbGlzdChbXSkgLS0+ICEuCitmbGF0dGVuX2xpc3QoW0wxfEwyXSkgLS0+ICEsIGZsYXR0ZW5fbGlzdChMMSksIGZsYXR0ZW5fbGlzdChMMikuCitmbGF0dGVuX2xpc3QoTCkgLS0+IFtMXS4KKworZmxhdHRlbl9jb2RlKFtdKSAtLT4gIS4KK2ZsYXR0ZW5fY29kZShbKEw6IEMpfENvZGVdKSAtLT4gISwKKwlbTDogW11dLAorCWZsYXR0ZW5fY29kZShbQ3xDb2RlXSkuCitmbGF0dGVuX2NvZGUoW0NvZGUxfENvZGUyXSkgLS0+ICEsCisJZmxhdHRlbl9jb2RlKENvZGUxKSwKKwlmbGF0dGVuX2NvZGUoQ29kZTIpLgorZmxhdHRlbl9jb2RlKENvZGUpIC0tPiBbQ29kZV0uCisKKyUlJSB0cmFuc2Zvcm0KK2NvbmpfdG9fbGlzdChYLCBfKSA6LSAgdmFyKFgpLCAhLAorCXBsMmFtX2Vycm9yKFt2YXJpYWJsZSxYLGNhbixub3QsYmUsY29udmVydGVkLHRvLCdbQXxCXScsZXhwcmVzc2lvbl0pLAorCWZhaWwuCitjb25qX3RvX2xpc3QoKChYMSxYMiksWHMpLCBZKSA6LSAhLCBjb25qX3RvX2xpc3QoKFgxLChYMixYcykpLCBZKS4KK2NvbmpfdG9fbGlzdCgoWCxYcyksIFtYfFpzXSkgOi0gISwgY29ual90b19saXN0KFhzLCBacykuCitjb25qX3RvX2xpc3QoKFgpLCBbWF0pLgorCitsaXN0X3RvX3N0cmluZyhMaXN0LCBTdHJpbmcpIDotCisJbGlzdF90b19jaGFycyhMaXN0LCBDaGFyczApLAorCWZsYXR0ZW5fbGlzdChDaGFyczAsIENoYXJzLCBbXSksCisJYXRvbV9jb2RlcyhTdHJpbmcsIENoYXJzKS4KKworbGlzdF90b19jaGFycyhbXSwgW10pIDotICEuCitsaXN0X3RvX2NoYXJzKFtMfExzXSwgW0N8Q3NdKSA6LSBhdG9tKEwpLCAhLAorCWF0b21fY29kZXMoTCwgQyksCisJbGlzdF90b19jaGFycyhMcywgQ3MpLgorbGlzdF90b19jaGFycyhbTHxMc10sIFtDfENzXSkgOi0gbnVtYmVyKEwpLCAhLAorCW51bWJlcl9jb2RlcyhMLCBDKSwKKwlsaXN0X3RvX2NoYXJzKExzLCBDcykuCisKK2xpc3RfdG9fY29uaihYLCBZKSA6LQorCWZsYXR0ZW5fbGlzdChYLCBMLCBbXSksCisJbGlzdF90b19jb25qMChMLCBZKS4KKworbGlzdF90b19jb25qMChYLCBfKSA6LSB2YXIoWCksICEsCisJcGwyYW1fZXJyb3IoW3ZhcmlhYmxlLFgsY2FuLG5vdCxiZSxjb252ZXJ0ZWQsdG8sJyhBLEIpJyxleHByZXNzaW9uXSksCisJZmFpbC4KK2xpc3RfdG9fY29uajAoW1hdLCAoWCkpLgorbGlzdF90b19jb25qMChbWHxYc10sIChYLFlzKSkgOi0gISwgbGlzdF90b19jb25qMChYcywgWXMpLgorCislJSUgbWlzYwordmFyaWFibGVzKFgsIFZzKSA6LSB2YXJpYWJsZXMoWCwgW10sIFZzKS4KKwordmFyaWFibGVzKFgsIFZzLCBWcykgOi0gdmFyKFgpLCBwbDJhbV9tZW1xKFgsIFZzKSwgIS4KK3ZhcmlhYmxlcyhYLCBWcywgW1h8VnNdKSA6LSB2YXIoWCksICEuCit2YXJpYWJsZXMoWCwgVnMwLCBWczApIDotICBhdG9taWMoWCksICEuCit2YXJpYWJsZXMoW1h8WHNdLCBWczAsIFZzKSA6LSAhLCB2YXJpYWJsZXMoWCwgVnMwLCBWczEpLCB2YXJpYWJsZXMoWHMsIFZzMSwgVnMpLgordmFyaWFibGVzKFgsIFZzMCwgVnMpIDotIFggPS4uIFhzLCB2YXJpYWJsZXMoWHMsIFZzMCwgVnMpLgorCitjb3VudF92YXJpYWJsZShWLCBYLCAxKSA6LSBWID09IFgsICEuCitjb3VudF92YXJpYWJsZShfLCBYLCAwKSA6LSB2YXIoWCksICEuCitjb3VudF92YXJpYWJsZShfLCBYLCAwKSA6LSBhdG9taWMoWCksICEuCitjb3VudF92YXJpYWJsZShWLCBbWHxZXSwgTikgOi0gISwKKwljb3VudF92YXJpYWJsZShWLCBYLCBOMSksCisJY291bnRfdmFyaWFibGUoViwgWSwgTjIpLAorCU4gaXMgTjEgKyBOMi4KK2NvdW50X3ZhcmlhYmxlKFYsIFgsIE4pIDotCisJWCA9Li4gWHMsCisJY291bnRfdmFyaWFibGUoViwgWHMsIE4pLgorCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCisKKyUgRU5ECislIHdyaXR0ZW4gYnkgU0lDU3R1cyBQcm9sb2cgMy4xMi44CmRpZmYgLS1naXQgYS9zcmMvY29tcGlsZXIvcGwyYW0udHh0IGIvc3JjL2NvbXBpbGVyL3BsMmFtLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmZhZWU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvbXBpbGVyL3BsMmFtLnR4dApAQCAtMCwwICsxLDEzOCBAQAorIyEgL3Vzci9iaW4vcGVybAorcmVxdWlyZSAnZ2V0b3B0cy5wbCc7Cit1c2Ugc3RyaWN0OwordXNlIEdldG9wdDo6TG9uZzsKKworIyBvcHRpb25zCitteSBAb3B0bGlzdCA9ICgiaHxoZWxwISIsInZ8dmVyYm9zZSEiLCJjb3B0cz1zIiwiTyEiLCJKPXMiKTsKK215ICRyZXN1bHQgPSBHZXRPcHRpb25zIEBvcHRsaXN0Oworb3VyICgkb3B0X2gsICRvcHRfdiwgJG9wdF9jb3B0cywgJG9wdF9PLCAkb3B0X0opOworCisjIC1oIG9wdGlvbiB8fCBjaGVjayB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cworaWYgKCRvcHRfaCB8fCBAQVJHViAhPSAyICkgeworICAgIHVzYWdlKCk7CisgICAgZXhpdCAxOworfQorCisjIGxvY2FsIHZhcmlhYmxlcworbXkgJGVjaG8gPSAiL2Jpbi9lY2hvIjsKK215ICRjb3B0cyA9ICJbXSI7CitteSAkcHJvbG9nX2ZpbGUgPSAkQVJHVlswXTsKK215ICRhbV9maWxlID0gJEFSR1ZbMV07CisKK215ICVlbnY7CismaW5pdCgpOworCisjIC1jb3B0cyBvcHRpb24KK2lmICgkb3B0X2NvcHRzKSB7CisgICAgbXkgQHggPSAgc3BsaXQoIjoiLCAkb3B0X2NvcHRzKTsKKyAgICBmb3JlYWNoIChAeCkgeworCXMvXlxzKy8vOworCXMvXHMrJC8vOworICAgIH0KKyAgICBmb3JlYWNoIG15ICRvcCAoQHgpIHsKKwlpZiAoJG9wICF+IC9eZWR8YWN8aWV8cmN8aWR4fGNsbyQvKSB7CisJICAgICZlcnJvcigiaW52YWxpZCBvcHRpb24gZm91bmQsICRvcC4iKTsKKwl9CisgICAgfQorICAgICRjb3B0cyA9ICJbIiAuIGpvaW4oIiwiLCBAeCkgLiAiXSI7Cit9IAorCisjIC1PIG9wdGlvbgoraWYgKCRvcHRfTykgeworIyAgICAkY29wdHMgPSAiW2VkLGFjLGllLHJjLGlkeCxjbG9dIjsKKyAgICAkY29wdHMgPSAiW2VkLGFjLGllLHJjLGlkeF0iOworIyAgICAkY29wdHMgPSAiW2VkLGFjLGllLHJjXSI7Cit9CisKKyMgLUogb3B0aW9uCitpZiAoJG9wdF9KKSB7CisgICAgaWYgKCRvcHRfSiA9fiAvKC1jcHwtY2xhc3NwYXRoKVxzKy8pIHsKKwkmZXJyb3IoImNhbiBub3QgdXNlICQxIGluIC1KIG9wdGlvbiIpOworICAgIH0KKyAgICAkZW52eyJzeXN0ZW1fb3B0cyJ9IC49ICIgJG9wdF9KIjsKK30KKworIyBtYWluCitpZiAoISAtZSAkcHJvbG9nX2ZpbGUpIHsKKyAgICAmZXJyb3IoImZpbGUgJHByb2xvZ19maWxlIGRvZXMgbm90IGV4aXN0LiIpOworfQorCitteSAkYXJnOworaWYgKCRlbnZ7ImdvYWwifSkgeworICAgICRhcmcgLj0gJGVudnsiZ29hbCJ9IC4gIiAiOworfQorJGFyZyAuPSAiW1wnJHByb2xvZ19maWxlXCcsIFwnJGFtX2ZpbGVcJywgJGNvcHRzXS4iOworbXkgJGNtZCA9ICIkZWNobyBcIiRhcmdcIiB8ICIgLiAkZW52eyJzeXN0ZW0ifTsKK2lmICgkZW52eyJzeXN0ZW1fb3B0cyJ9KSB7CisgICAgJGNtZCAuPSAiICIgLiAkZW52eyJzeXN0ZW1fb3B0cyJ9OworfQoraWYgKCRlbnZ7InN5c3RlbV9hcmdzIn0pIHsKKyAgICAkY21kIC49ICIgIiAuICRlbnZ7InN5c3RlbV9hcmdzIn07Cit9CitpZiAoISAkb3B0X3YpIHsjIGNoZWNrIC12IG9wdGlvbgorICAgICRjbWQgLj0gIiAyPiAvZGV2L251bGwiOworfQorCismbWVzc2FnZSgie1NUQVJUIHRyYW5zbGF0aW5nICRwcm9sb2dfZmlsZSAtLT4gJGFtX2ZpbGV9Iik7CismbWVzc2FnZSgkY21kKTsKK3N5c3RlbSgkY21kKSAmJiBlcnJvcigidHJhbnNsYXRpb24gZmFpbHMiKTsKKyZtZXNzYWdlKCJ7RU5EIHRyYW5zbGF0aW5nICRwcm9sb2dfZmlsZSAtLT4gJGFtX2ZpbGV9XG4iKTsKKworZXhpdCAwOworCisjIHN1Ygorc3ViIHVzYWdlIHsKKyAgICBwcmludCAiXG5Vc2FnZTogJDAgWy1vcHRpb25zXSBwcm9sb2dfZmlsZSBhbV9maWxlXG4iOworICAgIHByaW50ICJcbiB3aGVyZSBvcHRpb25zIGluY2x1ZGU6XG4iOworICAgIHByaW50ICJcdC1oIC1oZWxwICAgICAgICAgOiBwcmludCB0aGlzIGhlbHAgbWVzc2FnZVxuIjsKKyAgICBwcmludCAiXHQtdiAtdmVyYm9zZSAgICAgIDogZW5hYmxlIHZlcmJvc2Ugb3V0cHV0XG4iOworICAgIHByaW50ICJcdC1jb3B0c1s6ZWR8YWN8cmN8aWV8aWR4fGNsb11cbiI7CisgICAgcHJpbnQgIlx0ICAgICAgICAgICAgICAgICA6IGVuYWJsZSBlYWNoIG9wdGltaXNlZCBjb21waWxhdGlvblxuIjsKKyAgICBwcmludCAiXHQgICAgICAgICAgICAgICAgIDogICBlZCAgPSBlbGltaW5hdGUgZGlzanVuY3Rpb25zXG4iOworICAgIHByaW50ICJcdCAgICAgICAgICAgICAgICAgOiAgIGFjICA9IGFyaXRobWV0aWMgY29tcGlsYXRpb25cbiI7CisgICAgcHJpbnQgIlx0ICAgICAgICAgICAgICAgICA6ICAgcmMgID0gb3B0aW1pc2UgcmVjdXJzaXZlIGNhbGxcbiI7CisgICAgcHJpbnQgIlx0ICAgICAgICAgICAgICAgICA6ICAgaWUgID0gaW5saW5lIGV4cGFuc2lvblxuIjsKKyAgICBwcmludCAiXHQgICAgICAgICAgICAgICAgIDogICBpZHggPSBzd2l0Y2hfb25faGFzaCAoMm5kLiBsZXZlbCBpbmRleGluZykgXG4iOworICAgIHByaW50ICJcdCAgICAgICAgICAgICAgICAgOiAgIGNsbyA9IGdlbmVyYXRlIGNsb3N1cmUgZm9yIG1ldGEgcHJlZGljYXRlc1xuIjsKKyAgICBwcmludCAiXHQtTyAgICAgICAgICAgICAgIDogZW5hYmxlIGFsbCBvcHRpbWlzZWQgY29tcGlsYXRpb25cbiI7CisgICAgcHJpbnQgIlx0LUogb3B0aW9uICAgICAgICA6IG9wdGlvbiBtdXN0IGJlIGVuY2xvc2VkIGJ5ICcuXG4iOworICAgIHByaW50ICJcdCAgICAgICAgICAgICAgICAgOiBwYXNzIG9wdGlvbiB0byB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmVcbiI7CisgICAgcHJpbnQgIlx0ICAgICAgICAgICAgICAgICA6IChleC4gLUogJy1YbXgxMDBtIC12ZXJib3NlOmdjJylcbiI7CisgICAgcHJpbnQgIlxuIjsKK30KKworc3ViIG1lc3NhZ2UgeworICAgIG15ICgkeCkgPSBAXzsKKyAgICBpZiAoJG9wdF92KSB7ICMgY2hlY2sgLXYgb3B0aW9uCisJcHJpbnQgIlwlICR4XG4iOworICAgIH0KK30KKworc3ViIGVycm9yIHsKKyAgICBteSAoJHgpID0gQF87CisgICAgcHJpbnQgIlwlIEVSUk9SOiAkeDogJDBcbiI7CisgICAgZXhpdCAxOworfQorCisjc3ViIGluaXQgeworIyAgICAlZW52ID0gKAorIwkiZ29hbCIsICAgICAgICAiIiwKKyMJInN5c3RlbSIsICAgICAgIi9Vc2Vycy9iYW5iYXJhL3Byb2cvcGxjYWZlL1Byb2xvZ0NhZmUwOTUvc3JjL2NvbXBpbGVyL3BsMmFtLnNhdiIsCisjCSJzeXN0ZW1fb3B0cyIsICIiLAorIwkic3lzdGVtX2FyZ3MiLCAiIiwKKyMJKTsKKyMgICAgJWVudiA9ICgKKyMJImdvYWwiLCAgICAgICAgImxvYWQoJy9Vc2Vycy9iYW5iYXJhL3Byb2cvcGxjYWZlL1Byb2xvZ0NhZmUwOTUvc3JjL2NvbXBpbGVyL3BsMmFtLnFsJyksIG1haW4uIiwKKyMJInN5c3RlbSIsICAgICAgInNpY3N0dXMiLAorIwkic3lzdGVtX29wdHMiLCAiIiwKKyMJInN5c3RlbV9hcmdzIiwgIiIsCisjCSk7CisjICAgICVlbnYgPSAoCisjCSJnb2FsIiwgICAgICAgICIiLAorIwkic3lzdGVtIiwgICAgICAiamF2YSIsCisjCSJzeXN0ZW1fb3B0cyIsICItY3AgXCRQTENBRkVESVIvcGxjYWZlLmphcjpcJENMQVNTUEFUSCIsCisjCSJzeXN0ZW1fYXJncyIsICJqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuUHJvbG9nTWFpbiBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmNvbXBpbGVyLnBsMmFtOm1haW4iLAorIwkpOworI30KKwpkaWZmIC0tZ2l0IGEvc3JjL2xhbmcvQXJpdGhtZXRpYy5qYXZhIGIvc3JjL2xhbmcvQXJpdGhtZXRpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0Mjk1ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGFuZy9Bcml0aG1ldGljLmphdmEKQEAgLTAsMCArMSwxNjcgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nOworLyoqCisgKiBUaGUgPGNvZGU+QXJpdGhtZXRpYzwvY29kZT4gY2xhc3MgY29udGFpbnMgYSBtZXRob2QKKyAqIGZvciBldmFsdWF0aW5nIGFyaXRobWV0aWMgZXhwcmVzc2lvbnMuPGJyPgorICogVGhpcyBjbGFzcyBpcyBtYWlubHkgdXNlZCBieSB0aGUgYnVpbHRpbiBwcmVkaWNhdGUgPGNvZGU+aXMvMjwvY29kZT4uCisgKgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBBcml0aG1ldGljIHsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fUkFORE9NICAgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJyYW5kb20iKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fUEkgICAgICAgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJwaSIpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9FICAgICAgICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woImUiKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fQUREXzEgICAgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCIrIiwgMSk7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gU1lNX05FR0FURV8xICAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiLSIsIDEpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9BRERfMiAgICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woIisiLCAyKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fU1VCVFJBQ1RfMiAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCItIiwgMik7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gU1lNX01VTFRJUExZXzIgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiKiIsIDIpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9ESVZJREVfMiAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woIi8iLCAyKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fSU5URElWSURFXzIgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCIvLyIsIDIpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9NT0RfMiAgICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woIm1vZCIsIDIpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9TSElGVExFRlRfMiAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woIjw8IiwgMik7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gU1lNX1NISUZUUklHSFRfMiA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiPj4iLCAyKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fTk9UXzEgICAgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJcXCIsIDEpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9BTkRfMiAgICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woIi9cXCIsIDIpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9PUl8yICAgICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woIlxcLyIsIDIpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9YT1JfMiAgICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woIiMiLCAyKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fUE9XXzIgICAgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCIqKiIsIDIpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9BQlNfMSAgICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woImFicyIsIDEpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9BQ09TXzEgICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woImFjb3MiLCAxKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fQVNJTl8xICAgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJhc2luIiwgMSk7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gU1lNX0FUQU5fMSAgICAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiYXRhbiIsIDEpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9DRUlMXzEgICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woImNlaWxpbmciLCAxKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fQ09TXzEgICAgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJjb3MiLCAxKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fREVHUkVFU18xICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJkZWdyZWVzIiwgMSk7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gU1lNX0VYUF8xICAgICAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiZXhwIiwgMSk7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gU1lNX0ZMT09SXzEgICAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiZmxvb3IiLCAxKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fTE9HXzEgICAgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJsb2ciLCAxKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fTUFYXzIgICAgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJtYXgiLCAyKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fTUlOXzIgICAgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJtaW4iLCAyKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fUkFESUFOU18xICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJyYWRpYW5zIiwgMSk7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gU1lNX1JJTlRfMSAgICAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgicmludCIsIDEpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9ST1VORF8xICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woInJvdW5kIiwgMSk7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gU1lNX1NJTl8xICAgICAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgic2luIiwgMSk7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gU1lNX1NRUlRfMSAgICAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgic3FydCIsIDEpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9UQU5fMSAgICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woInRhbiIsIDEpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9SRU1fMiAgICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woInJlbSIsIDIpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9TSUdOXzEgICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woInNpZ24iLCAxKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fRkxPQVRfMSAgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJmbG9hdCIsIDEpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9JTlRQQVJUXzEgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woImZsb2F0X2ludGVnZXJfcGFydCIsIDEpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9GUkFDVFBBUlRfMSAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woImZsb2F0X2ZyYWN0aW9uYWxfcGFydCIsIDEpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9UUlVOQ0FURV8xICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woInRydW5jYXRlIiwgMSk7CisKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZXMgPGNvZGU+X3Q8L2NvZGU+IGFzIGFuIGFyaXRobWV0aWMgZXhwcmVzc2lvbiwgCisgICAgICogYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyBudW1iZXIgYXMgPGNvZGU+TnVtYmVyVGVybTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGlmIDxjb2RlPl90PC9jb2RlPiBjb250YWlucyB1bmJvdW5kIHZhcmlhYmxlcy4KKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxEb21haW5FeGNlcHRpb24gaWYgPGNvZGU+X3Q8L2NvZGU+IGlzIG5vdCBhbiBhcml0aG1ldGljIGV4cHJlc3Npb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXJUZXJtIGV2YWx1YXRlKFRlcm0gX3QpIAorCXRocm93cyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbixJbGxlZ2FsRG9tYWluRXhjZXB0aW9uIHsKKwlUZXJtIHQgPSBfdC5kZXJlZmVyZW5jZSgpOworCisJaWYgKHQuaXNWYXJpYWJsZSgpKQorCSAgICB0aHJvdyBuZXcgUEluc3RhbnRpYXRpb25FeGNlcHRpb24oKTsKKwllbHNlIGlmICh0LmlzSW50ZWdlcigpKQorCSAgICByZXR1cm4gKEludGVnZXJUZXJtKXQ7CisJZWxzZSBpZiAodC5pc0RvdWJsZSgpKQorCSAgICByZXR1cm4gKERvdWJsZVRlcm0pdDsKKwllbHNlIGlmICh0LmVxdWFscyhTWU1fUkFORE9NKSkKKwkgICAgcmV0dXJuIG5ldyBEb3VibGVUZXJtKE1hdGgucmFuZG9tKCkpOworCWVsc2UgaWYgKHQuZXF1YWxzKFNZTV9QSSkpCisJICAgIHJldHVybiBuZXcgRG91YmxlVGVybShNYXRoLlBJKTsKKwllbHNlIGlmICh0LmVxdWFscyhTWU1fRSkpCisJICAgIHJldHVybiBuZXcgRG91YmxlVGVybShNYXRoLkUpOworCWVsc2UgaWYgKHQuaXNMaXN0KCkpCisJICAgIHJldHVybiBldmFsdWF0ZSgoKExpc3RUZXJtKXQpLmNhcigpKTsKKwllbHNlIGlmICghIHQuaXNTdHJ1Y3R1cmUoKSkgCisJICAgIHRocm93IG5ldyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uKCJhcml0aG1ldGljIGV4cHJlc3Npb24iLCB0KTsKKworCVN5bWJvbFRlcm0gZnVuYyA9ICgoU3RydWN0dXJlVGVybSl0KS5mdW5jdG9yKCk7CisJVGVybVtdIGFyZ3MgPSAoKFN0cnVjdHVyZVRlcm0pdCkuYXJncygpOworCisJaWYgKGZ1bmMuZXF1YWxzKFNZTV9BRERfMSkpCisJICAgIHJldHVybiBldmFsdWF0ZShhcmdzWzBdKTsKKwllbHNlIGlmIChmdW5jLmVxdWFscyhTWU1fTkVHQVRFXzEpKQorCSAgICByZXR1cm4gZXZhbHVhdGUoYXJnc1swXSkubmVnYXRlKCk7CisJZWxzZSBpZiAoZnVuYy5lcXVhbHMoU1lNX0FERF8yKSkKKwkgICAgcmV0dXJuIGV2YWx1YXRlKGFyZ3NbMF0pLmFkZChldmFsdWF0ZShhcmdzWzFdKSk7CisJZWxzZSBpZiAoZnVuYy5lcXVhbHMoU1lNX1NVQlRSQUNUXzIpKQorCSAgICByZXR1cm4gZXZhbHVhdGUoYXJnc1swXSkuc3VidHJhY3QoZXZhbHVhdGUoYXJnc1sxXSkpOworCWVsc2UgaWYgKGZ1bmMuZXF1YWxzKFNZTV9NVUxUSVBMWV8yKSkKKwkgICAgcmV0dXJuIGV2YWx1YXRlKGFyZ3NbMF0pLm11bHRpcGx5KGV2YWx1YXRlKGFyZ3NbMV0pKTsKKwllbHNlIGlmIChmdW5jLmVxdWFscyhTWU1fSU5URElWSURFXzIpKQorCSAgICByZXR1cm4gZXZhbHVhdGUoYXJnc1swXSkuaW50RGl2aWRlKGV2YWx1YXRlKGFyZ3NbMV0pKTsKKwllbHNlIGlmIChmdW5jLmVxdWFscyhTWU1fRElWSURFXzIpKQorCSAgICByZXR1cm4gZXZhbHVhdGUoYXJnc1swXSkuZGl2aWRlKGV2YWx1YXRlKGFyZ3NbMV0pKTsKKwllbHNlIGlmIChmdW5jLmVxdWFscyhTWU1fTU9EXzIpKQorCSAgICByZXR1cm4gZXZhbHVhdGUoYXJnc1swXSkubW9kKGV2YWx1YXRlKGFyZ3NbMV0pKTsKKwllbHNlIGlmIChmdW5jLmVxdWFscyhTWU1fUkVNXzIpKQorCSAgICByZXR1cm4gZXZhbHVhdGUoYXJnc1swXSkubW9kKGV2YWx1YXRlKGFyZ3NbMV0pKTsKKwllbHNlIGlmIChmdW5jLmVxdWFscyhTWU1fQU5EXzIpKQorCSAgICByZXR1cm4gZXZhbHVhdGUoYXJnc1swXSkuYW5kKGV2YWx1YXRlKGFyZ3NbMV0pKTsKKwllbHNlIGlmIChmdW5jLmVxdWFscyhTWU1fT1JfMikpCisJICAgIHJldHVybiBldmFsdWF0ZShhcmdzWzBdKS5vcihldmFsdWF0ZShhcmdzWzFdKSk7CisJZWxzZSBpZiAoZnVuYy5lcXVhbHMoU1lNX1hPUl8yKSkKKwkgICAgcmV0dXJuIGV2YWx1YXRlKGFyZ3NbMF0pLnhvcihldmFsdWF0ZShhcmdzWzFdKSk7CisJZWxzZSBpZiAoZnVuYy5lcXVhbHMoU1lNX05PVF8xKSkKKwkgICAgcmV0dXJuIGV2YWx1YXRlKGFyZ3NbMF0pLm5vdCgpOworCWVsc2UgaWYgKGZ1bmMuZXF1YWxzKFNZTV9TSElGVExFRlRfMikpCisJICAgIHJldHVybiBldmFsdWF0ZShhcmdzWzBdKS5zaGlmdExlZnQoZXZhbHVhdGUoYXJnc1sxXSkpOworCWVsc2UgaWYgKGZ1bmMuZXF1YWxzKFNZTV9TSElGVFJJR0hUXzIpKQorCSAgICByZXR1cm4gZXZhbHVhdGUoYXJnc1swXSkuc2hpZnRSaWdodChldmFsdWF0ZShhcmdzWzFdKSk7CisJZWxzZSBpZiAoZnVuYy5lcXVhbHMoU1lNX0FCU18xKSkKKwkgICAgcmV0dXJuIGV2YWx1YXRlKGFyZ3NbMF0pLmFicygpOworCWVsc2UgaWYgKGZ1bmMuZXF1YWxzKFNZTV9NSU5fMikpCisJICAgIHJldHVybiBldmFsdWF0ZShhcmdzWzBdKS5taW4oZXZhbHVhdGUoYXJnc1sxXSkpOworCWVsc2UgaWYgKGZ1bmMuZXF1YWxzKFNZTV9NQVhfMikpCisJICAgIHJldHVybiBldmFsdWF0ZShhcmdzWzBdKS5tYXgoZXZhbHVhdGUoYXJnc1sxXSkpOworCWVsc2UgaWYgKGZ1bmMuZXF1YWxzKFNZTV9SSU5UXzEpKQorCSAgICByZXR1cm4gZXZhbHVhdGUoYXJnc1swXSkucmludCgpOworCWVsc2UgaWYgKGZ1bmMuZXF1YWxzKFNZTV9ST1VORF8xKSkKKwkgICAgcmV0dXJuIGV2YWx1YXRlKGFyZ3NbMF0pLnJvdW5kKCk7CisJZWxzZSBpZiAoZnVuYy5lcXVhbHMoU1lNX0ZMT09SXzEpKQorCSAgICByZXR1cm4gZXZhbHVhdGUoYXJnc1swXSkuZmxvb3IoKTsKKwllbHNlIGlmIChmdW5jLmVxdWFscyhTWU1fQ0VJTF8xKSkKKwkgICAgcmV0dXJuIGV2YWx1YXRlKGFyZ3NbMF0pLmNlaWwoKTsKKwllbHNlIGlmIChmdW5jLmVxdWFscyhTWU1fU0lOXzEpKQorCSAgICByZXR1cm4gZXZhbHVhdGUoYXJnc1swXSkuc2luKCk7CisJZWxzZSBpZiAoZnVuYy5lcXVhbHMoU1lNX0NPU18xKSkKKwkgICAgcmV0dXJuIGV2YWx1YXRlKGFyZ3NbMF0pLmNvcygpOworCWVsc2UgaWYgKGZ1bmMuZXF1YWxzKFNZTV9UQU5fMSkpCisJICAgIHJldHVybiBldmFsdWF0ZShhcmdzWzBdKS50YW4oKTsKKwllbHNlIGlmIChmdW5jLmVxdWFscyhTWU1fQVNJTl8xKSkKKwkgICAgcmV0dXJuIGV2YWx1YXRlKGFyZ3NbMF0pLmFzaW4oKTsKKwllbHNlIGlmIChmdW5jLmVxdWFscyhTWU1fQUNPU18xKSkKKwkgICAgcmV0dXJuIGV2YWx1YXRlKGFyZ3NbMF0pLmFjb3MoKTsKKwllbHNlIGlmIChmdW5jLmVxdWFscyhTWU1fQVRBTl8xKSkKKwkgICAgcmV0dXJuIGV2YWx1YXRlKGFyZ3NbMF0pLmF0YW4oKTsKKwllbHNlIGlmIChmdW5jLmVxdWFscyhTWU1fU1FSVF8xKSkKKwkgICAgcmV0dXJuIGV2YWx1YXRlKGFyZ3NbMF0pLnNxcnQoKTsKKwllbHNlIGlmIChmdW5jLmVxdWFscyhTWU1fTE9HXzEpKQorCSAgICByZXR1cm4gZXZhbHVhdGUoYXJnc1swXSkubG9nKCk7CisJZWxzZSBpZiAoZnVuYy5lcXVhbHMoU1lNX0VYUF8xKSkKKwkgICAgcmV0dXJuIGV2YWx1YXRlKGFyZ3NbMF0pLmV4cCgpOworCWVsc2UgaWYgKGZ1bmMuZXF1YWxzKFNZTV9QT1dfMikpCisJICAgIHJldHVybiBldmFsdWF0ZShhcmdzWzBdKS5wb3coZXZhbHVhdGUoYXJnc1sxXSkpOworCWVsc2UgaWYgKGZ1bmMuZXF1YWxzKFNZTV9ERUdSRUVTXzEpKQorCSAgICByZXR1cm4gZXZhbHVhdGUoYXJnc1swXSkudG9EZWdyZWVzKCk7CisJZWxzZSBpZiAoZnVuYy5lcXVhbHMoU1lNX1JBRElBTlNfMSkpCisJICAgIHJldHVybiBldmFsdWF0ZShhcmdzWzBdKS50b1JhZGlhbnMoKTsKKwllbHNlIGlmIChmdW5jLmVxdWFscyhTWU1fU0lHTl8xKSkKKwkgICAgcmV0dXJuIGV2YWx1YXRlKGFyZ3NbMF0pLnNpZ251bSgpOworCWVsc2UgaWYgKGZ1bmMuZXF1YWxzKFNZTV9GTE9BVF8xKSkKKwkgICAgcmV0dXJuIGV2YWx1YXRlKGFyZ3NbMF0pLnRvRmxvYXQoKTsKKwllbHNlIGlmIChmdW5jLmVxdWFscyhTWU1fSU5UUEFSVF8xKSkKKwkgICAgcmV0dXJuIGV2YWx1YXRlKGFyZ3NbMF0pLmZsb2F0SW50UGFydCgpOworCWVsc2UgaWYgKGZ1bmMuZXF1YWxzKFNZTV9GUkFDVFBBUlRfMSkpCisJICAgIHJldHVybiBldmFsdWF0ZShhcmdzWzBdKS5mbG9hdEZyYWN0UGFydCgpOworCWVsc2UgaWYgKGZ1bmMuZXF1YWxzKFNZTV9UUlVOQ0FURV8xKSkKKwkgICAgcmV0dXJuIGV2YWx1YXRlKGFyZ3NbMF0pLnRydW5jYXRlKCk7CisJZWxzZQorCSAgICB0aHJvdyBuZXcgSWxsZWdhbERvbWFpbkV4Y2VwdGlvbigiYXJpdGhtZXRpYyBleHByZXNzaW9uIiwgdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2xhbmcvQmxvY2tQcmVkaWNhdGUuamF2YSBiL3NyYy9sYW5nL0Jsb2NrUHJlZGljYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2OTZlYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sYW5nL0Jsb2NrUHJlZGljYXRlLmphdmEKQEAgLTAsMCArMSwyMiBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmc7CisvKioKKyAqIFRoZSA8Y29kZT5CbG9ja1ByZWRpY2F0ZTwvY29kZT4gY2xhc3MgaXMgdXNlZCB0byBpbXBsZW1lbnQKKyAqIGJ1aWx0aW4tcHJlZGljYXRlcy4gRm9yIGV4YW1wbGUsCisgKiA8dWw+CisgKiA8bGk+PGNvZGU+Y2F0Y2gvMzwvY29kZT4KKyAqIDxsaT48Y29kZT5zeW5jaHJvbml6ZWQvMjwvY29kZT4gKFByb2xvZyBDYWZlIHNwZWNpZmljKQorICogPC91bD4KKyAqIDxmb250IGNvbG9yPSJyZWQiPlRoaXMgZG9jdW1lbnQgaXMgdW5kZXIgY29uc3RydWN0aW9uLjwvZm9udD4KKyAqCisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJsb2NrUHJlZGljYXRlIGV4dGVuZHMgUHJlZGljYXRlIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBvdXRPZlNjb3BlID0gZmFsc2U7CisgICAgcHVibGljIGJvb2xlYW4gb3V0T2ZMb29wICA9IGZhbHNlOworfQorCisKKworCmRpZmYgLS1naXQgYS9zcmMvbGFuZy9CdWlsdGluRXhjZXB0aW9uLmphdmEgYi9zcmMvbGFuZy9CdWlsdGluRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJmZTg2MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sYW5nL0J1aWx0aW5FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZzsKKy8qKgorICogQnVpbHRpbiBleGNlcHRpb24uPGJyPgorICoKKyAqCisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIEJ1aWx0aW5FeGNlcHRpb24gZXh0ZW5kcyBQcm9sb2dFeGNlcHRpb24geworICAgIFRlcm0gbWVzc2FnZTsKKworICAgIC8qKiBIb2xkcyB0aGUgZ29hbCBpbiB3aGljaCB0aGlzIGV4Y2VwdGlvbiBvY2N1cnMuICovCisgICAgcHVibGljIFByZWRpY2F0ZSBnb2FsID0gbnVsbDsKKworICAgIC8qKiBIb2xkcyB0aGUgYXJpdHkgb2YgZ29hbCBpbiB3aGljaCB0aGlzIGV4Y2VwdGlvbiBvY2N1cnMuICovCisgICAgcHVibGljIGludCBhcmdObyA9IDA7CisKKyAgICAvKiogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5CdWlsdGluRXhjZXB0aW9uPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgQnVpbHRpbkV4Y2VwdGlvbigpe30KKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkJ1aWx0aW5FeGNlcHRpb248L2NvZGU+IHdpdGggYSBnaXZlbiBtZXNzYWdlIHRlcm0uICovCisgICAgcHVibGljIEJ1aWx0aW5FeGNlcHRpb24oVGVybSBfbWVzc2FnZSl7CisJbWVzc2FnZSA9IF9tZXNzYWdlOworICAgIH0KKworICAgIHB1YmxpYyBUZXJtIGdldE1lc3NhZ2VUZXJtKCkgeworCXJldHVybiBtZXNzYWdlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9sYW5nL0NQRlN0YWNrLmphdmEgYi9zcmMvbGFuZy9DUEZTdGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZTMyOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGFuZy9DUEZTdGFjay5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZzsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKy8qKgorICogQ2hvaWNlIHBvaW50IGZyYW1lLjxicj4KKyAqCisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyAqLworY2xhc3MgQ1BGRW50cnkgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICAgIHB1YmxpYyBsb25nIHRpbWVTdGFtcDsKKyAgICBwdWJsaWMgVGVybVtdIGFyZ3M7ICAgICAvLyBhcmd1bWVudCByZWdpc3RlcgorICAgIHB1YmxpYyBQcmVkaWNhdGUgY29udDsgIC8vIGNvbnRpbnVhdGlvbiBnb2FsCisgICAgcHVibGljIFByZWRpY2F0ZSBicDsgICAgLy8gbmV4dCBjbHVhc2UKKyAgICBwdWJsaWMgaW50IHRyOyAgICAgICAgICAvLyB0cmFpbCBwb2ludGVyCisgICAgcHVibGljIGludCBiMDsgICAgICAgICAgLy8gY3V0IHBvaW50CisKKyAgICBwcm90ZWN0ZWQgQ1BGRW50cnkoVGVybVtdIGFyZ3MsIFByZWRpY2F0ZSBjb250KXsKKwl0aGlzLmFyZ3MgPSBhcmdzOworCXRoaXMuY29udCA9IGNvbnQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmcgdCA9ICIgdGltZToiICsgdGltZVN0YW1wICsgIlxuIiA7CisJdCA9IHQgKyAiYXJnczoiOworCWZvciAoaW50IGk9MDsgaTxhcmdzLmxlbmd0aDsgaSsrKSB7CisJICAgIHQgPSB0ICsgYXJnc1tpXSArICIgIjsKKwl9CisJdCA9IHQgKyAiXG4iOworCXQgPSB0ICsgIiBjb250OiIgKyBjb250ICsgIlxuIjsKKwl0ID0gdCArICIgYnA6IiArIGJwICsgIlxuIjsKKwl0ID0gdCArICIgdHI6IiArIHRyICsgIlxuIjsKKwl0ID0gdCArICIgYjA6IiArIGIwICsgIlxuIjsKKwlyZXR1cm4gdDsKKyAgICB9Cit9CisKKy8qKgorICogQ2hvaWNlIHBvaW50IGZyYW1lIHN0YWNrLjxicj4KKyAqIFRoZSA8Y29kZT5DUEZTdGFjazwvY29kZT4gY2xhc3MgcmVwcmVzZW50cyBhIHN0YWNrCisgKiBvZiBjaG9pY2UgcG9pbnQgZnJhbWVzLjxicj4KKyAqIEVhY2ggY2hvaWNlIHBvaW50IGZyYW1lIGhhcyB0aGUgZm9sbG93aW5nIGZpZWxkczoKKyAqIDx1bD4KKyAqIDxsaT48ZW0+YXJndW1lbnRzPC9lbT4KKyAqIDxsaT48ZW0+Y29udGludWF0aW9uIGdvYWw8L2VtPgorICogPGxpPjxlbT5uZXh0IGNsYXVzZTwvZW0+CisgKiA8bGk+PGVtPnRyYWlsIHBvaW50ZXI8L2VtPgorICogPGxpPjxlbT5jdXQgcG9pbnQ8L2VtPgorICogPGxpPjxlbT50aW1lIHN0YW1wPC9lbT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBDUEZTdGFjayBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgLyoqIE1heGltdW0gc2l6ZSBvZiBlbnRpZXMuIEluaXRpYWwgc2l6ZSBpcyA8Y29kZT4yMDAwMDwvY29kZT4uICovCisgICAgcHJvdGVjdGVkIGludCBtYXhDb250ZW50cyA9IDIwMDAwOworCisgICAgLyoqIEFuIGFycmF5IG9mIGNob2ljZSBwb2ludCBmcmFtZXMuICovCisgICAgcHJvdGVjdGVkIENQRkVudHJ5W10gYnVmZmVyOworCisgICAgLyoqIHRoZSB0b3AgaW5kZXggb2YgdGhpcyA8Y29kZT5DUEZTdGFjazwvY29kZT4uICovCisgICAgcHJvdGVjdGVkIGludCB0b3A7CisKKyAgICAvKiogSG9sZHMgdGhlIFByb2xvZyBlbmdpbmUgdGhhdCB0aGlzIDxjb2RlPkNQRlN0YWNrPC9jb2RlPiBiZWxvbmdzIHRvLiAqLworICAgIHByb3RlY3RlZCBQcm9sb2cgZW5naW5lOworCQorICAgIC8qKiBDb25zdHJ1Y3RzIGEgbmV3IGNob2ljZSBwb2ludCBmcmFtZSBzdGFjay4gKi8KKyAgICBwdWJsaWMgQ1BGU3RhY2soUHJvbG9nIF9lbmdpbmUpIHsKKwllbmdpbmUgPSBfZW5naW5lOworCWJ1ZmZlciA9IG5ldyBDUEZFbnRyeVttYXhDb250ZW50c107CisJdG9wID0gLTE7CisgICAgfQorCisgICAgLyoqIENvbnN0cnVjdHMgYSBuZXcgY2hvaWNlIHBvaW50IGZyYW1lIHN0YWNrIHdpdGggdGhlIGdpdmVuIHNpemUuICovCisgICAgcHVibGljIENQRlN0YWNrKFByb2xvZyBfZW5naW5lLCBpbnQgbikgeworCWVuZ2luZSA9IF9lbmdpbmU7CisJbWF4Q29udGVudHMgPSBuOworCWJ1ZmZlciA9IG5ldyBDUEZFbnRyeVttYXhDb250ZW50c107CisJdG9wID0gLTE7CisgICAgfQorCisgICAgLyoqIENyZWF0ZSBhIG5ldyBjaG9pY2UgcG9pbnQgZnJhbWUuCisgICAgICogQHBhcmFtIGFyZ3MgPGVtPmFyZ3VtZW50czwvZW0+CisgICAgICogQHBhcmFtIHAgYSA8ZW0+Y29udGludWF0aW9uIGdvYWw8L2VtPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNyZWF0ZShUZXJtW10gYXJncywgUHJlZGljYXRlIHApeworCXRyeSB7CisJICAgIGJ1ZmZlclsrK3RvcF0gPSBuZXcgQ1BGRW50cnkoYXJncywgcCk7CisJfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKwkgICAgU3lzdGVtLm91dC5wcmludGxuKCJ7ZXhwYW5kaW5nIGNob2ljZSBwb2ludCBzdGFjay4uLn0iKTsKKwkgICAgaW50IGxlbiA9IGJ1ZmZlci5sZW5ndGg7CisJICAgIENQRkVudHJ5W10gbmV3X2J1ZmZlciA9IG5ldyBDUEZFbnRyeVtsZW4rMTAwMDBdOworCSAgICBmb3IoaW50IGk9MDsgaTxsZW47IGkrKykgeworCQluZXdfYnVmZmVyW2ldID0gYnVmZmVyW2ldOworCSAgICB9CisJICAgIGJ1ZmZlciA9IG5ld19idWZmZXI7CisJICAgIGJ1ZmZlclt0b3BdID0gbmV3IENQRkVudHJ5KGFyZ3MsIHApOworCSAgICBtYXhDb250ZW50cyA9IGxlbisxMDAwMDsKKwl9CisgICAgfQorCisgICAgLyoqIERpc2NhcmRzIGFsbCBjaG9pY2UgcG9pbnRzLiAqLworICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUFsbCgpIHsgCisJd2hpbGUgKCEgZW1wdHkoKSkgeworCSAgICBidWZmZXJbdG9wLS1dID0gbnVsbDsKKwl9CisgICAgfQorCisgICAgLyoqIERpc2NhcmRzIGFsbCBjaG9pY2UgcG9pbnRzIGFmdGVyIHRoZSB2YWx1ZSBvZiA8Y29kZT5pPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgdm9pZCBjdXQoaW50IGkpIHsKKwl3aGlsZSAodG9wID4gaSkgeworCSAgICBidWZmZXJbdG9wLS1dID0gbnVsbDsKKwl9CisgICAgfQorCisgICAgLyoqIERpc2NhcmRzIHRoZSB0b3Agb2YgY2hvaWNlIHBvaW50cy4gKi8KKyAgICBwdWJsaWMgdm9pZCBkZWxldGUoKSB7IGJ1ZmZlclt0b3AtLV0gPSBudWxsOyB9CisKKyAgICAvKiogRGlzY2FyZHMgYWxsIGNob2ljZSBwb2ludHMuICovCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHsgZGVsZXRlQWxsKCk7IH0KKworICAgIC8qKiBUZXN0cyBpZiB0aGlzIHN0YWNrIGhhcyBubyBlbnRyeS4gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlbXB0eSgpIHsgcmV0dXJuIHRvcCA9PSAtMTsgfQorCisgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIG9mIDxjb2RlPnRvcDwvY29kZT4uIAorICAgICAqIEBzZWUgI3RvcAorICAgICAqLworICAgIHB1YmxpYyBpbnQgdG9wKCkgeyByZXR1cm4gdG9wOyB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgb2YgPGNvZGU+bWF4Q29udGVudHM8L2NvZGU+LiAKKyAgICAgKiBAc2VlICNtYXhDb250ZW50cworICAgICAqLworICAgIHB1YmxpYyBpbnQgbWF4KCkgeyByZXR1cm4gbWF4Q29udGVudHM7IH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSA8ZW0+YXJndW1lbnRzPC9lbT4gb2YgY3VycmVudCBjaG9pY2UgcG9pbnQgZnJhbWUuICovCisgICAgcHVibGljIFRlcm1bXSBnZXRBcmdzKCkgeyByZXR1cm4gYnVmZmVyW3RvcF0uYXJnczsgfQorCisgICAgLyoqIFJldHVybnMgdGhlIDxlbT5jb250aW51YXRpb24gZ29hbDwvZW0+IG9mIGN1cnJlbnQgY2hvaWNlIHBvaW50IGZyYW1lLiAqLworICAgIHB1YmxpYyBQcmVkaWNhdGUgZ2V0Q29udCgpIHsgcmV0dXJuIGJ1ZmZlclt0b3BdLmNvbnQ7IH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSA8ZW0+dGltZSBzdGFtcDwvZW0+IG9mIGN1cnJlbnQgY2hvaWNlIHBvaW50IGZyYW1lLiAqLworICAgIHB1YmxpYyBsb25nIGdldFRpbWVTdGFtcCgpIHsgcmV0dXJuIGJ1ZmZlclt0b3BdLnRpbWVTdGFtcDsgfQorICAgIC8qKiBTZXRzIHRoZSA8ZW0+dGltZSBzdGFtcDwvZW0+IG9mIGN1cnJlbnQgY2hvaWNlIHBvaW50IGZyYW1lLiAqLworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVTdGFtcChsb25nIHQpIHsgYnVmZmVyW3RvcF0udGltZVN0YW1wID0gdDsgfQorICAgIAorICAgIC8qKiBSZXR1cm5zIHRoZSA8ZW0+bmV4dCBjbGF1c2U8L2VtPiBvZiBjdXJyZW50IGNob2ljZSBwb2ludCBmcmFtZS4gKi8KKyAgICBwdWJsaWMgUHJlZGljYXRlIGdldEJQKCkgeyByZXR1cm4gYnVmZmVyW3RvcF0uYnA7IH0KKyAgICAvKiogU2V0cyB0aGUgPGVtPm5leHQgY2xhdXNlPC9lbT4gb2YgY3VycmVudCBjaG9pY2UgcG9pbnQgZnJhbWUuICovCisgICAgcHVibGljIHZvaWQgc2V0QlAoUHJlZGljYXRlIHApIHsgYnVmZmVyW3RvcF0uYnAgPSBwOyB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgPGVtPnRyYWlsIHBvaW50ZXI8L2VtPiBvZiBjdXJyZW50IGNob2ljZSBwb2ludCBmcmFtZS4gKi8KKyAgICBwdWJsaWMgaW50IGdldFRSKCkgeyByZXR1cm4gYnVmZmVyW3RvcF0udHI7IH0KKyAgICAvKiogU2V0cyB0aGUgPGVtPnRyYWlsIHBvaW50ZXI8L2VtPiBvZiBjdXJyZW50IGNob2ljZSBwb2ludCBmcmFtZS4gKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUUihpbnQgaSkgeyBidWZmZXJbdG9wXS50ciA9IGk7IH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSA8ZW0+Y3V0IHBvaW50PC9lbT4gb2YgY3VycmVudCBjaG9pY2UgcG9pbnQgZnJhbWUuICovCisgICAgcHVibGljIGludCBnZXRCMCgpIHsgcmV0dXJuIGJ1ZmZlclt0b3BdLmIwOyB9CisgICAgLyoqIFNldHMgdGhlIDxlbT5jdXQgcG9pbnQ8L2VtPiBvZiBjdXJyZW50IGNob2ljZSBwb2ludCBmcmFtZS4gKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCMChpbnQgaSkgeyBidWZmZXJbdG9wXS5iMCA9IGk7IH0KKworICAgIC8qKiBTaG93cyB0aGUgY29udGVudHMgb2YgdGhpcyA8Y29kZT5DUEZTdGFjazwvY29kZT4uICovCisgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKwlpZiAoZW1wdHkoKSkgeworCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIntjaG9pY2UgcG9pbnQgc3RhY2sgaXMgZW1wdHkhfSIpOworCSAgICByZXR1cm47CisJfQorCWZvciAoaW50IGk9MDsgaTw9dG9wOyBpKyspIHsKKwkgICAgU3lzdGVtLm91dC5wcmludCgic3RhY2tbIiArIGkgKyAiXTogIik7CisJICAgIFN5c3RlbS5vdXQucHJpbnRsbihidWZmZXJbaV0pOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbGFuZy9DbG9zdXJlVGVybS5qYXZhIGIvc3JjL2xhbmcvQ2xvc3VyZVRlcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODI5YWE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xhbmcvQ2xvc3VyZVRlcm0uamF2YQpAQCAtMCwwICsxLDc2IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZzsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKy8qKgorICogQ2xvc3VyZS48YnI+CisgKiBUaGUgY2xhc3MgPGNvZGU+Q2xvc3VyZVRlcm08L2NvZGU+IHJlcHJlc2VudHMgYSBjbG9zdXJlIHN0cnVjdHVyZS48YnI+CisgKgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBDbG9zdXJlVGVybSBleHRlbmRzIFRlcm0geworICAgIC8qKiBIb2xkcyBhIDxjb2RlPlByZWRpY2F0ZTwvY29kZT4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhIFByb2xvZyBnb2FsLiAqLworICAgIHByb3RlY3RlZCBQcmVkaWNhdGUgY29kZTsKKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgbmV3IGNsb3N1cmUgc3RydWN0dXJlIGZvciB0aGUgZ2l2ZW4gUHJvbG9nIGdvYWwuICovCisgICAgcHVibGljIENsb3N1cmVUZXJtKFByZWRpY2F0ZSBfY29kZSkgeyBjb2RlID0gX2NvZGU7IH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSBQcm9sb2cgZ29hbCBvZiB0aGlzIDxjb2RlPkNsb3N1cmVUZXJtPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgUHJlZGljYXRlIGdldENvZGUoKSB7IHJldHVybiBjb2RlOyB9CisKKyAgICAvKiBUZXJtICovCisgICAgcHVibGljIGJvb2xlYW4gdW5pZnkoVGVybSB0LCBUcmFpbCB0cmFpbCkgeworCS8vCXQgPSB0LmRlcmVmZXJlbmNlKCk7CisJaWYgKHQuaXNWYXJpYWJsZSgpKQorCSAgICByZXR1cm4gKChWYXJpYWJsZVRlcm0pdCkudW5pZnkodGhpcywgdHJhaWwpOworCWlmICghIHQuaXNDbG9zdXJlKCkpCisJICAgIHJldHVybiBmYWxzZTsKKwlyZXR1cm4gY29kZS5lcXVhbHMoKChDbG9zdXJlVGVybSl0KS5jb2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvUXVvdGVkU3RyaW5nKCkgeyByZXR1cm4gdG9TdHJpbmcoKTsgfQorCisgICAgLyogT2JqZWN0ICovCisgICAgLyoqCisgICAgICogQ2hlY2tzIDxlbT50ZXJtIGVxdWFsaXR5PC9lbT4gb2YgdHdvIHRlcm1zLgorICAgICAqIFRoZSByZXN1bHQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW5kIG9ubHkgaWYgdGhlIGFyZ3VtZW50IGlzIGFuIGluc3RhbmNlIG9mCisgICAgICogPGNvZGU+Q2xvc3VyZVRlcm08L2NvZGU+LCBhbmQgCisgICAgICogdGhlIHBhaXJzIG9mIGdvYWxzIGluIHRoZSB0d28gY2xvc3VyZXMgYXJlIDxlbT5lcXVhbDwvZW0+LgorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGguIFRoaXMgbXVzdCBiZSBkZXJlZmVyZW5jZWQuCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gb2JqZWN0IHJlcHJlc2VudHMgYSBjbG9zdXJlCisgICAgICogZXF1aXZhbGVudCB0byB0aGlzIDxjb2RlPkNsb3N1cmVUZXJtPC9jb2RlPiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBzZWUgI2NvbXBhcmVUbworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7IC8vIG9iaiBtdXN0IGJlIGRlcmVmZXJlbmNlZAorCWlmICghIChvYmogaW5zdGFuY2VvZiBDbG9zdXJlVGVybSkpCisJICAgIHJldHVybiBmYWxzZTsKKwlyZXR1cm4gY29kZS5lcXVhbHMoKChDbG9zdXJlVGVybSlvYmopLmNvZGUpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJcmV0dXJuIGNvZGUuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPkNsb3N1cmVUZXJtPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCXJldHVybiAiY2xvc3VyZVsiICsgY29kZS50b1N0cmluZygpICsgIl0iOworICAgIH0KKworICAgIC8qIENvbXBhcmFibGUgKi8KKyAgICAvKiogCisgICAgICogQ29tcGFyZXMgdHdvIHRlcm1zIGluIDxlbT5Qcm9sb2cgc3RhbmRhcmQgb3JkZXIgb2YgdGVybXM8L2VtPi48YnI+CisgICAgICogSXQgaXMgbm90ZWQgdGhhdCA8Y29kZT50MS5jb21wYXJlVG8odDIpID09IDA8L2NvZGU+IGhhcyB0aGUgc2FtZQorICAgICAqIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGFzIDxjb2RlPnQxLmVxdWFscyh0Mik8L2NvZGU+LgorICAgICAqIEBwYXJhbSBhbm90aGVyVGVybSB0aGUgdGVybSB0byBjb21wYXJlZCB3aXRoLiBJdCBtdXN0IGJlIGRlcmVmZXJlbmNlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSA8Y29kZT4wPC9jb2RlPiBpZiB0d28gdGVybXMgYXJlIGlkZW50aWNhbDsgCisgICAgICogYSB2YWx1ZSBsZXNzIHRoYW4gPGNvZGU+MDwvY29kZT4gaWYgdGhpcyB0ZXJtIGlzIDxlbT5iZWZvcmU8L2VtPiB0aGUgPGNvZGU+YW5vdGhlclRlcm08L2NvZGU+OworICAgICAqIGFuZCBhIHZhbHVlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiBpZiB0aGlzIHRlcm0gaXMgPGVtPmFmdGVyPC9lbT4gdGhlIDxjb2RlPmFub3RoZXJUZXJtPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhUZXJtIGFub3RoZXJUZXJtKSB7IC8vIGFub3RoZXJUZXJtIG11c3QgYmUgZGVyZWZlcmVuY2VkCisJaWYgKCEgYW5vdGhlclRlcm0uaXNDbG9zdXJlKCkpCisJICAgIHJldHVybiBBRlRFUjsKKwlpZiAoY29kZS5lcXVhbHMoKChDbG9zdXJlVGVybSkgYW5vdGhlclRlcm0pLmNvZGUpKQorCSAgICByZXR1cm4gRVFVQUw7CisJcmV0dXJuIGNvZGUuaGFzaENvZGUoKSAtICgoQ2xvc3VyZVRlcm0pIGFub3RoZXJUZXJtKS5jb2RlLmhhc2hDb2RlKCk7IC8vPz8/CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2xhbmcvRG91YmxlVGVybS5qYXZhIGIvc3JjL2xhbmcvRG91YmxlVGVybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OGFkZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGFuZy9Eb3VibGVUZXJtLmphdmEKQEAgLTAsMCArMSwyNTMgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nOworLyoqCisgKiBGbG9hdGluZyBwb2ludCBudW1iZXIuCisgKiBUaGUgY2xhc3MgPGNvZGU+RG91YmxlVGVybTwvY29kZT4gd3JhcHMgYSB2YWx1ZSBvZiAKKyAqIHByaW1pdGl2ZSB0eXBlIDxjb2RlPmRvdWJsZTwvY29kZT4uCisgKgorICogPHByZT4KKyAqIFRlcm0gdCA9IG5ldyBEb3VibGVUZXJtKDMuMzMzMyk7CisgKiBkb3VibGUgZCA9ICgoRG91YmxlVGVybSl0KS5kb3VibGVWYWx1ZSgpOworICogPC9wcmU+CisgKgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisqLworcHVibGljIGNsYXNzIERvdWJsZVRlcm0gZXh0ZW5kcyBOdW1iZXJUZXJtIHsKKyAgICAvKiogSG9sZHMgYSA8Y29kZT5kb3VibGU8L2NvZGU+IHZhbHVlIHRoYXQgdGhpcyA8Y29kZT5Eb3VibGVUZXJtPC9jb2RlPiByZXByZXNlbnRzLiAqLworICAgIHByb3RlY3RlZCBkb3VibGUgdmFsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBQcm9sb2cgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIAorICAgICAqIHRoYXQgcmVwcmVzZW50cyB0aGUgc3BlY2lmaWVkIDxjb2RlPmRvdWJsZTwvY29kZT4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIERvdWJsZVRlcm0oZG91YmxlIGkpIHsgdmFsID0gaTsgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgPGNvZGU+dmFsPC9jb2RlPi4KKyAgICAgKiBAc2VlICN2YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgZG91YmxlIHZhbHVlKCkgeyByZXR1cm4gdmFsOyB9CisKKyAgICAvKiBUZXJtICovCisgICAgcHVibGljIGJvb2xlYW4gdW5pZnkoVGVybSB0LCBUcmFpbCB0cmFpbCkgeworCWlmICh0LmlzVmFyaWFibGUoKSkKKwkgICAgcmV0dXJuICgoVmFyaWFibGVUZXJtKXQpLnVuaWZ5KHRoaXMsIHRyYWlsKTsKKwlpZiAoISB0LmlzRG91YmxlKCkpCisJICAgIHJldHVybiBmYWxzZTsKKwlyZXR1cm4gdGhpcy52YWwgPT0gKChEb3VibGVUZXJtKXQpLnZhbHVlKCk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHdob3NlIHZhbHVlIGlzCisgICAgICogPGNvZGU+Y29udmVydGlibGUoRG91YmxlLmNsYXNzLCB0eXBlKTwvY29kZT4uCisgICAgICogQHNlZSBUZXJtI2NvbnZlcnRpYmxlKENsYXNzLCBDbGFzcykKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb252ZXJ0aWJsZShDbGFzcyB0eXBlKSB7IHJldHVybiBjb252ZXJ0aWJsZShEb3VibGUuY2xhc3MsIHR5cGUpOyB9CisKKyAgICAvLyAgICBwcm90ZWN0ZWQgVGVybSBjb3B5KFByb2xvZyBlbmdpbmUpIHsgcmV0dXJuIG5ldyBEb3VibGVUZXJtKHZhbCk7IH0KKworICAgIC8qKiAKKyAgICAgKiBSZXR1cm5zIGEgPGNvZGU+amF2YS5sYW5nLkRvdWJsZTwvY29kZT4gY29ycmVzcG9uZHMgdG8gdGhpcyA8Y29kZT5Eb3VibGVUZXJtPC9jb2RlPgorICAgICAqIGFjY29yZGluZyB0byA8ZW0+UHJvbG9nIENhZmUgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIEphdmE8L2VtPi4KKyAgICAgKiBAcmV0dXJuIGEgPGNvZGU+amF2YS5sYW5nLkRvdWJsZTwvY29kZT4gb2JqZWN0IGVxdWl2YWxlbnQgdG8KKyAgICAgKiB0aGlzIDxjb2RlPkRvdWJsZVRlcm08L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgdG9KYXZhKCkgeyByZXR1cm4gbmV3IERvdWJsZSh0aGlzLnZhbCk7IH0KKworICAgIC8qIE9iamVjdCAqLworICAgIC8qKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgPGNvZGU+RG91YmxlVGVybTwvY29kZT4uICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIERvdWJsZS50b1N0cmluZyh0aGlzLnZhbCk7IH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyA8ZW0+dGVybSBlcXVhbGl0eTwvZW0+IG9mIHR3byB0ZXJtcy4KKyAgICAgKiBUaGUgcmVzdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFuZCBvbmx5IGlmIHRoZSBhcmd1bWVudCBpcyBhbiBpbnN0YW5jZSBvZgorICAgICAqIDxjb2RlPkRvdWJsZVRlcm08L2NvZGU+IGFuZCBoYXMgdGhlIHNhbWUgPGNvZGU+ZG91YmxlPC9jb2RlPiB2YWx1ZSBhcyB0aGlzIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoLiBUaGlzIG11c3QgYmUgZGVyZWZlcmVuY2VkLgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIG9iamVjdCByZXByZXNlbnRzIGEgUHJvbG9nIGZsb2F0aW5nCisgICAgICogcG9pbnQgbnVtYmVyIGVxdWl2YWxlbnQgdG8gdGhpcyA8Y29kZT5Eb3VibGVUZXJtPC9jb2RlPiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBzZWUgI2NvbXBhcmVUbworICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwlpZiAoISAob2JqIGluc3RhbmNlb2YgRG91YmxlVGVybSkpCisJICAgIHJldHVybiBmYWxzZTsKKwlyZXR1cm4gRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHModGhpcy52YWwpID09IERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKCgoRG91YmxlVGVybSlvYmopLnZhbCk7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwlsb25nIGJpdHMgPSBEb3VibGUuZG91YmxlVG9Mb25nQml0cyh0aGlzLnZhbCk7CisJcmV0dXJuIChpbnQpKGJpdHMgXiAoYml0cyA+Pj4gMzIpKTsKKyAgICB9CisKKyAgICAvKiBDb21wYXJhYmxlICovCisgICAgLyoqIAorICAgICAqIENvbXBhcmVzIHR3byB0ZXJtcyBpbiA8ZW0+UHJvbG9nIHN0YW5kYXJkIG9yZGVyIG9mIHRlcm1zPC9lbT4uPGJyPgorICAgICAqIEl0IGlzIG5vdGVkIHRoYXQgPGNvZGU+dDEuY29tcGFyZVRvKHQyKSA9PSAwPC9jb2RlPiBoYXMgdGhlIHNhbWUKKyAgICAgKiA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBhcyA8Y29kZT50MS5lcXVhbHModDIpPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gYW5vdGhlclRlcm0gdGhlIHRlcm0gdG8gY29tcGFyZWQgd2l0aC4gSXQgbXVzdCBiZSBkZXJlZmVyZW5jZWQuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgPGNvZGU+MDwvY29kZT4gaWYgdHdvIHRlcm1zIGFyZSBpZGVudGljYWw7IAorICAgICAqIGEgdmFsdWUgbGVzcyB0aGFuIDxjb2RlPjA8L2NvZGU+IGlmIHRoaXMgdGVybSBpcyA8ZW0+YmVmb3JlPC9lbT4gdGhlIDxjb2RlPmFub3RoZXJUZXJtPC9jb2RlPjsKKyAgICAgKiBhbmQgYSB2YWx1ZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4gaWYgdGhpcyB0ZXJtIGlzIDxlbT5hZnRlcjwvZW0+IHRoZSA8Y29kZT5hbm90aGVyVGVybTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIGludCBjb21wYXJlVG8oVGVybSBhbm90aGVyVGVybSkgeyAvLyBhbm90aGVyVGVybSBtdXN0IGJlIGRlcmVmZXJlbmNlZAorCWlmIChhbm90aGVyVGVybS5pc1ZhcmlhYmxlKCkpCisJICAgIHJldHVybiBBRlRFUjsKKwlpZiAoISBhbm90aGVyVGVybS5pc0RvdWJsZSgpKQorCSAgICByZXR1cm4gQkVGT1JFOworCXJldHVybiBEb3VibGUuY29tcGFyZSh0aGlzLnZhbCwgKChEb3VibGVUZXJtKWFub3RoZXJUZXJtKS52YWx1ZSgpKTsKKyAgICB9CisKKyAgICAvKiBOdW1iZXJUZXJtICovCisgICAgcHVibGljIGludCBpbnRWYWx1ZSgpIHsgcmV0dXJuIChpbnQpdmFsOyB9CisKKyAgICBwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7IHJldHVybiAobG9uZyl2YWw7IH0KKworICAgIHB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7IHJldHVybiB2YWw7IH0KKworICAgIHB1YmxpYyBpbnQgYXJpdGhDb21wYXJlVG8oTnVtYmVyVGVybSB0KSB7CisJcmV0dXJuIERvdWJsZS5jb21wYXJlKHRoaXMudmFsLCB0LmRvdWJsZVZhbHVlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIGFicygpIHsgcmV0dXJuIG5ldyBEb3VibGVUZXJtKE1hdGguYWJzKHRoaXMudmFsKSk7IH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIGFjb3MoKSB7IHJldHVybiBuZXcgRG91YmxlVGVybShNYXRoLmFjb3ModGhpcy52YWwpKTsgfQorCisgICAgcHVibGljIE51bWJlclRlcm0gYWRkKE51bWJlclRlcm0gdCkgeyByZXR1cm4gbmV3IERvdWJsZVRlcm0odGhpcy52YWwgKyB0LmRvdWJsZVZhbHVlKCkpOyB9CisKKyAgICAvKiogCisgICAgICogVGhyb3dzIGEgPGNvZGU+dHlwZV9lcnJvcjwvY29kZT4uCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsVHlwZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBOdW1iZXJUZXJtIGFuZChOdW1iZXJUZXJtIHQpIHsgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKCJpbnRlZ2VyIiwgdGhpcyk7IH0KKyAgICAvLyAgICBwdWJsaWMgTnVtYmVyVGVybSBhbmQoTnVtYmVyVGVybSB0KSB7IHJldHVybiBuZXcgSW50ZWdlclRlcm0odGhpcy5pbnRWYWx1ZSgpICYgdC5pbnRWYWx1ZSgpKTsgfQorCisgICAgcHVibGljIE51bWJlclRlcm0gYXNpbigpIHsgcmV0dXJuIG5ldyBEb3VibGVUZXJtKE1hdGguYXNpbih0aGlzLnZhbCkpOyB9CisKKyAgICBwdWJsaWMgTnVtYmVyVGVybSBhdGFuKCkgeyByZXR1cm4gbmV3IERvdWJsZVRlcm0oTWF0aC5hdGFuKHRoaXMudmFsKSk7IH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIGNlaWwoKSB7IHJldHVybiBuZXcgSW50ZWdlclRlcm0oKGludCkgTWF0aC5jZWlsKHRoaXMudmFsKSk7IH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIGNvcygpIHsgcmV0dXJuIG5ldyBEb3VibGVUZXJtKE1hdGguY29zKHRoaXMudmFsKSk7IH0KKworICAgIC8qKiAKKyAgICAgKiBAZXhjZXB0aW9uIEV2YWx1YXRpb25FeGNlcHRpb24gaWYgdGhlIGdpdmVuIGFyZ3VtZW50CisgICAgICogPGNvZGU+TnVtYmVyVGVybTwvY29kZT4gcmVwcmVzZW50cyA8Y29lPjA8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBOdW1iZXJUZXJtIGRpdmlkZShOdW1iZXJUZXJtIHQpIHsgCisJaWYgKHQuZG91YmxlVmFsdWUoKSA9PSAwKQorCSAgICB0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbigiemVyb19kaXZpc29yIik7CisJcmV0dXJuIG5ldyBEb3VibGVUZXJtKHRoaXMudmFsIC8gdC5kb3VibGVWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTnVtYmVyVGVybSBleHAoKSB7IHJldHVybiBuZXcgRG91YmxlVGVybShNYXRoLmV4cCh0aGlzLnZhbCkpOyB9CisKKyAgICBwdWJsaWMgTnVtYmVyVGVybSBmbG9hdEludFBhcnQoKSB7IAorCXJldHVybiBuZXcgRG91YmxlVGVybShNYXRoLnNpZ251bSh0aGlzLnZhbCkgKiBNYXRoLmZsb29yKE1hdGguYWJzKHRoaXMudmFsKSkpOworICAgIH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIGZsb2F0RnJhY3RQYXJ0KCkgeyAKKwlyZXR1cm4gbmV3IERvdWJsZVRlcm0odGhpcy52YWwgLSBNYXRoLnNpZ251bSh0aGlzLnZhbCkgKiBNYXRoLmZsb29yKE1hdGguYWJzKHRoaXMudmFsKSkpOworICAgIH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIGZsb29yKCkgeyByZXR1cm4gbmV3IEludGVnZXJUZXJtKChpbnQpIE1hdGguZmxvb3IodGhpcy52YWwpKTsgfQorCisgICAgLyoqIAorICAgICAqIFRocm93cyBhIDxjb2RlPnR5cGVfZXJyb3I8L2NvZGU+LgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFR5cGVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgTnVtYmVyVGVybSBpbnREaXZpZGUoTnVtYmVyVGVybSB0KSB7IHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbigiaW50ZWdlciIsIHRoaXMpOyB9CisgICAgLy8gICAgcHVibGljIE51bWJlclRlcm0gaW50RGl2aWRlKE51bWJlclRlcm0gdCkgewlyZXR1cm4gbmV3IEludGVnZXJUZXJtKChpbnQpKHRoaXMuaW50VmFsdWUoKSAvIHQuaW50VmFsdWUoKSkpOyB9CisKKyAgICAvKiogCisgICAgICogQGV4Y2VwdGlvbiBFdmFsdWF0aW9uRXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IHJlcHJlc2VudHMgPGNvZT4wPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTnVtYmVyVGVybSBsb2coKSB7IAorCWlmICh0aGlzLnZhbCA9PSAwKQorCSAgICB0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbigidW5kZWZpbmVkIik7CisJcmV0dXJuIG5ldyBEb3VibGVUZXJtKE1hdGgubG9nKHRoaXMudmFsKSk7IAorICAgIH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIG1heChOdW1iZXJUZXJtIHQpIHsgcmV0dXJuIG5ldyBEb3VibGVUZXJtKE1hdGgubWF4KHRoaXMudmFsLCB0LmRvdWJsZVZhbHVlKCkpKTsgfQorCisgICAgcHVibGljIE51bWJlclRlcm0gbWluKE51bWJlclRlcm0gdCkgeyByZXR1cm4gbmV3IERvdWJsZVRlcm0oTWF0aC5taW4odGhpcy52YWwsIHQuZG91YmxlVmFsdWUoKSkpOyB9CisKKyAgICAvKiogCisgICAgICogVGhyb3dzIGEgPGNvZGU+dHlwZV9lcnJvcjwvY29kZT4uCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsVHlwZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBOdW1iZXJUZXJtIG1vZChOdW1iZXJUZXJtIHQpIHsgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKCJpbnRlZ2VyIiwgdGhpcyk7IH0KKyAgICAvLyAgICBwdWJsaWMgTnVtYmVyVGVybSBtb2QoTnVtYmVyVGVybSB0KSB7IHJldHVybiBuZXcgSW50ZWdlclRlcm0odGhpcy5pbnRWYWx1ZSgpICUgdC5pbnRWYWx1ZSgpKTsgfQorCisgICAgcHVibGljIE51bWJlclRlcm0gbXVsdGlwbHkoTnVtYmVyVGVybSB0KSB7IHJldHVybiBuZXcgRG91YmxlVGVybSh0aGlzLnZhbCAqIHQuZG91YmxlVmFsdWUoKSk7IH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIG5lZ2F0ZSgpIHsgcmV0dXJuIG5ldyBEb3VibGVUZXJtKC0gdGhpcy52YWwpOyB9CisKKyAgICAvKiogCisgICAgICogVGhyb3dzIGEgPGNvZGU+dHlwZV9lcnJvcjwvY29kZT4uCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsVHlwZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBOdW1iZXJUZXJtIG5vdCgpIHsgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKCJpbnRlZ2VyIiwgdGhpcyk7IH0KKyAgICAvLyAgICBwdWJsaWMgTnVtYmVyVGVybSBub3QoKSB7IHJldHVybiBuZXcgSW50ZWdlclRlcm0ofiB0aGlzLmludFZhbHVlKCkpOyB9CisKKyAgICAvKiogCisgICAgICogVGhyb3dzIGEgPGNvZGU+dHlwZV9lcnJvcjwvY29kZT4uCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsVHlwZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBOdW1iZXJUZXJtIG9yKE51bWJlclRlcm0gdCkgeyB0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24oImludGVnZXIiLCB0aGlzKTsgfQorICAgIC8vICAgIHB1YmxpYyBOdW1iZXJUZXJtIG9yKE51bWJlclRlcm0gdCkgeyByZXR1cm4gbmV3IEludGVnZXJUZXJtKHRoaXMuaW50VmFsdWUoKSB8IHQuaW50VmFsdWUoKSk7IH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIHBvdyhOdW1iZXJUZXJtIHQpIHsgcmV0dXJuIG5ldyBEb3VibGVUZXJtKE1hdGgucG93KHRoaXMudmFsLCB0LmRvdWJsZVZhbHVlKCkpKTsgfQorCisgICAgcHVibGljIE51bWJlclRlcm0gcmludCgpIHsgcmV0dXJuIG5ldyBEb3VibGVUZXJtKE1hdGgucmludCh0aGlzLnZhbCkpOyB9CisKKyAgICBwdWJsaWMgTnVtYmVyVGVybSByb3VuZCgpIHsgcmV0dXJuIG5ldyBJbnRlZ2VyVGVybSgoaW50KSBNYXRoLnJvdW5kKHRoaXMudmFsKSk7IH0KKworICAgIC8qKiAKKyAgICAgKiBUaHJvd3MgYSA8Y29kZT50eXBlX2Vycm9yPC9jb2RlPi4KKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxUeXBlRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIE51bWJlclRlcm0gc2hpZnRMZWZ0KE51bWJlclRlcm0gdCkgeyB0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24oImludGVnZXIiLCB0aGlzKTsgfQorCisgICAgLyoqIAorICAgICAqIFRocm93cyBhIDxjb2RlPnR5cGVfZXJyb3I8L2NvZGU+LgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFR5cGVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgTnVtYmVyVGVybSBzaGlmdFJpZ2h0KE51bWJlclRlcm0gdCkgeyB0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24oImludGVnZXIiLCB0aGlzKTsgfQorCisgICAgcHVibGljIE51bWJlclRlcm0gc2lnbnVtKCkge3JldHVybiBuZXcgRG91YmxlVGVybShNYXRoLnNpZ251bSh0aGlzLnZhbCkpOyB9CisgCisgICAgcHVibGljIE51bWJlclRlcm0gc2luKCkgeyByZXR1cm4gbmV3IERvdWJsZVRlcm0oTWF0aC5zaW4odGhpcy52YWwpKTsgfQorCisgICAgLyoqIAorICAgICAqIEBleGNlcHRpb24gRXZhbHVhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCByZXByZXNlbnRzCisgICAgICogYSBmbG9hdGluZyBwb2ludCBudW1iZXIgbGVzcyB0aGFuIDxjb2U+MDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIE51bWJlclRlcm0gc3FydCgpIHsgCisJaWYgKHRoaXMudmFsIDwgMCkKKwkgICAgdGhyb3cgbmV3IEV2YWx1YXRpb25FeGNlcHRpb24oInVuZGVmaW5lZCIpOworCXJldHVybiBuZXcgRG91YmxlVGVybShNYXRoLnNxcnQodGhpcy52YWwpKTsgCisgICAgfQorCisgICAgcHVibGljIE51bWJlclRlcm0gc3VidHJhY3QoTnVtYmVyVGVybSB0KSB7IHJldHVybiBuZXcgRG91YmxlVGVybSh0aGlzLnZhbCAtIHQuZG91YmxlVmFsdWUoKSk7IH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIHRhbigpIHsgcmV0dXJuIG5ldyBEb3VibGVUZXJtKE1hdGgudGFuKHRoaXMudmFsKSk7IH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIHRvRGVncmVlcygpIHsgcmV0dXJuIG5ldyBEb3VibGVUZXJtKE1hdGgudG9EZWdyZWVzKHRoaXMudmFsKSk7IH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIHRvRmxvYXQoKSB7IHJldHVybiB0aGlzOyB9CisKKyAgICBwdWJsaWMgTnVtYmVyVGVybSB0b1JhZGlhbnMoKSB7IHJldHVybiBuZXcgRG91YmxlVGVybShNYXRoLnRvUmFkaWFucyh0aGlzLnZhbCkpOyB9CisKKyAgICBwdWJsaWMgTnVtYmVyVGVybSB0cnVuY2F0ZSgpIHsgCisJaWYgKHRoaXMudmFsID49IDApCisJICAgIHJldHVybiBuZXcgSW50ZWdlclRlcm0oKGludCkgTWF0aC5mbG9vcih0aGlzLnZhbCkpOworCWVsc2UgCisJICAgIHJldHVybiBuZXcgSW50ZWdlclRlcm0oKGludCkgKC0xICogTWF0aC5mbG9vcihNYXRoLmFicyh0aGlzLnZhbCkpKSk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIFRocm93cyBhIDxjb2RlPnR5cGVfZXJyb3I8L2NvZGU+LgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFR5cGVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgTnVtYmVyVGVybSB4b3IoTnVtYmVyVGVybSB0KSB7IHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbigiaW50ZWdlciIsIHRoaXMpOyB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbGFuZy9FdmFsdWF0aW9uRXhjZXB0aW9uLmphdmEgYi9zcmMvbGFuZy9FdmFsdWF0aW9uRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzMjRjMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sYW5nL0V2YWx1YXRpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDUyIEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZzsKKy8qKgorICogRXZhbHVhdGlvbiBlcnJvci48YnI+CisgKiBUaGVyZSB3aWxsIGJlIGFuIGV2YWx1YXRpb24gZXJyb3Igd2hlbiB0aGUgb3BlcmFuZHMKKyAqIG9mIGFuIGV2YWx1YWJsZSBmdW5jdG9yIGFyZSBzdWNoIHRoYXQgdGhlIG9wZXJhdGlvbgorICogaGFzIGFuIGV4Y2VwdGlvbmFsIHZhbHVlLgorICoKKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgRXZhbHVhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEJ1aWx0aW5FeGNlcHRpb24geworICAgIC8qKiBBIGZ1bmN0b3Igc3ltYm9sIG9mIDxjb2RlPmV2YWx1YXRpb25fZXJyb3IvMzwvY29kZT4uICovCisgICAgcHVibGljIHN0YXRpYyBTeW1ib2xUZXJtIEVWQUxVQVRJT05fRVJST1IgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woImV2YWx1YXRpb25fZXJyb3IiLCAzKTsKKworICAgIC8qIGVycm9yVHlwZSA6Oj0gZmxvYXRfb3ZlcmZsb3cgfCBpbnRfb3ZlcmZsb3cgfCB1bmRlZmluZWQgfCB1bmRlcmZsb3cgfCB6ZXJvX2Rldmlzb3IgKi8KKyAgICAvKiogSG9sZHMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZXJyb3IgdHlwZS4gKi8KKyAgICBwdWJsaWMgU3RyaW5nIGVycm9yVHlwZTsKKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkV2YWx1YXRpb25FeGNlcHRpb248L2NvZGU+IHdpdGggYW4gZXJyb3IgdHlwZS4gKi8KKyAgICBwdWJsaWMgRXZhbHVhdGlvbkV4Y2VwdGlvbihTdHJpbmcgX2Vycm9yVHlwZSkgeworCWVycm9yVHlwZSAgICA9IF9lcnJvclR5cGU7CisgICAgfQorCisgICAgLyoqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+RXZhbHVhdGlvbkV4Y2VwdGlvbjwvY29kZT4gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiAqLworICAgIHB1YmxpYyBFdmFsdWF0aW9uRXhjZXB0aW9uKFByZWRpY2F0ZSBfZ29hbCwgaW50IF9hcmdObywgU3RyaW5nIF9lcnJvclR5cGUpIHsKKwl0aGlzLmdvYWwgICAgPSBfZ29hbDsKKwl0aGlzLmFyZ05vICAgPSBfYXJnTm87CisJZXJyb3JUeXBlICAgID0gX2Vycm9yVHlwZTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyBhIHRlcm0gcmVwcmVzZW50YXRpb24gb2YgdGhpcyA8Y29kZT5FdmFsdWF0aW9uRXhjZXB0aW9uPC9jb2RlPjoKKyAgICAgKiA8Y29kZT5ldmFsdWF0aW9uX2Vycm9yKGdvYWwsYXJnTm8sZXJyb3JUeXBlKTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFRlcm0gZ2V0TWVzc2FnZVRlcm0oKSB7CisJVGVybVtdIGFyZ3MgPSB7CisJICAgIG5ldyBKYXZhT2JqZWN0VGVybShnb2FsKSwgCisJICAgIG5ldyBJbnRlZ2VyVGVybShhcmdObyksIAorCSAgICBTeW1ib2xUZXJtLm1ha2VTeW1ib2woZXJyb3JUeXBlKX07CisJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVUZXJtKEVWQUxVQVRJT05fRVJST1IsIGFyZ3MpOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgPGNvZGU+RXZhbHVhdGlvbkV4Y2VwdGlvbjwvY29kZT4uICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmcgcyA9ICJ7RVZBTFVBVElPTiBFUlJPUjogIiArIGdvYWwudG9TdHJpbmcoKTsKKwlpZiAoYXJnTm8gPiAwKQorCSAgICBzICs9ICIgLSBhcmcgIiArIGFyZ05vOworCXMgKz0gIiwgZm91bmQgIiArIGVycm9yVHlwZTsKKwlzICs9ICJ9IjsKKwlyZXR1cm4gczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbGFuZy9FeGlzdGVuY2VFeGNlcHRpb24uamF2YSBiL3NyYy9sYW5nL0V4aXN0ZW5jZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYWVmMDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGFuZy9FeGlzdGVuY2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDY1IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZzsKKy8qKgorICogRXhpc3RlbmNlIGVycm9yLjxicj4KKyAqIFRoZXJlIHdpbGwgYmUgYW4gZXhpc3RlbmNlIGVycm9yIHdoZW4gdGhlIG9iamVjdAorICogb24gd2hpY2ggYW4gb3BlcmF0aW9uIGlzIHRvIGJlIHBlcmZvcm1lZCBkb2VzIG5vdCBleGlzdC4KKyAqCisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIEV4aXN0ZW5jZUV4Y2VwdGlvbiBleHRlbmRzIEJ1aWx0aW5FeGNlcHRpb24geworICAgIC8qKiBBIGZ1bmN0b3Igc3ltYm9sIG9mIDxjb2RlPmV4aXN0ZW5jZV9lcnJvci81PC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFRlcm0gRVhJU1RFTkNFX0VSUk9SID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJleGlzdGVuY2VfZXJyb3IiLCA1KTsKKworICAgIC8qIG9ialR5cGUgOjo9IHByb2NlZHVyZSB8IHNvdXJjZV9zaW5rIHwgc3RyZWFtIHwgaGFzaCAqLworICAgIC8qKiBIb2xkcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QgdHlwZS4gKi8KKyAgICBwdWJsaWMgU3RyaW5nIG9ialR5cGU7CisKKyAgICAvKiogSG9sZHMgdGhlIGFyZ3VtZW50IG9yIG9uZSBvZiBpdHMgY29tcG9uZW50cyB3aGljaCBjYXVzZWQgdGhlIGVycm9yLiAqLworICAgIHB1YmxpYyBUZXJtICAgY3VscHJpdDsKKworICAgIC8qKiBIb2xkcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBkZXRhaWwgbWVzc2FnZS4gKi8KKyAgICBwdWJsaWMgU3RyaW5nIG1lc3NhZ2U7CisKKyAgICAvKiogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5FeGlzdGVuY2VFeGNlcHRpb248L2NvZGU+CisgICAgICogd2l0aCBhIG9iamVjdCB0eXBlLCBpdHMgY3VscHJpdCwgYW5kIG1lc3NhZ2UuICovCisgICAgcHVibGljIEV4aXN0ZW5jZUV4Y2VwdGlvbihTdHJpbmcgX29ialR5cGUsIFRlcm0gX2N1bHByaXQsIFN0cmluZyBfbWVzc2FnZSkgeworCW9ialR5cGUgICAgPSBfb2JqVHlwZTsKKwljdWxwcml0ICAgID0gX2N1bHByaXQ7CisJbWVzc2FnZSAgICA9IF9tZXNzYWdlOworICAgIH0KKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkV4aXN0ZW5jZUV4Y2VwdGlvbjwvY29kZT4gCisgICAgICogd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiAqLworICAgIHB1YmxpYyBFeGlzdGVuY2VFeGNlcHRpb24oUHJlZGljYXRlIF9nb2FsLCBpbnQgX2FyZ05vLCBTdHJpbmcgX29ialR5cGUsIFRlcm0gX2N1bHByaXQsIFN0cmluZyBfbWVzc2FnZSkgeworCXRoaXMuZ29hbCAgPSBfZ29hbDsKKwl0aGlzLmFyZ05vID0gX2FyZ05vOworCW9ialR5cGUgICAgPSBfb2JqVHlwZTsKKwljdWxwcml0ICAgID0gX2N1bHByaXQ7CisJbWVzc2FnZSAgICA9IF9tZXNzYWdlOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIGEgdGVybSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPkV4aXN0ZW5jZUV4Y2VwdGlvbjwvY29kZT46CisgICAgICogPGNvZGU+ZXhpc3RlbmNlX2Vycm9yKGdvYWwsYXJnTm8sb2JqVHlwZSxjdWxwcml0LG1lc3NhZ2UpPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGVybSBnZXRNZXNzYWdlVGVybSgpIHsKKwlUZXJtW10gYXJncyA9IHsKKwkgICAgbmV3IEphdmFPYmplY3RUZXJtKGdvYWwpLCAKKwkgICAgbmV3IEludGVnZXJUZXJtKGFyZ05vKSwKKwkgICAgU3ltYm9sVGVybS5tYWtlU3ltYm9sKG9ialR5cGUpLAorCSAgICBjdWxwcml0LAorCSAgICBTeW1ib2xUZXJtLm1ha2VTeW1ib2wobWVzc2FnZSl9OworCXJldHVybiBuZXcgU3RydWN0dXJlVGVybShFWElTVEVOQ0VfRVJST1IsIGFyZ3MpOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgPGNvZGU+RXhpc3RlbmNlRXhjZXB0aW9uPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCVN0cmluZyBzID0gIntFWElTVEVOQ0UgRVJST1I6IjsKKwlpZiAoYXJnTm8gPiAwKQorCSAgICBzICs9ICIgIiArIGdvYWwudG9TdHJpbmcoKSArICIgLSBhcmcgIiArIGFyZ05vICsgIjoiOworCXMgKz0gb2JqVHlwZSArICIgIiArIGN1bHByaXQudG9TdHJpbmcoKSArICIgZG9lcyBub3QgZXhpc3QiOworCXMgKz0gIn0iOworCXJldHVybiBzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9sYW5nL0ZhaWx1cmUuamF2YSBiL3NyYy9sYW5nL0ZhaWx1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjhkOGZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xhbmcvRmFpbHVyZS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nOworLyoqCisgKiBJbml0aWFsIGJhY2t0cmFrIHBvaW50Ljxicj4KKyAqCisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjIKKyAqLworcHVibGljIGNsYXNzIEZhaWx1cmUgZXh0ZW5kcyBQcmVkaWNhdGUgeworICAgIC8qKiBQcm9sb2cgdGhyZWFkIHRoYXQgdGhpcyA8Y29kZT5GYWlsdXJlPC9jb2RlPiBiZWxvbmdzIHRvLiAqLworICAgIHB1YmxpYyBQcm9sb2dDb250cm9sIGM7CisKKyAgICAvKiogQ29uc3RydWN0cyBhIG5ldyBpbml0aWFsIGJhY2t0cmFrIHBvaW50LiAqLworICAgIHB1YmxpYyBGYWlsdXJlKCl7fQorCisgICAgLyoqIENvbnN0cnVjdHMgYSBuZXcgaW5pdGlhbCBiYWNrdHJhayBwb2ludCB3aXRoIGdpdmVuIFByb2xvZyB0aHJlYWQuICovCisgICAgcHVibGljIEZhaWx1cmUoUHJvbG9nQ29udHJvbCBjKSB7CisJdGhpcy5jID0gYzsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJlZGljYXRlIGV4ZWMoUHJvbG9nIGVuZ2luZSkgeworCWMuZmFpbCgpOworCWVuZ2luZS5leGNlcHRpb25SYWlzZWQgPSAxOyAvLyBoYWx0CisJcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyA8Y29kZT5GYWlsdXJlPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7IHJldHVybiAiRmFpbHVyZSI7IH0KKworICAgIC8qKiBSZXR1cm5zIDxjb2RlPjA8L2NvZGU+LiAqLworICAgIHB1YmxpYyBpbnQgYXJpdHkoKSB7IHJldHVybiAwOyB9Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9sYW5nL0hhc2h0YWJsZU9mVGVybS5qYXZhIGIvc3JjL2xhbmcvSGFzaHRhYmxlT2ZUZXJtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcyNmIxNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sYW5nL0hhc2h0YWJsZU9mVGVybS5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisvKioKKyAqIDxjb2RlPkhhc2h0YWJsZSZsdDtUZXJtLFRlcm0mZ3Q7PC9jb2RlPi48YnI+CisgKiA8Zm9udCBjb2xvcj0icmVkIj5UaGlzIGRvY3VtZW50IGlzIHVuZGVyIGNvbnN0cnVjdGlvbi48L2ZvbnQ+CisgKgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBIYXNodGFibGVPZlRlcm0gZXh0ZW5kcyBIYXNodGFibGU8VGVybSxUZXJtPiB7CisgICAgcHVibGljIEhhc2h0YWJsZU9mVGVybSgpIHsgCisJc3VwZXIoKTsgCisgICAgfQorICAgIHB1YmxpYyBIYXNodGFibGVPZlRlcm0oaW50IGluaXRpYWxDYXBhY2l0eSkgeyAKKwlzdXBlcihpbml0aWFsQ2FwYWNpdHkpOworICAgIH0KKyAgICBwdWJsaWMgSGFzaHRhYmxlT2ZUZXJtKGludCBpbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpIHsKKwlzdXBlcihpbml0aWFsQ2FwYWNpdHksIGxvYWRGYWN0b3IpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbGFuZy9JbGxlZ2FsRG9tYWluRXhjZXB0aW9uLmphdmEgYi9zcmMvbGFuZy9JbGxlZ2FsRG9tYWluRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyZmQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sYW5nL0lsbGVnYWxEb21haW5FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDY4IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZzsKKy8qKgorICogRG9tYWluIGVycm9yLjxicj4KKyAqIFRoZXJlIHdpbGwgYmUgYSBkb21haW4gZXJyb3Igd2hlbiB0aGUgdHlwZSBvZiBhbiBhcmd1bWVudAorICogaXMgY29ycmVjdCwgYnV0IHRoZSB2YWx1ZSBpcyBvdXRzaWRlIHRoZSBkb21haW4gZm9yIHdoaWNoCisgKiB0aGUgcHJvY2VkdXJlIGlzIGRlZmluZWQuCisgKgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBJbGxlZ2FsRG9tYWluRXhjZXB0aW9uIGV4dGVuZHMgQnVpbHRpbkV4Y2VwdGlvbiB7CisgICAgLyoqIEEgZnVuY3RvciBzeW1ib2wgb2YgPGNvZGU+ZG9tYWluX2Vycm9yLzQ8L2NvZGU+LiAqLworICAgIHB1YmxpYyBzdGF0aWMgU3ltYm9sVGVybSBET01BSU5fRVJST1IgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woImRvbWFpbl9lcnJvciIsIDQpOworCisgICAgLyoKKyAgICAgIGRvbWFpbiA6Oj0gY2hhcmFjdGVyX2NvZGVfbGlzdCB8IGNsb3NlX29wdGlvbiB8IGZsYWdfdmFsdWUgfCBpb19tb2RlIHwgCisgICAgICAgICAgICAgICAgIG5vbl9lbXB0eV9saXN0IHwgbm90X2xlc3NfdGhhbl96ZXJvIHwgb3BlcmF0b3JfcHJpb3JpdHkgfAorCQkgb3BlcmF0b3Jfc3BlY2lmaWVyIHwgcHJvbG9nX2ZsYWcgfCByZWFkX29wdGlvbiB8IHNvdXJjZV9zaW5rIHwKKwkJIHN0cmVhbSB8IHN0ZWFtX29wdGlvbiB8IHN0cmVhbV9vcl9hbGlhcyB8IHN0cmVhbV9wb3NpdGlvbiB8CisJCSBzdHJlYW1fcHJvcGVydHkgfCB3cml0ZV9vcHRpb24gfAorCQkgaGFzaF9vcl9hbGlhc3wgaGFzaF9vcHRpb24gfCAnYXJpdGhtZXRpYyBleHByZXNzaW9uJworICAgICovCisgICAgLyoqIEhvbGRzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHZhbGlkIGRvbWFpbi4gKi8KKyAgICBwdWJsaWMgU3RyaW5nIGRvbWFpbjsKKworICAgIC8qKiBIb2xkcyB0aGUgYXJndW1lbnQgb3Igb25lIG9mIGl0cyBjb21wb25lbnRzIHdoaWNoIGNhdXNlZCB0aGUgZXJyb3IuICovCisgICAgcHVibGljIFRlcm0gY3VscHJpdDsKKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPklsbGVnYWxEb21haW5FeGNlcHRpb248L2NvZGU+CisgICAgICogd2l0aCBhIHZhbGlkIGRvbWFpbiBhbmQgaXRzIGN1bHByaXQuICovCisgICAgcHVibGljIElsbGVnYWxEb21haW5FeGNlcHRpb24oU3RyaW5nIF9kb21haW4sIFRlcm0gX2N1bHByaXQpIHsKKwlkb21haW4gICAgPSBfZG9tYWluOworCWN1bHByaXQgPSBfY3VscHJpdDsKKyAgICB9CisKKyAgICAvKiogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5JbGxlZ2FsRG9tYWluRXhjZXB0aW9uPC9jb2RlPiAKKyAgICAgKiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuICovCisgICAgcHVibGljIElsbGVnYWxEb21haW5FeGNlcHRpb24oUHJlZGljYXRlIF9nb2FsLCBpbnQgX2FyZ05vLCBTdHJpbmcgX2RvbWFpbiwgVGVybSBfY3VscHJpdCkgeworCXRoaXMuZ29hbCAgICA9IF9nb2FsOworCXRoaXMuYXJnTm8gICA9IF9hcmdObzsKKwlkb21haW4gICAgPSBfZG9tYWluOworCWN1bHByaXQgPSBfY3VscHJpdDsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyBhIHRlcm0gcmVwcmVzZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JbGxlZ2FsRG9tYWluRXhjZXB0aW9uPC9jb2RlPjoKKyAgICAgKiA8Y29kZT5kb21haW5fZXJyb3IoZ29hbCxhcmdObyx0eXBlLGN1bHByaXQpPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGVybSBnZXRNZXNzYWdlVGVybSgpIHsKKwlUZXJtW10gYXJncyA9IHsKKwkgICAgbmV3IEphdmFPYmplY3RUZXJtKGdvYWwpLCAKKwkgICAgbmV3IEludGVnZXJUZXJtKGFyZ05vKSwgCisJICAgIFN5bWJvbFRlcm0ubWFrZVN5bWJvbChkb21haW4pLAorCSAgICBjdWxwcml0fTsKKwlyZXR1cm4gbmV3IFN0cnVjdHVyZVRlcm0oRE9NQUlOX0VSUk9SLCBhcmdzKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPklsbGVnYWxEb21haW5FeGNlcHRpb248L2NvZGU+LiAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJU3RyaW5nIHMgPSAie0RPTUFJTiBFUlJPUjogIiArIGdvYWwudG9TdHJpbmcoKTsKKwlpZiAoYXJnTm8gPiAwKQorCSAgICBzICs9ICIgLSBhcmcgIiArIGFyZ05vOworCXMgKz0gIjogZXhwZWN0ZWQgIiArIGRvbWFpbjsKKwlzICs9ICIsIGZvdW5kICIgKyBjdWxwcml0LnRvU3RyaW5nKCk7CisJcyArPSAifSI7CisJcmV0dXJuIHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2xhbmcvSWxsZWdhbFR5cGVFeGNlcHRpb24uamF2YSBiL3NyYy9sYW5nL0lsbGVnYWxUeXBlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UwNGZjNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sYW5nL0lsbGVnYWxUeXBlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw2NSBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmc7CisvKioKKyAqIFR5cGUgZXJyb3IuPGJyPgorICogVGhlcmUgd2lsbCBiZSBhIHR5cGUgZXJyb3Igd2hlbiB0aGUgdHlwZSBvZiBhbiBhcmd1bWVudCBvciAKKyAqIG9uZSBvZiBpdHMgY29tcG9uZW50cyBpcyBpbmNvcnJlY3QsIGJ1dCBub3QgYSB2YXJpYWJsZS4KKyAqCisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIElsbGVnYWxUeXBlRXhjZXB0aW9uIGV4dGVuZHMgQnVpbHRpbkV4Y2VwdGlvbiB7CisgICAgLyoqIEEgZnVuY3RvciBzeW1ib2wgb2YgPGNvZGU+dHlwZV9lcnJvci80PC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFRlcm0gVFlQRV9FUlJPUiA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgidHlwZV9lcnJvciIsIDQpOworCisgICAgLyoKKyAgICAgIHR5cGUgOjo9IGF0b20gfCBhdG9taWMgfCBieXRlIHwgY2FsbGFibGUgfCBjaGFyYWN0ZXIgfCBjb21wb3VuZCB8IGV2YWx1YWJsZSB8CisgICAgICAgICAgICAgICBpbl9ieXRlIHwgaW5fY2hhcmFjdGVyIHwgaW50ZWdlciB8IGxpc3QgfCBudW1iZXIgfAorCSAgICAgICBwcmVkaWNhdGVfaW5kaWNhdG9yIHwgdmFyaWFibGUgfAorCSAgICAgICBmbGFvdCB8IGphdmEKKyAgICAqLworICAgIC8qKiBIb2xkcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB2YWxpZCB0eXBlLiAqLworICAgIHB1YmxpYyBTdHJpbmcgdHlwZTsKKworICAgIC8qKiBIb2xkcyB0aGUgYXJndW1lbnQgb3Igb25lIG9mIGl0cyBjb21wb25lbnRzIHdoaWNoIGNhdXNlZCB0aGUgZXJyb3IuICovCisgICAgcHVibGljIFRlcm0gY3VscHJpdDsKKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPklsbGVnYWxUeXBlRXhjZXB0aW9uPC9jb2RlPiAKKyAgICAgKiB3aXRoIGEgdmFsaWQgdHlwZSBhbmQgaXRzIGN1bHByaXQuICovCisgICAgcHVibGljIElsbGVnYWxUeXBlRXhjZXB0aW9uKFN0cmluZyBfdHlwZSwgVGVybSBfY3VscHJpdCkgeworCXR5cGUgICAgPSBfdHlwZTsKKwljdWxwcml0ID0gX2N1bHByaXQ7CisgICAgfQorCisgICAgLyoqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+SWxsZWdhbFR5cGVFeGNlcHRpb248L2NvZGU+IAorICAgICAqIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gKi8KKyAgICBwdWJsaWMgSWxsZWdhbFR5cGVFeGNlcHRpb24oUHJlZGljYXRlIF9nb2FsLCBpbnQgX2FyZ05vLCBTdHJpbmcgX3R5cGUsIFRlcm0gX2N1bHByaXQpIHsKKwl0aGlzLmdvYWwgICAgPSBfZ29hbDsKKwl0aGlzLmFyZ05vICAgPSBfYXJnTm87CisJdHlwZSAgICA9IF90eXBlOworCWN1bHByaXQgPSBfY3VscHJpdDsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyBhIHRlcm0gcmVwcmVzZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JbGxlZ2FsVHlwZUV4Y2VwdGlvbjwvY29kZT46CisgICAgICogPGNvZGU+dHlwZV9lcnJvcihnb2FsLGFyZ05vLHR5cGUsY3VscHJpdCk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBUZXJtIGdldE1lc3NhZ2VUZXJtKCkgeworCVRlcm1bXSBhcmdzID0geworCSAgICBuZXcgSmF2YU9iamVjdFRlcm0oZ29hbCksIAorCSAgICBuZXcgSW50ZWdlclRlcm0oYXJnTm8pLCAKKwkgICAgU3ltYm9sVGVybS5tYWtlU3ltYm9sKHR5cGUpLAorCSAgICBjdWxwcml0fTsKKwlyZXR1cm4gbmV3IFN0cnVjdHVyZVRlcm0oVFlQRV9FUlJPUiwgYXJncyk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JbGxlZ2FsVHlwZUV4Y2VwdGlvbjwvY29kZT4uICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmcgcyA9ICJ7VFlQRSBFUlJPUjogIiArIGdvYWwudG9TdHJpbmcoKTsKKwlpZiAoYXJnTm8gPiAwKQorCSAgICBzICs9ICIgLSBhcmcgIiArIGFyZ05vOworCXMgKz0gIjogZXhwZWN0ZWQgIiArIHR5cGU7CisJcyArPSAiLCBmb3VuZCAiICsgY3VscHJpdC50b1N0cmluZygpOworCXMgKz0gIn0iOworCXJldHVybiBzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9sYW5nL0ludGVnZXJUZXJtLmphdmEgYi9zcmMvbGFuZy9JbnRlZ2VyVGVybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwY2Y4NzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGFuZy9JbnRlZ2VyVGVybS5qYXZhCkBAIC0wLDAgKzEsMzExIEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZzsKKy8qKgorICogSW50ZWdlci48YnI+CisgKiBUaGUgY2xhc3MgPGNvZGU+SW50ZWdlclRlcm08L2NvZGU+IHdyYXBzIGEgdmFsdWUgb2YgcHJpbWl0aXZlIHR5cGUgCisgKiA8Y29kZT5pbnQ8L2NvZGU+LiAKKyAqIDxwcmU+CisgKiAgIFRlcm0gdCA9IG5ldyBJbnRlZ2VyVGVybSgxMDApOworICogICBpbnQgaSA9ICgoSW50ZWdlclRlcm0pdCkuaW50VmFsdWUoKTsKKyAqIDwvcHJlPgorICoKKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgSW50ZWdlclRlcm0gZXh0ZW5kcyBOdW1iZXJUZXJtIHsKKyAgICAvKiogSG9sZHMgYW4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSB0aGF0IHRoaXMgPGNvZGU+SW50ZWdlclRlcm08L2NvZGU+IHJlcHJlc2VudHMuICovCisgICAgcHJvdGVjdGVkIGludCB2YWw7CisKKyAgICAvKiogQ29uc3RydWN0cyBhIG5ldyBQcm9sb2cgaW50ZWdlciB0aGF0IHJlcHJlc2VudHMgdGhlIHNwZWNpZmllZCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlLiAqLworICAgIHB1YmxpYyBJbnRlZ2VyVGVybShpbnQgaSkgewl2YWwgPSBpOyB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFByb2xvZyBpbnRlZ2VyIHRoYXQgcmVwcmVzZW50cyBpbnRlZ2VyIHZhbHVlIAorICAgICAqIG9mIHNwZWNpZmllZCA8Y29kZT5TdHJpbmc8L2NvZGU+IHBhcmFtZXRlci4KKyAgICAgKiBAZXhjZXB0aW9uIE51bWJlckZvcm1hdEV4Y2VwdGlvbgorICAgICAqIGlmIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IGRvZXMgbm90IGNvbnRhaW4gYSBwYXJzYWJsZSBpbnRlZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBJbnRlZ2VyVGVybShTdHJpbmcgaSkgeworCXRyeSB7CisJICAgIHZhbCA9IEludGVnZXIucGFyc2VJbnQoaSk7CisJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkgICAgdGhyb3cgZTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgPGNvZGU+dmFsPC9jb2RlPi4KKyAgICAgKiBAc2VlICN2YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHZhbHVlKCkgeyByZXR1cm4gdmFsOyB9CisKKyAgICAvKiBUZXJtICovCisgICAgcHVibGljIGJvb2xlYW4gdW5pZnkoVGVybSB0LCBUcmFpbCB0cmFpbCkgeworCWlmICh0LmlzVmFyaWFibGUoKSkKKwkgICAgcmV0dXJuICgoVmFyaWFibGVUZXJtKXQpLnVuaWZ5KHRoaXMsIHRyYWlsKTsKKwlpZiAoISB0LmlzSW50ZWdlcigpKQorCSAgICByZXR1cm4gZmFsc2U7CisJZWxzZSAKKwkgICAgcmV0dXJuIHRoaXMudmFsID09ICgoSW50ZWdlclRlcm0pdCkudmFsdWUoKTsKKyAgICB9CisKKyAgICAvKiogCisgICAgICogQHJldHVybiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gd2hvc2UgdmFsdWUgaXMKKyAgICAgKiA8Y29kZT5jb252ZXJ0aWJsZShJbnRlZ2VyLmNsYXNzLCB0eXBlKTwvY29kZT4uCisgICAgICogQHNlZSBUZXJtI2NvbnZlcnRpYmxlKENsYXNzLCBDbGFzcykKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb252ZXJ0aWJsZShDbGFzcyB0eXBlKSB7IHJldHVybiBjb252ZXJ0aWJsZShJbnRlZ2VyLmNsYXNzLCB0eXBlKTsgfQorCisgICAgLy8gICAgcHJvdGVjdGVkIFRlcm0gY29weShQcm9sb2cgZW5naW5lKSB7IHJldHVybiBuZXcgSW50ZWdlclRlcm0odmFsKTsgfQorCisgICAgLyoqIAorICAgICAqIFJldHVybnMgYSA8Y29kZT5qYXZhLmxhbmcuSW50ZWdlcjwvY29kZT4gY29ycmVzcG9uZHMgdG8gdGhpcyA8Y29kZT5JbnRlZ2VyVGVybTwvY29kZT4KKyAgICAgKiBhY2NvcmRpbmcgdG8gPGVtPlByb2xvZyBDYWZlIGludGVyb3BlcmFiaWxpdHkgd2l0aCBKYXZhPC9lbT4uCisgICAgICogQHJldHVybiBhIDxjb2RlPmphdmEubGFuZy5JbnRlZ2VyPC9jb2RlPiBvYmplY3QgZXF1aXZhbGVudCB0bworICAgICAqIHRoaXMgPGNvZGU+SW50ZWdlclRlcm08L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgdG9KYXZhKCkgeyByZXR1cm4gbmV3IEludGVnZXIodGhpcy52YWwpOyB9CisKKyAgICAvKiBPYmplY3QgKi8KKyAgICAvKiogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPkludGVnZXJUZXJtPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gSW50ZWdlci50b1N0cmluZyh0aGlzLnZhbCk7IH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyA8ZW0+dGVybSBlcXVhbGl0eTwvZW0+IG9mIHR3byB0ZXJtcy4KKyAgICAgKiBUaGUgcmVzdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFuZCBvbmx5IGlmIHRoZSBhcmd1bWVudCBpcyBhbiBpbnN0YW5jZSBvZgorICAgICAqIDxjb2RlPkludGVnZXJUZXJtPC9jb2RlPiBhbmQgaGFzIHRoZSBzYW1lIDxjb2RlPmludDwvY29kZT4gdmFsdWUgYXMgdGhpcyBvYmplY3QuCisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aC4gVGhpcyBtdXN0IGJlIGRlcmVmZXJlbmNlZC4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBvYmplY3QgcmVwcmVzZW50cyBhIFByb2xvZyBpbnRlZ2VyIAorICAgICAqIGVxdWl2YWxlbnQgdG8gdGhpcyA8Y29kZT5JbnRlZ2VyVGVybTwvY29kZT4sIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAc2VlICNjb21wYXJlVG8KKyAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJaWYgKCEgKG9iaiBpbnN0YW5jZW9mIEludGVnZXJUZXJtKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCXJldHVybiB0aGlzLnZhbCA9PSAoKEludGVnZXJUZXJtKW9iaikudmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyByZXR1cm4gdGhpcy52YWw7IH0KKworICAgIC8qIENvbXBhcmFibGUgKi8KKyAgICAvKiogCisgICAgICogQ29tcGFyZXMgdHdvIHRlcm1zIGluIDxlbT5Qcm9sb2cgc3RhbmRhcmQgb3JkZXIgb2YgdGVybXM8L2VtPi48YnI+CisgICAgICogSXQgaXMgbm90ZWQgdGhhdCA8Y29kZT50MS5jb21wYXJlVG8odDIpID09IDA8L2NvZGU+IGhhcyB0aGUgc2FtZQorICAgICAqIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGFzIDxjb2RlPnQxLmVxdWFscyh0Mik8L2NvZGU+LgorICAgICAqIEBwYXJhbSBhbm90aGVyVGVybSB0aGUgdGVybSB0byBjb21wYXJlZCB3aXRoLiBJdCBtdXN0IGJlIGRlcmVmZXJlbmNlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSA8Y29kZT4wPC9jb2RlPiBpZiB0d28gdGVybXMgYXJlIGlkZW50aWNhbDsgCisgICAgICogYSB2YWx1ZSBsZXNzIHRoYW4gPGNvZGU+MDwvY29kZT4gaWYgdGhpcyB0ZXJtIGlzIDxlbT5iZWZvcmU8L2VtPiB0aGUgPGNvZGU+YW5vdGhlclRlcm08L2NvZGU+OworICAgICAqIGFuZCBhIHZhbHVlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiBpZiB0aGlzIHRlcm0gaXMgPGVtPmFmdGVyPC9lbT4gdGhlIDxjb2RlPmFub3RoZXJUZXJtPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhUZXJtIGFub3RoZXJUZXJtKSB7IC8vIGFub3RoZXJUZXJtIG11c3QgYmUgZGVyZWZlcmVuY2VkLgorCWlmIChhbm90aGVyVGVybS5pc1ZhcmlhYmxlKCkgfHwgYW5vdGhlclRlcm0uaXNEb3VibGUoKSkKKwkgICAgcmV0dXJuIEFGVEVSOworCWlmICghIGFub3RoZXJUZXJtLmlzSW50ZWdlcigpKQorCSAgICByZXR1cm4gQkVGT1JFOworCWludCB2ID0gKChJbnRlZ2VyVGVybSlhbm90aGVyVGVybSkudmFsdWUoKTsKKwlpZiAodGhpcy52YWwgPT0gdikKKwkgICAgcmV0dXJuIEVRVUFMOworCWlmICh0aGlzLnZhbCA+IHYpCisJICAgIHJldHVybiBBRlRFUjsKKwlyZXR1cm4gQkVGT1JFOworICAgIH0KKworICAgIC8qIE51bWJlclRlcm0gKi8KKyAgICBwdWJsaWMgaW50IGludFZhbHVlKCkgeyByZXR1cm4gdGhpcy52YWw7IH0KKworICAgIHB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsgcmV0dXJuIChsb25nKSh0aGlzLnZhbCk7IH0KKworICAgIHB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7IHJldHVybiAoZG91YmxlKSh0aGlzLnZhbCk7IH0KKworICAgIHB1YmxpYyBpbnQgYXJpdGhDb21wYXJlVG8oTnVtYmVyVGVybSB0KSB7CisJaWYgKHQuaXNEb3VibGUoKSkKKwkgICAgcmV0dXJuIC0gKHQuYXJpdGhDb21wYXJlVG8odGhpcykpOworCWludCB2ID0gdC5pbnRWYWx1ZSgpOworCWlmICh0aGlzLnZhbCA9PSB2KQorCSAgICByZXR1cm4gRVFVQUw7CisJaWYgKHRoaXMudmFsID4gdikKKwkgICAgcmV0dXJuIEFGVEVSOworCXJldHVybiBCRUZPUkU7CisgICAgfQorCisgICAgcHVibGljIE51bWJlclRlcm0gYWJzKCkgeyByZXR1cm4gbmV3IEludGVnZXJUZXJtKE1hdGguYWJzKHRoaXMudmFsKSk7IH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIGFjb3MoKSB7IHJldHVybiBuZXcgRG91YmxlVGVybShNYXRoLmFjb3ModGhpcy5kb3VibGVWYWx1ZSgpKSk7IH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIGFkZChOdW1iZXJUZXJtIHQpIHsKKwlpZiAodC5pc0RvdWJsZSgpKQorCSAgICByZXR1cm4gdC5hZGQodGhpcyk7CisJcmV0dXJuIG5ldyBJbnRlZ2VyVGVybSh0aGlzLnZhbCArIHQuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFR5cGVFeGNlcHRpb24gaWYgdGhlIGdpdmVuIGFyZ3VtZW50CisgICAgICogPGNvZGU+TnVtYmVyVGVybTwvY29kZT4gaXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuCisgICAgICovCisgICAgcHVibGljIE51bWJlclRlcm0gYW5kKE51bWJlclRlcm0gdCkgeworCWlmICh0LmlzRG91YmxlKCkpCisJICAgIHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbigiaW50ZWdlciIsIHQpOworCXJldHVybiBuZXcgSW50ZWdlclRlcm0odGhpcy52YWwgJiB0LmludFZhbHVlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIGFzaW4oKSB7IHJldHVybiBuZXcgRG91YmxlVGVybShNYXRoLmFzaW4odGhpcy5kb3VibGVWYWx1ZSgpKSk7IH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIGF0YW4oKSB7IHJldHVybiBuZXcgRG91YmxlVGVybShNYXRoLmF0YW4odGhpcy5kb3VibGVWYWx1ZSgpKSk7IH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIGNlaWwoKSB7IHJldHVybiB0aGlzOyB9CisKKyAgICBwdWJsaWMgTnVtYmVyVGVybSBjb3MoKSB7IHJldHVybiBuZXcgRG91YmxlVGVybShNYXRoLmNvcyh0aGlzLmRvdWJsZVZhbHVlKCkpKTsgfQorCisgICAgLyoqIAorICAgICAqIEBleGNlcHRpb24gRXZhbHVhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gYXJndW1lbnQKKyAgICAgKiA8Y29kZT5OdW1iZXJUZXJtPC9jb2RlPiByZXByZXNlbnRzIDxjb2U+MDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIE51bWJlclRlcm0gZGl2aWRlKE51bWJlclRlcm0gdCkgeyAKKwlpZiAodC5kb3VibGVWYWx1ZSgpID09IDApCisJICAgIHRocm93IG5ldyBFdmFsdWF0aW9uRXhjZXB0aW9uKCJ6ZXJvX2Rpdmlzb3IiKTsKKwlyZXR1cm4gbmV3IERvdWJsZVRlcm0odGhpcy5kb3VibGVWYWx1ZSgpIC8gdC5kb3VibGVWYWx1ZSgpKTsgCisgICAgfQorCisgICAgcHVibGljIE51bWJlclRlcm0gZXhwKCkgeyByZXR1cm4gbmV3IERvdWJsZVRlcm0oTWF0aC5leHAodGhpcy5kb3VibGVWYWx1ZSgpKSk7IH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIGZsb2F0SW50UGFydCgpIHsgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKCJmbG9hdCIsIHRoaXMpOyB9CisKKyAgICBwdWJsaWMgTnVtYmVyVGVybSBmbG9hdEZyYWN0UGFydCgpIHsgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKCJmbG9hdCIsIHRoaXMpOyB9CisKKyAgICBwdWJsaWMgTnVtYmVyVGVybSBmbG9vcigpIHsgcmV0dXJuIHRoaXM7IH0KKworICAgIC8qKiAKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxUeXBlRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBhcmd1bWVudAorICAgICAqIDxjb2RlPk51bWJlclRlcm08L2NvZGU+IGlzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgorICAgICAqIEBleGNlcHRpb24gRXZhbHVhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gYXJndW1lbnQKKyAgICAgKiA8Y29kZT5OdW1iZXJUZXJtPC9jb2RlPiByZXByZXNlbnRzIDxjb2U+MDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIE51bWJlclRlcm0gaW50RGl2aWRlKE51bWJlclRlcm0gdCkgeworCWlmICh0LmlzRG91YmxlKCkpCisJICAgIHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbigiaW50ZWdlciIsIHQpOworCWlmICh0LmludFZhbHVlKCkgPT0gMCkKKwkgICAgdGhyb3cgbmV3IEV2YWx1YXRpb25FeGNlcHRpb24oInplcm9fZGl2aXNvciIpOworCXJldHVybiBuZXcgSW50ZWdlclRlcm0oKGludCkgKHRoaXMudmFsIC8gdC5pbnRWYWx1ZSgpKSk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIEBleGNlcHRpb24gRXZhbHVhdGlvbkV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCByZXByZXNlbnRzIDxjb2U+MDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIE51bWJlclRlcm0gbG9nKCkgeyAKKwlpZiAodGhpcy52YWwgPT0gMCkKKwkgICAgdGhyb3cgbmV3IEV2YWx1YXRpb25FeGNlcHRpb24oInVuZGVmaW5lZCIpOworCXJldHVybiBuZXcgRG91YmxlVGVybShNYXRoLmxvZyh0aGlzLmRvdWJsZVZhbHVlKCkpKTsgCisgICAgfQorCisgICAgcHVibGljIE51bWJlclRlcm0gbWF4KE51bWJlclRlcm0gdCkgeworCWlmICh0LmlzRG91YmxlKCkpIAorCSAgICByZXR1cm4gdC5tYXgodGhpcyk7CisJcmV0dXJuIG5ldyBJbnRlZ2VyVGVybShNYXRoLm1heCh0aGlzLnZhbCwgdC5pbnRWYWx1ZSgpKSk7CisgICAgfQorCisgICAgcHVibGljIE51bWJlclRlcm0gbWluKE51bWJlclRlcm0gdCkgeworCWlmICh0LmlzRG91YmxlKCkpIAorCSAgICByZXR1cm4gdC5taW4odGhpcyk7CisJcmV0dXJuIG5ldyBJbnRlZ2VyVGVybShNYXRoLm1pbih0aGlzLnZhbCwgdC5pbnRWYWx1ZSgpKSk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFR5cGVFeGNlcHRpb24gaWYgdGhlIGdpdmVuIGFyZ3VtZW50CisgICAgICogPGNvZGU+TnVtYmVyVGVybTwvY29kZT4gaXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuCisgICAgICogQGV4Y2VwdGlvbiBFdmFsdWF0aW9uRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBhcmd1bWVudAorICAgICAqIDxjb2RlPk51bWJlclRlcm08L2NvZGU+IHJlcHJlc2VudHMgPGNvZT4wPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTnVtYmVyVGVybSBtb2QoTnVtYmVyVGVybSB0KSB7CisJaWYgKHQuaXNEb3VibGUoKSkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxUeXBlRXhjZXB0aW9uKCJpbnRlZ2VyIiwgdCk7CisJaWYgKHQuaW50VmFsdWUoKSA9PSAwKQorCSAgICB0aHJvdyBuZXcgRXZhbHVhdGlvbkV4Y2VwdGlvbigiemVyb19kaXZpc29yIik7CisJcmV0dXJuIG5ldyBJbnRlZ2VyVGVybSh0aGlzLnZhbCAlIHQuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIE51bWJlclRlcm0gbXVsdGlwbHkoTnVtYmVyVGVybSB0KSB7CisJaWYgKHQuaXNEb3VibGUoKSkKKwkgICAgcmV0dXJuIHQubXVsdGlwbHkodGhpcyk7CisJcmV0dXJuIG5ldyBJbnRlZ2VyVGVybSh0aGlzLnZhbCAqIHQuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIE51bWJlclRlcm0gbmVnYXRlKCkgeyByZXR1cm4gbmV3IEludGVnZXJUZXJtKC0gdGhpcy52YWwpOyB9CisKKyAgICBwdWJsaWMgTnVtYmVyVGVybSBub3QoKSB7IHJldHVybiBuZXcgSW50ZWdlclRlcm0ofiB0aGlzLnZhbCk7IH0KKworICAgIC8qKiAKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxUeXBlRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBhcmd1bWVudAorICAgICAqIDxjb2RlPk51bWJlclRlcm08L2NvZGU+IGlzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgorICAgICAqLworICAgIHB1YmxpYyBOdW1iZXJUZXJtIG9yKE51bWJlclRlcm0gdCkgeworCWlmICh0LmlzRG91YmxlKCkpCisJICAgIHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbigiaW50ZWdlciIsIHQpOworCXJldHVybiBuZXcgSW50ZWdlclRlcm0odGhpcy52YWwgfCB0LmludFZhbHVlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIHBvdyhOdW1iZXJUZXJtIHQpIHsgcmV0dXJuIG5ldyBEb3VibGVUZXJtKE1hdGgucG93KHRoaXMuZG91YmxlVmFsdWUoKSwgdC5kb3VibGVWYWx1ZSgpKSk7IH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIHJpbnQoKSB7IHJldHVybiBuZXcgRG91YmxlVGVybSh0aGlzLmRvdWJsZVZhbHVlKCkpOyB9CisKKyAgICBwdWJsaWMgTnVtYmVyVGVybSByb3VuZCgpIHsgcmV0dXJuIHRoaXM7IH0KKworICAgIC8qKiAKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxUeXBlRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBhcmd1bWVudAorICAgICAqIDxjb2RlPk51bWJlclRlcm08L2NvZGU+IGlzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgorICAgICAqLworICAgIHB1YmxpYyBOdW1iZXJUZXJtIHNoaWZ0TGVmdChOdW1iZXJUZXJtIHQpIHsKKwlpZiAodC5pc0RvdWJsZSgpKQorCSAgICB0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24oImludGVnZXIiLCB0KTsKKwlyZXR1cm4gbmV3IEludGVnZXJUZXJtKHRoaXMudmFsIDw8IHQuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFR5cGVFeGNlcHRpb24gaWYgdGhlIGdpdmVuIGFyZ3VtZW50CisgICAgICogPGNvZGU+TnVtYmVyVGVybTwvY29kZT4gaXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuCisgICAgICovCisgICAgcHVibGljIE51bWJlclRlcm0gc2hpZnRSaWdodChOdW1iZXJUZXJtIHQpIHsKKwlpZiAodC5pc0RvdWJsZSgpKQorCSAgICB0aHJvdyBuZXcgSWxsZWdhbFR5cGVFeGNlcHRpb24oImludGVnZXIiLCB0KTsKKwlyZXR1cm4gbmV3IEludGVnZXJUZXJtKHRoaXMudmFsID4+IHQuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIE51bWJlclRlcm0gc2lnbnVtKCkge3JldHVybiBuZXcgSW50ZWdlclRlcm0oKGludCkgTWF0aC5zaWdudW0oKGRvdWJsZSkgdGhpcy52YWwpKTsgfQorCisgICAgcHVibGljIE51bWJlclRlcm0gc2luKCkgeyByZXR1cm4gbmV3IERvdWJsZVRlcm0oTWF0aC5zaW4odGhpcy5kb3VibGVWYWx1ZSgpKSk7IH0KKworICAgIC8qKiAKKyAgICAgKiBAZXhjZXB0aW9uIEV2YWx1YXRpb25FeGNlcHRpb24gaWYgdGhpcyBvYmplY3QgcmVwcmVzZW50cworICAgICAqIGFuIGludGVnZXIgbGVzcyB0aGFuIDxjb2U+MDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIE51bWJlclRlcm0gc3FydCgpIHsgCisJaWYgKHRoaXMudmFsIDwgMCkKKwkgICAgdGhyb3cgbmV3IEV2YWx1YXRpb25FeGNlcHRpb24oInVuZGVmaW5lZCIpOworCXJldHVybiBuZXcgRG91YmxlVGVybShNYXRoLnNxcnQodGhpcy5kb3VibGVWYWx1ZSgpKSk7IAorICAgIH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIHN1YnRyYWN0KE51bWJlclRlcm0gdCkgeworCWlmICh0LmlzRG91YmxlKCkpCisJICAgIHJldHVybiBuZXcgRG91YmxlVGVybSh0aGlzLmRvdWJsZVZhbHVlKCkgLSB0LmRvdWJsZVZhbHVlKCkpOworCXJldHVybiBuZXcgSW50ZWdlclRlcm0odGhpcy52YWwgLSB0LmludFZhbHVlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIHRhbigpIHsgcmV0dXJuIG5ldyBEb3VibGVUZXJtKE1hdGgudGFuKHRoaXMuZG91YmxlVmFsdWUoKSkpOyB9CisKKyAgICBwdWJsaWMgTnVtYmVyVGVybSB0b0RlZ3JlZXMoKSB7IHJldHVybiBuZXcgRG91YmxlVGVybShNYXRoLnRvRGVncmVlcyh0aGlzLmRvdWJsZVZhbHVlKCkpKTsgfQorCisgICAgcHVibGljIE51bWJlclRlcm0gdG9GbG9hdCgpIHsgcmV0dXJuIG5ldyBEb3VibGVUZXJtKChkb3VibGUpIHRoaXMudmFsKTsgfQorCisgICAgcHVibGljIE51bWJlclRlcm0gdG9SYWRpYW5zKCkgeyByZXR1cm4gbmV3IERvdWJsZVRlcm0oTWF0aC50b1JhZGlhbnModGhpcy5kb3VibGVWYWx1ZSgpKSk7IH0KKworICAgIHB1YmxpYyBOdW1iZXJUZXJtIHRydW5jYXRlKCkgeyByZXR1cm4gdGhpczsgfQorCisgICAgLyoqIAorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFR5cGVFeGNlcHRpb24gaWYgdGhlIGdpdmVuIGFyZ3VtZW50CisgICAgICogPGNvZGU+TnVtYmVyVGVybTwvY29kZT4gaXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuCisgICAgICovCisgICAgcHVibGljIE51bWJlclRlcm0geG9yKE51bWJlclRlcm0gdCkgeworCWlmICh0LmlzRG91YmxlKCkpCisJICAgIHRocm93IG5ldyBJbGxlZ2FsVHlwZUV4Y2VwdGlvbigiaW50ZWdlciIsIHQpOworCXJldHVybiBuZXcgSW50ZWdlclRlcm0odGhpcy52YWwgXiB0LmludFZhbHVlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9sYW5nL0ludGVybmFsRGF0YWJhc2UuamF2YSBiL3NyYy9sYW5nL0ludGVybmFsRGF0YWJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzA4NjJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xhbmcvSW50ZXJuYWxEYXRhYmFzZS5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZzsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKKy8qKgorICogSW50ZXJuYWwgZGF0YWJhc2UgZm9yIGR5bmFtaWMgcHJlZGljYXRlcy48YnI+CisgKgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4xCisgKi8KK3B1YmxpYyBjbGFzcyBJbnRlcm5hbERhdGFiYXNlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICAvKiogTWF4aW11bSBzaXplIG9mIGVudGllcy4gSW5pdGlhbCBzaXplIGlzIDxjb2RlPjEwMDAwMDwvY29kZT4uICovCisgICAgcHJvdGVjdGVkIGludCBtYXhDb250ZW50cyA9IDEwMDAwMDsKKworICAgIC8qKiBBbiBhcnJheSBvZiA8Y29kZT5UZXJtPC9jb2RlPiBlbnRyaWVzLiAqLworICAgIHByb3RlY3RlZCBUZXJtW10gYnVmZmVyOworCisgICAgLyogRm9yIEdDICovCisgICAgLyoqIEEgbGlzdCBvZiByZXVzYWJsZSBlbnRyeSBpbmRpY2VzLiAqLworICAgIHByb3RlY3RlZCBMaW5rZWRMaXN0PEludGVnZXI+IHJldXNhYmxlSW5kaWNlcyA9IG5ldyBMaW5rZWRMaXN0PEludGVnZXI+KCk7CisKKyAgICAvKiogdGhlIHRvcCBpbmRleCBvZiB0aGlzIDxjb2RlPkludGVybmFsRGF0YWJhc2U8L2NvZGU+LiAqLworICAgIHByb3RlY3RlZCBpbnQgdG9wOworCisgICAgLyoqIENvbnN0cnVjdHMgYSBuZXcgaW50ZXJuYWwgZGFiYWJhc2UuICovCisgICAgcHVibGljIEludGVybmFsRGF0YWJhc2UoKSB7CisJYnVmZmVyID0gbmV3IFRlcm1bbWF4Q29udGVudHNdOworCXRvcCA9IC0xOworICAgIH0KKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgbmV3IGludGVybmFsIGRhYmFiYXNlIHdpdGggdGhlIGdpdmVuIHNpemUuICovCisgICAgcHVibGljIEludGVybmFsRGF0YWJhc2UoaW50IG4pIHsKKwltYXhDb250ZW50cyA9IG47CisJYnVmZmVyID0gbmV3IFRlcm1bbWF4Q29udGVudHNdOworCXRvcCA9IC0xOworICAgIH0KKworICAgIC8qKiBEaXNjYXJkcyBhbGwgZW50cmllcy4gKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgeyBlcmFzZUFsbCgpOyB9CisKKyAgICAvKiogSW5zZXJ0cyBhbiBlbnRyeSB0byB0aGlzIDxjb2RlPkludGVybmFsRGF0YWJhc2U8L2NvZGU+LiAqLworICAgIHB1YmxpYyBpbnQgaW5zZXJ0KFRlcm0gdCkgeworCXRyeSB7CisJICAgIGlmIChyZXVzYWJsZUluZGljZXMuaXNFbXB0eSgpKSB7CisJCWJ1ZmZlclsrK3RvcF0gPSB0OworCQlyZXR1cm4gdG9wOworCSAgICB9IGVsc2UgeworCQlpbnQgaSA9IHJldXNhYmxlSW5kaWNlcy5yZW1vdmUoKTsKKwkJLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiUmV1c2UgIiArIGkpOworCQlidWZmZXJbaV0gPSB0OworCQlyZXR1cm4gaTsKKwkgICAgfQorCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJICAgIFN5c3RlbS5vdXQucHJpbnRsbigie2V4cGFuZGluZyBpbnRlcm5hbCBkYXRhYmFzZS4uLn0iKTsKKwkgICAgaW50IGxlbiA9IGJ1ZmZlci5sZW5ndGg7CisJICAgIFRlcm1bXSBuZXdfYnVmZmVyID0gbmV3IFRlcm1bbGVuKzEwMDAwXTsKKwkgICAgZm9yKGludCBpPTA7IGk8bGVuOyBpKyspeworCQluZXdfYnVmZmVyW2ldID0gYnVmZmVyW2ldOworCSAgICB9CisJICAgIGJ1ZmZlciA9IG5ld19idWZmZXI7CisJICAgIGJ1ZmZlclt0b3BdID0gdDsKKwkgICAgbWF4Q29udGVudHMgPSBsZW4rMjAwMDA7CisJICAgIHJldHVybiB0b3A7CisJfQorICAgIH0KKworICAgIC8qKiBSZXR1cm5zIGFuIGVudHJ5IHdpdGggdGhlIGdpdmVuIGluZGV4IGZyb20gdGhpcyA8Y29kZT5JbnRlcm5hbERhdGFiYXNlPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgVGVybSBnZXQoaW50IGkpIHsKKwlyZXR1cm4gYnVmZmVyW2ldOworICAgIH0KKworICAgIC8qKiBFcmFzZXMgYW4gZW50cnkgd2l0aCB0aGUgZ2l2ZW4gaW5kZXggZnJvbSB0aGlzIDxjb2RlPkludGVybmFsRGF0YWJhc2U8L2NvZGU+LiAqLworICAgIHB1YmxpYyBUZXJtIGVyYXNlKGludCBpKSB7CisJVGVybSB0ID0gYnVmZmVyW2ldOworCWJ1ZmZlcltpXSA9IG51bGw7CisJLy8JU3lzdGVtLm91dC5wcmludGxuKCJhZGQgUmV1c2UgaW5kZXgiICsgaSk7CisJcmV1c2FibGVJbmRpY2VzLmFkZChpKTsKKwlyZXR1cm4gdDsKKyAgICB9CisKKyAgICAvKiogRGlzY2FyZHMgYWxsIGVudHJpZXMuICovCisgICAgcHJvdGVjdGVkIHZvaWQgZXJhc2VBbGwoKSB7CisJd2hpbGUgKCEgZW1wdHkoKSkgeworCSAgICBidWZmZXJbdG9wLS1dID0gbnVsbDsKKwl9CQorICAgIH0KKworICAgIC8qKiBUZXN0cyBpZiB0aGlzIGhhcyBubyBlbnRyeS4gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlbXB0eSgpIHsKKwlyZXR1cm4gdG9wID09IC0xOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiA8Y29kZT50b3A8L2NvZGU+LiAKKyAgICAgKiBAc2VlICN0b3AKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHRvcCgpIHsgcmV0dXJuIHRvcDsgfQorCisgICAgLyoqIFNob3dzIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPkludGVybmFsRGF0YWJhc2U8L2NvZGU+LiAqLworICAgIHB1YmxpYyB2b2lkIHNob3coKSB7CisJaWYgKGVtcHR5KCkpCisJICAgIFN5c3RlbS5vdXQucHJpbnRsbigie2ludGVybmFsIGRhdGFiYXNlIGlzIGVtcHR5IX0iKTsKKwlTeXN0ZW0ub3V0LnByaW50bG4oIntyZXVzYWJsZSBpbmRpY2VzOiAiICsgcmV1c2FibGVJbmRpY2VzLnRvU3RyaW5nKCkgKyAifSIpOworCWZvciAoaW50IGk9MDsgaTw9dG9wOyBpKyspIHsKKwkgICAgU3lzdGVtLm91dC5wcmludCgiaW50ZXJuYWwgZGF0YWJhc2VbIiArIGkgKyAiXTogIik7CisJICAgIFN5c3RlbS5vdXQucHJpbnRsbihidWZmZXJbaV0pOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbGFuZy9JbnRlcm5hbEV4Y2VwdGlvbi5qYXZhIGIvc3JjL2xhbmcvSW50ZXJuYWxFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2I4YmE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xhbmcvSW50ZXJuYWxFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDM1IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZzsKKy8qKgorICogSW50ZXJuYWwgZXJyb3IuPGJyPgorICoKKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgSW50ZXJuYWxFeGNlcHRpb24gZXh0ZW5kcyBQcm9sb2dFeGNlcHRpb24geworICAgIC8qKiBBIGZ1bmN0b3Igc3ltYm9sIG9mIDxjb2RlPmludGVybmFsX2Vycm9yLzE8L2NvZGU+LiAqLworICAgIHB1YmxpYyBzdGF0aWMgU3ltYm9sVGVybSBJTlRFUk5BTF9FUlJPUiA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiaW50ZXJuYWxfZXJyb3IiLCAxKTsKKworICAgIC8qKiBIb2xkcyBhIG1lc3NhZ2UuICovCisgICAgcHVibGljIFN0cmluZyBtZXNzYWdlOworCisgICAgLyoqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+SW50ZXJuYWxFeGNlcHRpb248L2NvZGU+IHdpdGggYSBtZXNzYWdlLiAqLworICAgIHB1YmxpYyBJbnRlcm5hbEV4Y2VwdGlvbihTdHJpbmcgX21lc3NhZ2UpIHsKKwltZXNzYWdlID0gX21lc3NhZ2U7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgYSB0ZXJtIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgPGNvZGU+SW50ZXJuYWxFeGNlcHRpb248L2NvZGU+OgorICAgICAqIDxjb2RlPmludGVybmFsX2Vycm9yKG1lc3NhZ2UpPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGVybSBnZXRNZXNzYWdlVGVybSgpIHsKKwlUZXJtW10gYXJncyA9IHtTeW1ib2xUZXJtLm1ha2VTeW1ib2wobWVzc2FnZSl9OworCXJldHVybiBuZXcgU3RydWN0dXJlVGVybShJTlRFUk5BTF9FUlJPUiwgYXJncyk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyA8Y29kZT5JbnRlcm5hbEV4Y2VwdGlvbjwvY29kZT4uICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmcgcyA9ICJ7SU5URVJOQUwgRVJST1I6ICIgKyBtZXNzYWdlOworCXMgKz0gIn0iOworCXJldHVybiBzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9sYW5nL0phdmFFeGNlcHRpb24uamF2YSBiL3NyYy9sYW5nL0phdmFFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzBiMzY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xhbmcvSmF2YUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nOworLyoqCisgKiBKYXZhIGVycm9yLjxicj4KKyAqIFRoZXJlIHdpbGwgYmUgYSBKYXZhIGVycm9yIHdoZW4gCisgKiBhIEphdmEgZXhjZXB0aW9uIGlzIHRocmV3IGR1cmluZyBpbnRlcm9wZXJhdGluZyB3aXRoIEphdmEgaW4gUHJvbG9nIENhZmUuCisgKiBUaGUgY2xhc3MgPGNvZGU+SmF2YUV4Y2VwdGlvbjwvY29kZT4gd3JhcHMgYSBzdWJjbGFzcyBvZiA8Y29kZT5qYXZhLmxhbmcuRXhjZXB0aW9uPC9jb2RlPi4KKyAqCisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIEphdmFFeGNlcHRpb24gZXh0ZW5kcyBCdWlsdGluRXhjZXB0aW9uIHsKKyAgICAvKiogQSBmdW5jdG9yIHN5bWJvbCBvZiA8Y29kZT5qYXZhX2Vycm9yLzM8L2NvZGU+LiAqLworICAgIHB1YmxpYyBzdGF0aWMgU3ltYm9sVGVybSBKQVZBX0VSUk9SID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJqYXZhX2Vycm9yIiwgMyk7CisKKyAgICAvKiogSG9sZHMgYSBKYXZhIGV4Y2VwdGlvbi4gKi8KKyAgICBwdWJsaWMgRXhjZXB0aW9uIGU7CisKKyAgICAvKiogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5KYXZhRXhjZXB0aW9uPC9jb2RlPiB3aXRoIGEgSmF2YSBleGNlcHRpb24uICovCisgICAgcHVibGljIEphdmFFeGNlcHRpb24oRXhjZXB0aW9uIF9lKSB7CisJZSA9IF9lOworICAgIH0KKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkphdmFFeGNlcHRpb248L2NvZGU+IHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gKi8KKyAgICBwdWJsaWMgSmF2YUV4Y2VwdGlvbihQcmVkaWNhdGUgX2dvYWwsIGludCBfYXJnTm8sIEV4Y2VwdGlvbiBfZSkgeworCXRoaXMuZ29hbCAgICA9IF9nb2FsOworCXRoaXMuYXJnTm8gICA9IF9hcmdObzsKKwllID0gX2U7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgYSB0ZXJtIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgPGNvZGU+SmF2YUV4Y2VwdGlvbjwvY29kZT46CisgICAgICogPGNvZGU+amF2YV9lcnJvcihnb2FsLGFyZ05vLGV4Y2VwdGlvbik8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBUZXJtIGdldE1lc3NhZ2VUZXJtKCkgeworCVRlcm1bXSBhcmdzID0geworCSAgICBuZXcgSmF2YU9iamVjdFRlcm0oZ29hbCksIAorCSAgICBuZXcgSW50ZWdlclRlcm0oYXJnTm8pLCAKKwkgICAgbmV3IEphdmFPYmplY3RUZXJtKGUpfTsKKwlyZXR1cm4gbmV3IFN0cnVjdHVyZVRlcm0oSkFWQV9FUlJPUiwgYXJncyk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgYSB1bmRlcmx5aW5nIEphdmEgZXhjZXB0aW9uLiAqLworICAgIHB1YmxpYyBFeGNlcHRpb24gZ2V0RXhjZXB0aW9uKCkgeworCXJldHVybiBlOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgPGNvZGU+SmF2YUV4Y2VwdGlvbjwvY29kZT4uICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmcgcyA9ICJ7SkFWQSBFUlJPUjogIiArIGdvYWwudG9TdHJpbmcoKTsKKwlpZiAoYXJnTm8gPiAwKQorCSAgICBzICs9ICIgLSBhcmcgIiArIGFyZ05vOworCXMgKz0gIiwgb2NjdXJzICIgKyBlLnRvU3RyaW5nKCk7CisJcyArPSAifSI7CisJcmV0dXJuIHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2xhbmcvSmF2YU9iamVjdFRlcm0uamF2YSBiL3NyYy9sYW5nL0phdmFPYmplY3RUZXJtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU2YWJkMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sYW5nL0phdmFPYmplY3RUZXJtLmphdmEKQEAgLTAsMCArMSwxMTggQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nOworLyoqCisgKiBKYXZhLXRlcm0uPGJyPgorICogVGhlIDxjb2RlPkphdmFPYmplY3RUZXJtPC9jb2RlPiBjbGFzcyB3cmFwcyBhIGphdmEgb2JqZWN0Ljxicj4KKyAqIAorICogPHByZT4KKyAqICBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKyAqICBUZXJtIHQgPSBuZXcgSmF2YU9iamVjdFRlcm0obmV3IEhhc2h0YWJsZSgpKTsKKyAqICBIYXNodGFibGUgaGFzaCA9IChIYXNodGFibGUpKCgoSmF2YU9iamVjdFRlcm0pdCkub2JqZWN0KCkpOworICogPC9wcmU+CisgKgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhT2JqZWN0VGVybSBleHRlbmRzIFRlcm0geworICAgIC8qKiBIb2xkcyBhIGphdmEgb2JqZWN0IHRoYXQgdGhpcyA8Y29kZT5KYXZhT2JqZWN0VGVybTwvY29kZT4gd3JhcHMuICovCisgICAgcHJvdGVjdGVkIE9iamVjdCBvYmogPSBudWxsOworCisgICAgLyoqIEhvbGRzIGEgPGNvZGU+amF2YS5sYW5nLkNsYXNzPC9jb2RlPiBvZiBvYmplY3Qgd3JhcHBlZCBieSB0aGlzIDxjb2RlPkphdmFPYmplY3RUZXJtPC9jb2RlPi4gKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3MgY2xhenogPSBudWxsOworCisgICAgLyoqIENvbnN0cnVjdHMgYSBuZXcgUHJvbG9nIGphdmEtdGVybSB0aGF0IHdyYXBzIHRoZSBhcmd1bWVudCBvYmplY3QuICovCisgICAgcHVibGljIEphdmFPYmplY3RUZXJtKE9iamVjdCBfb2JqKSB7IAorCWlmIChfb2JqICE9IG51bGwpCisJICAgIHNldE9iamVjdChfb2JqKTsKKyAgICB9CisKKyAgICAvKiogU2V0cyB0aGUgYXJndW1lbnQgb2JqZWN0IHRvIHRoaXMgPGNvZGU+SmF2YU9iamVjdFRlcm08L2NvZGU+LiAqLworICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3QgX29iaikgeworCW9iaiAgID0gX29iajsKKwljbGF6eiA9IF9vYmouZ2V0Q2xhc3MoKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgb2JqZWN0IHdyYXBwZWQgYnkgdGhpcyA8Y29kZT5KYXZhT2JqZWN0VGVybTwvY29kZT4uICovCisgICAgcHVibGljIE9iamVjdCAgb2JqZWN0KCkgeyByZXR1cm4gb2JqOyB9CisKKyAgICAvKiogUmV0dXJucyBhIDxjb2RlPmphdmEubGFuZy5DbGFzczwvY29kZT4gb2Ygb2JqZWN0IHdyYXBwZWQgYnkgdGhpcyA8Y29kZT5KYXZhT2JqZWN0VGVybTwvY29kZT4uICovCisgICAgcHVibGljIENsYXNzICAgZ2V0Q2xhenooKSB7IHJldHVybiBjbGF6ejsgfQorCisgICAgcHVibGljIFN0cmluZyAgdG9RdW90ZWRTdHJpbmcoKSB7IHJldHVybiB0b1N0cmluZygpOyB9CisKKyAgICAvKiBUZXJtICovCisgICAgcHVibGljIGJvb2xlYW4gdW5pZnkoVGVybSB0LCBUcmFpbCB0cmFpbCkgeworCWlmICh0LmlzVmFyaWFibGUoKSkKKwkgICAgcmV0dXJuICgoVmFyaWFibGVUZXJtKXQpLnVuaWZ5KHRoaXMsIHRyYWlsKTsKKwlpZiAoISB0LmlzSmF2YU9iamVjdCgpKQorCSAgICByZXR1cm4gZmFsc2U7CisJcmV0dXJuIG9iai5lcXVhbHMoKChKYXZhT2JqZWN0VGVybSl0KS5vYmopOworICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSB3cmFwcGVkIG9iamVjdCBpcyBjb252ZXJ0aWJsZSB3aXRoIHRoZSBnaXZlbiBKYXZhIGNsYXNzIHR5cGUuCisgICAgICogQHJldHVybiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gd2hvc2UgdmFsdWUgaXMKKyAgICAgKiA8Y29kZT5jb252ZXJ0aWJsZShjbGF6eiwgdHlwZSk8L2NvZGU+LgorICAgICAqIEBzZWUgI2NsYXp6CisgICAgICogQHNlZSBUZXJtI2NvbnZlcnRpYmxlKENsYXNzLCBDbGFzcykKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb252ZXJ0aWJsZShDbGFzcyB0eXBlKSB7IHJldHVybiBjb252ZXJ0aWJsZShjbGF6eiwgdHlwZSk7IH0KKworICAgIC8qKiAKKyAgICAgKiBSZXR1cm5zIHRoZSBvYmplY3Qgd3JhcHBlZCBieSB0aGlzIDxjb2RlPkphdmFPYmplY3RUZXJtPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiA8Y29kZT5vYmo8L2NvZGU+LgorICAgICAqIEBzZWUgI29iagorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgdG9KYXZhKCkgeyByZXR1cm4gb2JqOyB9CisKKyAgICAvKiBPYmplY3QgKi8KKyAgICAvKioKKyAgICAgKiBDaGVja3MgPGVtPnRlcm0gZXF1YWxpdHk8L2VtPiBvZiB0d28gdGVybXMuCisgICAgICogVGhlIHJlc3VsdCBpcyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbmQgb25seSBpZiB0aGUgYXJndW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YKKyAgICAgKiA8Y29kZT5KYXZhT2JqZWN0VGVybTwvY29kZT4sIGFuZCAKKyAgICAgKiB0aGUgcGFpcnMgb2Ygd3JhcHBlZCBvYmplY3RzIGluIHRoZSB0d28gamF2YS10ZXJtIGFyZSA8ZW0+ZXF1YWw8L2VtPgorICAgICAqIGJ5IDxjb2RlPm9iai5lcXVhbHMoKChKYXZhT2JqZWN0VGVybSlvKS5vYmopPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gbyB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aC4gVGhpcyBtdXN0IGJlIGRlcmVmZXJlbmNlZC4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBvYmplY3QgcmVwcmVzZW50cyBhIGphdmEtdGVybQorICAgICAqIGVxdWl2YWxlbnQgdG8gdGhpcyA8Y29kZT5KYXZhT2JqZWN0VGVybTwvY29kZT4sIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAc2VlICNjb21wYXJlVG8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwlpZiAoISAobyBpbnN0YW5jZW9mIEphdmFPYmplY3RUZXJtKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCXJldHVybiBvYmouZXF1YWxzKCgoSmF2YU9iamVjdFRlcm0pbykub2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCXJldHVybiBvYmouaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPkphdmFPYmplY3RUZXJtPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCXJldHVybiBjbGF6ei5nZXROYW1lKCkgKyAiKCIgKyBoYXNoQ29kZSgpICsgIikiOworICAgIH0KKworICAgIC8qIENvbXBhcmFibGUgKi8KKyAgICAvKiogCisgICAgICogQ29tcGFyZXMgdHdvIHRlcm1zIGluIDxlbT5Qcm9sb2cgc3RhbmRhcmQgb3JkZXIgb2YgdGVybXM8L2VtPi48YnI+CisgICAgICogSXQgaXMgbm90ZWQgdGhhdCA8Y29kZT50MS5jb21wYXJlVG8odDIpID09IDA8L2NvZGU+IGhhcyB0aGUgc2FtZQorICAgICAqIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGFzIDxjb2RlPnQxLmVxdWFscyh0Mik8L2NvZGU+LgorICAgICAqIEBwYXJhbSBhbm90aGVyVGVybSB0aGUgdGVybSB0byBjb21wYXJlZCB3aXRoLiBJdCBtdXN0IGJlIGRlcmVmZXJlbmNlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSA8Y29kZT4wPC9jb2RlPiBpZiB0d28gdGVybXMgYXJlIGlkZW50aWNhbDsgCisgICAgICogYSB2YWx1ZSBsZXNzIHRoYW4gPGNvZGU+MDwvY29kZT4gaWYgdGhpcyB0ZXJtIGlzIDxlbT5iZWZvcmU8L2VtPiB0aGUgPGNvZGU+YW5vdGhlclRlcm08L2NvZGU+OworICAgICAqIGFuZCBhIHZhbHVlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiBpZiB0aGlzIHRlcm0gaXMgPGVtPmFmdGVyPC9lbT4gdGhlIDxjb2RlPmFub3RoZXJUZXJtPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhUZXJtIGFub3RoZXJUZXJtKSB7IC8vIGFub3RoZXJUZXJtIG11c3QgYmUgZGVyZWZlcmVuY2VkLgorCWlmIChhbm90aGVyVGVybS5pc1ZhcmlhYmxlKCkgCisJICAgIHx8IGFub3RoZXJUZXJtLmlzTnVtYmVyKCkgCisJICAgIHx8IGFub3RoZXJUZXJtLmlzU3ltYm9sKCkKKwkgICAgfHwgYW5vdGhlclRlcm0uaXNMaXN0KCkKKwkgICAgfHwgYW5vdGhlclRlcm0uaXNTdHJ1Y3R1cmUoKSkKKwkgICAgcmV0dXJuIEFGVEVSOworCWlmICghIGFub3RoZXJUZXJtLmlzSmF2YU9iamVjdCgpKQorCSAgICByZXR1cm4gQkVGT1JFOworCWlmIChvYmouZXF1YWxzKCgoSmF2YU9iamVjdFRlcm0pIGFub3RoZXJUZXJtKS5vYmopKQorCSAgICByZXR1cm4gRVFVQUw7CisJcmV0dXJuIG9iai5oYXNoQ29kZSgpIC0gKChKYXZhT2JqZWN0VGVybSkgYW5vdGhlclRlcm0pLm9iai5oYXNoQ29kZSgpOyAvLz8/PworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9sYW5nL0phdmFQcmVkaWNhdGUuamF2YSBiL3NyYy9sYW5nL0phdmFQcmVkaWNhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGExZmZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xhbmcvSmF2YVByZWRpY2F0ZS5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisvKioKKyAqIFRoZSBhYnN0cmFjdCBjbGFzcyA8Y29kZT5KYXZhUHJlZGljYXRlPC9jb2RlPiBjb250YWlucyBtZXRob2RzCisgKiBmb3IgaW50ZXJvcGVyYXRpbmcgd2l0aCBKYXZhPC9lbT4uPGJyPgorICogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgYnVpbHRpbiBwcmVkaWNhdGVzIGV4dGVuZHMgdGhpcyA8Y29kZT5KYXZhUHJlZGljYXRlPC9jb2RlPi4KKyAqIDx1bD4KKyAqIDxsaT48Y29kZT5qYXZhX2NvbnN0cnVjdG9yPC9jb2RlPgorICogPGxpPjxjb2RlPmphdmFfbWV0aG9kPC9jb2RlPi4KKyAqIDwvdWw+CisgKiAKKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YVByZWRpY2F0ZSBleHRlbmRzIFByZWRpY2F0ZSB7CisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgYWxsIHRlcm1zIGluIDxjb2RlPmFyZ3M8L2NvZGU+IGFyZSBjb252ZXJ0aWJsZQorICAgICAqIHRvIHRoZSBjb3JyZXNwb25kaW5nIEphdmEgdHlwZXMgaW4gPGNvZGU+cGFyYVR5cGVzPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+CisgICAgICogaWYgPGNvZGU+YXJnc1tpXS5jb252ZXJ0aWJsZShwYXJhVHlwZXNbaV0pPC9jb2RlPiBzdWNjZWVkcyBmb3IgYWxsIDxjb2RlPmk8L2NvZGU+LAorICAgICAqIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICogQHNlZSBUZXJtI2NvbnZlcnRpYmxlKENsYXNzKQorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNoZWNrUGFyYW1ldGVyVHlwZXMoQ2xhc3NbXSBwYXJhVHlwZXMsIFRlcm1bXSBhcmdzKSB7CisJaW50IGFyaXR5OworCWFyaXR5ID0gcGFyYVR5cGVzLmxlbmd0aDsKKwlpZiAoYXJpdHkgIT0gYXJncy5sZW5ndGgpCisJICAgIHJldHVybiBmYWxzZTsKKwlmb3IgKGludCBpPTA7IGk8YXJpdHk7IGkrKykgeworCSAgICBpZiAoISBhcmdzW2ldLmNvbnZlcnRpYmxlKHBhcmFUeXBlc1tpXSkpIHsKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisJfQorCXJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9sYW5nL0xpc3RUZXJtLmphdmEgYi9zcmMvbGFuZy9MaXN0VGVybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMmE0NTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGFuZy9MaXN0VGVybS5qYXZhCkBAIC0wLDAgKzEsMjM3IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZzsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworLyoqCisgKiBMaXN0Ljxicj4KKyAqIFRoZSBjbGFzcyA8Y29kZT5MaXN0VGVybTwvY29kZT4gcmVwcmVzZW50cyBhIGxpc3Qgc3RydWN0dXJlLjxicj4KKyAqIAorICogPHByZT4KKyAqICAlIFsxLDJdCisgKiAgVGVybSBOaWwgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woIltdIik7CisgKiAgVGVybSAgbjEgPSBJbnRlZ2VyVGVybSgxKTsKKyAqICBUZXJtICBuMiA9IEludGVnZXJUZXJtKDIpOworICogIFRlcm0gICB0ID0gbmV3IExpc3RUZXJtKG4xLCBuZXcgTGlzdFRlcm0objIsIE5pbCkpOworICogIAorICogIFRlcm0gY2FyID0gKChMaXN0VGVybSl0KS5jYXIoKTsKKyAqICBUZXJtIGNkciA9ICgoTGlzdFRlcm0pdCkuY2RyKCk7CisgKiA8L3ByZT4KKyAqCisgKiBIZXJlIGlzIHNhbXBsZSBwcm9ncmFtIGZvciBjcmVhdGluZyBhIGxpc3QgZnJvbSA8Y29kZT4xPC9jb2RlPiB0byA8Y29kZT5uPC9jb2RlPi4KKyAqIDxwcmU+CisgKiBwdWJsaWMgc3RhdGljIFRlcm0gbWFrZUxpc3QoaW50IG4pIHsKKyAqICAgVGVybSB0ID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJbXSIpOworICogICBmb3IgKGludCBpPW47IGk+MDsgaS0tKSB7CisgKiAgICAgdCA9IG5ldyBMaXN0VGVybShuZXcgSW50ZWdlclRlcm0oaSksIHQpOworICogICB9CisgKiAgIHJldHVybiB0OworICogfQorICogPC9wcmU+CisgKgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBMaXN0VGVybSBleHRlbmRzIFRlcm0geworICAgIC8qKiBBIGZ1bmN0b3IgPGNvZGU+Jy4nIC8yPC9jb2RlPi4gKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN5bWJvbFRlcm0gU1lNX0RPVCA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiLiIsIDIpOworCisgICAgLyoqIEhvbGRzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoaXMgPGNvZGU+TGlzdFRlcm08L2NvZGU+LiAqLworICAgIHByb3RlY3RlZCBUZXJtIGNhcjsKKworICAgIC8qKgorICAgICAqIEhvbGRzIHRoZSBsaXN0IGNvbnNpc3Rpbmcgb2YgYWxsIHRoZSByZXN0IG9mIHRoZSBlbGVtZW50cyBvZiAKKyAgICAgKiB0aGlzIDxjb2RlPkxpc3RUZXJtPC9jb2RlPiBidXQgdGhlIGZpcnN0IG9uZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVGVybSBjZHI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFByb2xvZyBsaXN0IHN0cnVjdHVyZQorICAgICAqIHN1Y2ggdGhhdCA8Y29kZT5fY2FyPC9jb2RlPiBpcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGlzIGxpc3QsIGFuZCAKKyAgICAgKiA8Y29kZT5fY2RyPC9jb2RlPiBpcyB0aGUgbGlzdCBjb25zaXN0aW5nIG9mIGFsbCB0aGUgcmVzdCBvZiB0aGUgCisgICAgICogZWxlbWVudHMgb2YgdGhpcyBsaXN0IGJ1dCB0aGUgZmlyc3Qgb25lLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0VGVybShUZXJtIF9jYXIsIFRlcm0gX2NkcikgeyAKKwljYXIgPSBfY2FyOworCWNkciA9IF9jZHI7IAorICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiA8Y29kZT5jYXI8L2NvZGU+LgorICAgICAqIEBzZWUgI2NhcgorICAgICAqLworICAgIHB1YmxpYyBUZXJtIGNhcigpIHsgcmV0dXJuIGNhcjsgfQorCisgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIG9mIDxjb2RlPmNkcjwvY29kZT4uCisgICAgICogQHNlZSAjY2RyCisgICAgICovCisgICAgcHVibGljIFRlcm0gY2RyKCkgeyByZXR1cm4gY2RyOyB9CisKKyAgICAvKiogU2V0cyB0aGUgdmFsdWUgdG8gPGNvZGU+Y2FyPC9jb2RlPi4KKyAgICAgKiBAc2VlICNjYXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYXIoVGVybSB0KSB7IGNhciA9IHQ7IH0KKworICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSB0byA8Y29kZT5jZHI8L2NvZGU+LgorICAgICAqIEBzZWUgI2NkcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENkcihUZXJtIHQpIHsgY2RyID0gdDsgfQorCisgICAgLyogVGVybSAqLworICAgIHB1YmxpYyBib29sZWFuIHVuaWZ5KFRlcm0gdCwgVHJhaWwgdHJhaWwpIHsKKwl0ID0gdC5kZXJlZmVyZW5jZSgpOworCWlmICh0LmlzVmFyaWFibGUoKSkgeworCSAgICAoKFZhcmlhYmxlVGVybSkgdCkuYmluZCh0aGlzLCB0cmFpbCk7CisJICAgIHJldHVybiB0cnVlOworCX0KKwlpZiAoISB0LmlzTGlzdCgpKQorCSAgICByZXR1cm4gZmFsc2U7CisJcmV0dXJuIGNhci51bmlmeSgoKExpc3RUZXJtKXQpLmNhcigpLCB0cmFpbCkgCisJICAgICYmIGNkci51bmlmeSgoKExpc3RUZXJtKXQpLmNkcigpLCB0cmFpbCk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHdob3NlIHZhbHVlIGlzCisgICAgICogPGNvZGU+Y29udmVydGlibGUoVmVjdG9yLmNsYXNzLCB0eXBlKTwvY29kZT4uCisgICAgICogQHNlZSBUZXJtI2NvbnZlcnRpYmxlKENsYXNzLCBDbGFzcykKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb252ZXJ0aWJsZShDbGFzcyB0eXBlKSB7IAorCXJldHVybiBjb252ZXJ0aWJsZShWZWN0b3IuY2xhc3MsIHR5cGUpOyAKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVGVybSBjb3B5KFByb2xvZyBlbmdpbmUpIHsgCisJcmV0dXJuIG5ldyBMaXN0VGVybShjYXIuY29weShlbmdpbmUpLCBjZHIuY29weShlbmdpbmUpKTsgCisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNHcm91bmQoKSB7CisJaWYgKCEgY2FyLmlzR3JvdW5kKCkpCisJICAgIHJldHVybiBmYWxzZTsKKwlpZiAoISBjZHIuaXNHcm91bmQoKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyA8Y29kZT5MaXN0VGVybTwvY29kZT4uICovCisgICAgcHVibGljIGludCBsZW5ndGgoKSB7CisJaW50IGNvdW50ID0gMDsKKwlUZXJtIHQgPSB0aGlzOworCXdoaWxlKHQuaXNMaXN0KCkpIHsKKwkgICAgY291bnQrKzsKKwkgICAgdCA9ICgoTGlzdFRlcm0pdCkuY2RyKCkuZGVyZWZlcmVuY2UoKTsKKwl9CisJcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBSZXR1cm5zIGEgPGNvZGU+amF2YS51dGlsLlZlY3RvcjwvY29kZT4gY29ycmVzcG9uZHMgdG8gdGhpcyA8Y29kZT5MaXN0VGVybTwvY29kZT4KKyAgICAgKiBhY2NvcmRpbmcgdG8gPGVtPlByb2xvZyBDYWZlIGludGVyb3BlcmFiaWxpdHkgd2l0aCBKYXZhPC9lbT4uCisgICAgICogQHJldHVybiBhIDxjb2RlPmphdmEudXRpbC5WZWN0b3I8L2NvZGU+IG9iamVjdCBlcXVpdmFsZW50IHRvCisgICAgICogdGhpcyA8Y29kZT5JbnRlZ2VyVGVybTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCB0b0phdmEoKSB7IAorCVZlY3RvcjxPYmplY3Q+IHZlYyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworCVRlcm0gdCA9IHRoaXM7CisJd2hpbGUodC5pc0xpc3QoKSkgeworCSAgICB2ZWMuYWRkRWxlbWVudCgoKExpc3RUZXJtKXQpLmNhcigpLmRlcmVmZXJlbmNlKCkudG9KYXZhKCkpOworCSAgICB0ID0gKChMaXN0VGVybSl0KS5jZHIoKS5kZXJlZmVyZW5jZSgpOyAgCisJfQorCXJldHVybiB2ZWM7CQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9RdW90ZWRTdHJpbmcoKSB7CisJVGVybSB4ID0gdGhpczsKKwlTdHJpbmcgcyA9ICJbIjsKKwlmb3IgKDs7KSB7CisJICAgIHMgKz0gKChMaXN0VGVybSl4KS5jYXIuZGVyZWZlcmVuY2UoKS50b1F1b3RlZFN0cmluZygpOworCSAgICB4ICA9ICgoTGlzdFRlcm0peCkuY2RyLmRlcmVmZXJlbmNlKCk7CisJICAgIGlmICghIHguaXNMaXN0KCkpCisJCWJyZWFrOworCSAgICBzICs9ICIsIjsKKwl9CisJaWYgKCEgeC5pc05pbCgpKQorCSAgICBzICs9ICJ8IiArIHgudG9RdW90ZWRTdHJpbmcoKTsKKwlzICs9ICJdIjsKKwlyZXR1cm4gczsKKyAgICB9CisKKyAgICAvKiBPYmplY3QgKi8KKyAgICAvKioKKyAgICAgKiBDaGVja3MgPGVtPnRlcm0gZXF1YWxpdHk8L2VtPiBvZiB0d28gdGVybXMuCisgICAgICogVGhlIHJlc3VsdCBpcyA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbmQgb25seSBpZiB0aGUgYXJndW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YKKyAgICAgKiA8Y29kZT5MaXN0VGVybTwvY29kZT4sIGFuZCAKKyAgICAgKiBhbGwgY29ycmVzcG9uZGluZyBwYWlycyBvZiBlbGVtZW50cyBpbiB0aGUgdHdvIGxpc3RzIGFyZSA8ZW0+dGVybS1lcXVhbDwvZW0+LgorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGguIFRoaXMgbXVzdCBiZSBkZXJlZmVyZW5jZWQuCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gb2JqZWN0IHJlcHJlc2VudHMgYSBQcm9sb2cgbGlzdAorICAgICAqIGVxdWl2YWxlbnQgdG8gdGhpcyA8Y29kZT5MaXN0VGVybTwvY29kZT4sIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAc2VlICNjb21wYXJlVG8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgIAlpZiAoISAob2JqIGluc3RhbmNlb2YgTGlzdFRlcm0pKQorICAgIAkgICAgcmV0dXJuIGZhbHNlOworCXJldHVybiBjYXIuZXF1YWxzKCgoTGlzdFRlcm0pb2JqKS5jYXIoKS5kZXJlZmVyZW5jZSgpKSAKKwkgICAgJiYgY2RyLmVxdWFscygoKExpc3RUZXJtKW9iaikuY2RyKCkuZGVyZWZlcmVuY2UoKSk7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwlpbnQgaCA9IDE7CisJaCA9IDMxKmggKyBTWU1fRE9ULmhhc2hDb2RlKCk7CisJaCA9IDMxKmggKyBjYXIuZGVyZWZlcmVuY2UoKS5oYXNoQ29kZSgpOworCWggPSAzMSpoICsgY2RyLmRlcmVmZXJlbmNlKCkuaGFzaENvZGUoKTsKKwlyZXR1cm4gaDsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPkxpc3RUZXJtPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCVRlcm0geCA9IHRoaXM7CQorCVN0cmluZyBzID0gIlsiOworCWZvciAoOzspIHsKKwkgICAgcyArPSAoKExpc3RUZXJtKXgpLmNhci5kZXJlZmVyZW5jZSgpLnRvU3RyaW5nKCk7CisJICAgIHggID0gKChMaXN0VGVybSl4KS5jZHIuZGVyZWZlcmVuY2UoKTsKKwkgICAgaWYgKCEgeC5pc0xpc3QoKSkKKwkJYnJlYWs7CisJICAgIHMgKz0gIiwiOworCX0KKwlpZiAoISB4LmlzTmlsKCkpCisJICAgIHMgKz0gInwiICsgeC50b1N0cmluZygpOworCXMgKz0gIl0iOworCXJldHVybiBzOworICAgIH0KKworICAgIC8qIENvbXBhcmFibGUgKi8KKyAgICAvKiogCisgICAgICogQ29tcGFyZXMgdHdvIHRlcm1zIGluIDxlbT5Qcm9sb2cgc3RhbmRhcmQgb3JkZXIgb2YgdGVybXM8L2VtPi48YnI+CisgICAgICogSXQgaXMgbm90ZWQgdGhhdCA8Y29kZT50MS5jb21wYXJlVG8odDIpID09IDA8L2NvZGU+IGhhcyB0aGUgc2FtZQorICAgICAqIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGFzIDxjb2RlPnQxLmVxdWFscyh0Mik8L2NvZGU+LgorICAgICAqIEBwYXJhbSBhbm90aGVyVGVybSB0aGUgdGVybSB0byBjb21wYXJlZCB3aXRoLiBJdCBtdXN0IGJlIGRlcmVmZXJlbmNlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSA8Y29kZT4wPC9jb2RlPiBpZiB0d28gdGVybXMgYXJlIGlkZW50aWNhbDsgCisgICAgICogYSB2YWx1ZSBsZXNzIHRoYW4gPGNvZGU+MDwvY29kZT4gaWYgdGhpcyB0ZXJtIGlzIDxlbT5iZWZvcmU8L2VtPiB0aGUgPGNvZGU+YW5vdGhlclRlcm08L2NvZGU+OworICAgICAqIGFuZCBhIHZhbHVlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiBpZiB0aGlzIHRlcm0gaXMgPGVtPmFmdGVyPC9lbT4gdGhlIDxjb2RlPmFub3RoZXJUZXJtPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhUZXJtIGFub3RoZXJUZXJtKSB7IC8vIGFub3RoZXJUZXJtIG11c3QgYmUgZGVyZWZlcmVuY2VkLgorCWlmIChhbm90aGVyVGVybS5pc1ZhcmlhYmxlKCkgfHwgYW5vdGhlclRlcm0uaXNOdW1iZXIoKSB8fCBhbm90aGVyVGVybS5pc1N5bWJvbCgpKQorCSAgICByZXR1cm4gQUZURVI7CisJaWYgKGFub3RoZXJUZXJtLmlzU3RydWN0dXJlKCkpIHsKKwkgICAgaW50IGFyaXR5ID0gKChTdHJ1Y3R1cmVUZXJtKWFub3RoZXJUZXJtKS5hcml0eSgpOworCSAgICBpZiAoMiAhPSBhcml0eSkKKwkJcmV0dXJuICgyIC0gYXJpdHkpOworCSAgICBTeW1ib2xUZXJtIGZ1bmN0b3IgPSAoKFN0cnVjdHVyZVRlcm0pYW5vdGhlclRlcm0pLmZ1bmN0b3IoKTsKKwkgICAgaWYgKCEgU1lNX0RPVC5lcXVhbHMoZnVuY3RvcikpCisJCXJldHVybiBTWU1fRE9ULmNvbXBhcmVUbyhmdW5jdG9yKTsKKwl9CisJVGVybVtdIGFyZ3MgPSBuZXcgVGVybVsyXTsKKwlpZiAoYW5vdGhlclRlcm0uaXNMaXN0KCkpIHsKKwkgICAgYXJnc1swXSA9ICgoTGlzdFRlcm0pYW5vdGhlclRlcm0pLmNhcigpOworCSAgICBhcmdzWzFdID0gKChMaXN0VGVybSlhbm90aGVyVGVybSkuY2RyKCk7CisJfSBlbHNlIGlmIChhbm90aGVyVGVybS5pc1N0cnVjdHVyZSgpKSB7CisJICAgIGFyZ3MgPSAoKFN0cnVjdHVyZVRlcm0pYW5vdGhlclRlcm0pLmFyZ3MoKTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gQkVGT1JFOworCX0KKwlUZXJtIHRtcCA9IGNhcjsKKwlpbnQgcmM7CisJZm9yIChpbnQgaT0wOyBpPDI7IGkrKykgeworCSAgICByYyA9IHRtcC5jb21wYXJlVG8oYXJnc1tpXS5kZXJlZmVyZW5jZSgpKTsKKwkgICAgaWYgKHJjICE9IEVRVUFMKSAKKwkJcmV0dXJuIHJjOworCSAgICB0bXAgPSBjZHI7CisJfQorCXJldHVybiBFUVVBTDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbGFuZy9NYWtlZmlsZSBiL3NyYy9sYW5nL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMmY4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGFuZy9NYWtlZmlsZQpAQCAtMCwwICsxLDI4IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCU1ha2VmaWxlIGZvciBQcm9sb2cgQ2FmZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRoZSBmb2xsb3dpbmcgdHdvIGRlZmluaXRpb25zIHdpbGwgYmUgb3ZlcnJpZGRlbi4KKyMKKyMgSkFWQUMgOiB0aGUgY29tbWFuZCBvZiBKYXZhIGNvbXBpbGVyIHN5c3RlbQorIyAgICAgICAgICAoZXguIGphdmFjKQorIyBKQVIgICA6IHRoZSBjb21tYW5kIG9mIEphciBhcmNoaXZlIHN5c3RlbQorIyAgICAgICAgICAoZXguIGphcikKKyMKK0pBVkFDICAgICA9IGphdmFjCitKQVZBQ09QVFMgPSAtZCAuIC1YbGludAorSkFSICAgICAgID0gamFyCitKQVJPUFRTICAgPSBjdmYKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2xhbmc6IAorCSQoSkFWQUMpICAkKEpBVkFDT1BUUykgKi5qYXZhCisJJChKQVIpICQoSkFST1BUUykgbGFuZy5qYXIganAvYWMva29iZV91L2NzL3Byb2xvZy9sYW5nLworCitjbGVhbjoKKwktcm0gLWYgLXIganAKKwktcm0gLWYgY29yZSAqfiAqLmNsYXNzICouamFyCisKK3JlYWxjbGVhbjogY2xlYW4KKworCmRpZmYgLS1naXQgYS9zcmMvbGFuZy9OdW1iZXJUZXJtLmphdmEgYi9zcmMvbGFuZy9OdW1iZXJUZXJtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3ZTYwMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sYW5nL051bWJlclRlcm0uamF2YQpAQCAtMCwwICsxLDEwMyBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmc7CisvKioKKyAqIFRoZSBzdXBlcmNsYXNzIG9mIGNsYXNzZXMgZm9yIGludGVnZXJzIGFuZCBmbG9hdGluZyBwb2ludCBudW1iZXJzLgorICoKKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTnVtYmVyVGVybSBleHRlbmRzIFRlcm0geworICAgIC8qKiBSZXR1cm5zIHRoZSBudW1lcmljIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoaXMgb2JqZWN0IGFmdGVyIGNvbnZlcnNpb24gdG8gdHlwZSA8Y29kZT5pbnQ8L2NvZGU+LiAqLworICAgIGFic3RyYWN0IHB1YmxpYyBpbnQgaW50VmFsdWUoKTsKKyAgICAvKiogUmV0dXJucyB0aGUgbnVtZXJpYyB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdCBhZnRlciBjb252ZXJzaW9uIHRvIHR5cGUgPGNvZGU+bG9uZzwvY29kZT4uICovCisgICAgYWJzdHJhY3QgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCk7CisgICAgLyoqIFJldHVybnMgdGhlIG51bWVyaWMgdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QgYWZ0ZXIgY29udmVyc2lvbiB0byB0eXBlIDxjb2RlPmRvdWJsZTwvY29kZT4uICovCisgICAgYWJzdHJhY3QgcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpOworCisgICAgLyoqIAorICAgICAqIENvbXBhcmVzIHR3byA8Y29kZT5OdW1iZXJUZXJtPC9jb2RlPiBvYmplY3RzIG51bWVyaWNhbGx5LgorICAgICAqIEBwYXJhbSB0IHRoZSA8Y29kZT5OdW1iZXJUZXJtPC9jb2RlPiB0byBjb21wYXJlIHdpdGguCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgPGNvZGU+MDwvY29kZT4KKyAgICAgKiBpZiB0aGlzIG9iamVjdCBpcyBudW1lcmljYWxseSBlcXVhbCB0byB0aGUgYXJndW1lbnQgPGNvZGU+TnVtYmVyVGVybTwvY29kZT47CisgICAgICogYSB2YWx1ZSBsZXNzIHRoYW4gPGNvZGU+MDwvY29kZT4KKyAgICAgKiBpZiB0aGlzIG9iamVjdCBpcyBudW1lcmljYWxseSBsZXNzIHRoYW4gdGhlIGFyZ3VtZW50IDxjb2RlPk51bWJlclRlcm08L2NvZGU+OyBhbmQKKyAgICAgKiBhIHZhbHVlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPgorICAgICAqIGlmIHRoaXMgb2JqZWN0IGlzIG51bWVyaWNhbGx5IGdyZWF0ZXIgdGhhbiB0aGUgYXJndW1lbnQgPGNvZGU+TnVtYmVyVGVybTwvY29kZT4uCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGludCBhcml0aENvbXBhcmVUbyhOdW1iZXJUZXJtIHQpOworCisgICAgLyoqIFJldHVybnMgYSA8Y29kZT5OdW1iZXJUZXJtPC9jb2RlPiB3aG9zZSB2YWx1ZSBpcyA8Y29kZT5hYnModGhpcyk8L2NvZGU+LiAqLworICAgIGFic3RyYWN0IHB1YmxpYyBOdW1iZXJUZXJtIGFicygpOworICAgIC8qKiBSZXR1cm5zIGEgPGNvZGU+TnVtYmVyVGVybTwvY29kZT4gd2hvc2UgdmFsdWUgaXMgPGNvZGU+YWNvcyh0aGlzKTwvY29kZT4uICovCisgICAgYWJzdHJhY3QgcHVibGljIE51bWJlclRlcm0gYWNvcygpOworICAgIC8qKiBSZXR1cm5zIGEgPGNvZGU+TnVtYmVyVGVybTwvY29kZT4gd2hvc2UgdmFsdWUgaXMgPGNvZGU+KHRoaXMgKyB0KTwvY29kZT4uICovCisgICAgYWJzdHJhY3QgcHVibGljIE51bWJlclRlcm0gYWRkKE51bWJlclRlcm0gdCk7CisgICAgLyoqIFJldHVybnMgYSA8Y29kZT5OdW1iZXJUZXJtPC9jb2RlPiB3aG9zZSB2YWx1ZSBpcyA8Y29kZT4odGhpcyAmYW1wOyB0KTwvY29kZT4uICovCisgICAgYWJzdHJhY3QgcHVibGljIE51bWJlclRlcm0gYW5kKE51bWJlclRlcm0gdCk7CisgICAgLyoqIFJldHVybnMgYSA8Y29kZT5OdW1iZXJUZXJtPC9jb2RlPiB3aG9zZSB2YWx1ZSBpcyA8Y29kZT5hc2luKHRoaXMpPC9jb2RlPi4gKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgTnVtYmVyVGVybSBhc2luKCk7CisgICAgLyoqIFJldHVybnMgYSA8Y29kZT5OdW1iZXJUZXJtPC9jb2RlPiB3aG9zZSB2YWx1ZSBpcyA8Y29kZT50YW4odGhpcyk8L2NvZGU+LiAqLworICAgIGFic3RyYWN0IHB1YmxpYyBOdW1iZXJUZXJtIGF0YW4oKTsKKyAgICAvKiogUmV0dXJucyBhIDxjb2RlPk51bWJlclRlcm08L2NvZGU+IHdob3NlIHZhbHVlIGlzIDxjb2RlPmNlaWwodGhpcyk8L2NvZGU+LiAqLworICAgIGFic3RyYWN0IHB1YmxpYyBOdW1iZXJUZXJtIGNlaWwoKTsKKyAgICAvKiogUmV0dXJucyBhIDxjb2RlPk51bWJlclRlcm08L2NvZGU+IHdob3NlIHZhbHVlIGlzIDxjb2RlPmNvcyh0aGlzKTwvY29kZT4uICovCisgICAgYWJzdHJhY3QgcHVibGljIE51bWJlclRlcm0gY29zKCk7CisgICAgLyoqIFJldHVybnMgYSA8Y29kZT5OdW1iZXJUZXJtPC9jb2RlPiB3aG9zZSB2YWx1ZSBpcyA8Y29kZT4odGhpcyAvIHQpPC9jb2RlPi4gKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgTnVtYmVyVGVybSBkaXZpZGUoTnVtYmVyVGVybSB0KTsKKyAgICAvKiogUmV0dXJucyBhIDxjb2RlPk51bWJlclRlcm08L2NvZGU+IHdob3NlIHZhbHVlIGlzIDxjb2RlPmV4cCh0aGlzKTwvY29kZT4uICovCisgICAgYWJzdHJhY3QgcHVibGljIE51bWJlclRlcm0gZXhwKCk7CisgICAgLyoqIFJldHVybnMgYSA8Y29kZT5OdW1iZXJUZXJtPC9jb2RlPiB3aG9zZSB2YWx1ZSBpcyB0aGUgZmxvYXQtaW50ZWdlci1wYXJ0IG9mIDxjb2RlPnRoaXM8L2NvZGU+LiAqLworICAgIGFic3RyYWN0IHB1YmxpYyBOdW1iZXJUZXJtIGZsb2F0SW50UGFydCgpOworICAgIC8qKiBSZXR1cm5zIGEgPGNvZGU+TnVtYmVyVGVybTwvY29kZT4gd2hvc2UgdmFsdWUgaXMgdGhlIGZsb2F0LWZyYWN0aW9uYWwtcGFydCBvZiA8Y29kZT50aGlzPC9jb2RlPi4gKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgTnVtYmVyVGVybSBmbG9hdEZyYWN0UGFydCgpOworICAgIC8qKiBSZXR1cm5zIGEgPGNvZGU+TnVtYmVyVGVybTwvY29kZT4gd2hvc2UgdmFsdWUgaXMgPGNvZGU+Zmxvb3IodGhpcyk8L2NvZGU+LiAqLworICAgIGFic3RyYWN0IHB1YmxpYyBOdW1iZXJUZXJtIGZsb29yKCk7CisgICAgLyoqIFJldHVybnMgYSA8Y29kZT5OdW1iZXJUZXJtPC9jb2RlPiB3aG9zZSB2YWx1ZSBpcyA8Y29kZT4oaW50KSh0aGlzIC8gdCk8L2NvZGU+LiAqLworICAgIGFic3RyYWN0IHB1YmxpYyBOdW1iZXJUZXJtIGludERpdmlkZShOdW1iZXJUZXJtIHQpOworICAgIC8qKiBSZXR1cm5zIGEgPGNvZGU+TnVtYmVyVGVybTwvY29kZT4gd2hvc2UgdmFsdWUgaXMgPGNvZGU+bG9nKHRoaXMpPC9jb2RlPi4gKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgTnVtYmVyVGVybSBsb2coKTsKKyAgICAvKiogUmV0dXJucyBhIDxjb2RlPk51bWJlclRlcm08L2NvZGU+IHdob3NlIHZhbHVlIGlzIDxjb2RlPm1heCh0aGlzLCB0KTwvY29kZT4uICovCisgICAgYWJzdHJhY3QgcHVibGljIE51bWJlclRlcm0gbWF4KE51bWJlclRlcm0gdCk7CisgICAgLyoqIFJldHVybnMgYSA8Y29kZT5OdW1iZXJUZXJtPC9jb2RlPiB3aG9zZSB2YWx1ZSBpcyA8Y29kZT5taW4odGhpcywgdCk8L2NvZGU+LiAqLworICAgIGFic3RyYWN0IHB1YmxpYyBOdW1iZXJUZXJtIG1pbihOdW1iZXJUZXJtIHQpOworICAgIC8qKiBSZXR1cm5zIGEgPGNvZGU+TnVtYmVyVGVybTwvY29kZT4gd2hvc2UgdmFsdWUgaXMgPGNvZGU+KHRoaXMgbW9kIHQpPC9jb2RlPi4gKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgTnVtYmVyVGVybSBtb2QoTnVtYmVyVGVybSB0KTsKKyAgICAvKiogUmV0dXJucyBhIDxjb2RlPk51bWJlclRlcm08L2NvZGU+IHdob3NlIHZhbHVlIGlzIDxjb2RlPih0aGlzICogdCk8L2NvZGU+LiAqLworICAgIGFic3RyYWN0IHB1YmxpYyBOdW1iZXJUZXJtIG11bHRpcGx5KE51bWJlclRlcm0gdCk7CisgICAgLyoqIFJldHVybnMgYSA8Y29kZT5OdW1iZXJUZXJtPC9jb2RlPiB3aG9zZSB2YWx1ZSBpcyA8Y29kZT4oLSB0aGlzKTwvY29kZT4uICovCisgICAgYWJzdHJhY3QgcHVibGljIE51bWJlclRlcm0gbmVnYXRlKCk7CisgICAgLyoqIFJldHVybnMgYSA8Y29kZT5OdW1iZXJUZXJtPC9jb2RlPiB3aG9zZSB2YWx1ZSBpcyA8Y29kZT4ofiB0aGlzKTwvY29kZT4uICovCisgICAgYWJzdHJhY3QgcHVibGljIE51bWJlclRlcm0gbm90KCk7CisgICAgLyoqIFJldHVybnMgYSA8Y29kZT5OdW1iZXJUZXJtPC9jb2RlPiB3aG9zZSB2YWx1ZSBpcyA8Y29kZT4odGhpcyB8IHQpPC9jb2RlPi4gKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgTnVtYmVyVGVybSBvcihOdW1iZXJUZXJtIHQpOworICAgIC8qKiBSZXR1cm5zIGEgPGNvZGU+TnVtYmVyVGVybTwvY29kZT4gd2hvc2UgdmFsdWUgaXMgPGNvZGU+KHRoaXM8c3VwPnQ8L3N1cD4pPC9jb2RlPi4gKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgTnVtYmVyVGVybSBwb3coTnVtYmVyVGVybSB0KTsKKyAgICAvKiogUmV0dXJucyBhIDxjb2RlPk51bWJlclRlcm08L2NvZGU+IHdob3NlIHZhbHVlIGlzIDxjb2RlPnJpbnQodGhpcyk8L2NvZGU+LiAqLworICAgIGFic3RyYWN0IHB1YmxpYyBOdW1iZXJUZXJtIHJpbnQoKTsKKyAgICAvKiogUmV0dXJucyBhIDxjb2RlPk51bWJlclRlcm08L2NvZGU+IHdob3NlIHZhbHVlIGlzIDxjb2RlPnJvdW5kKHRoaXMpPC9jb2RlPi4gKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgTnVtYmVyVGVybSByb3VuZCgpOworICAgIC8qKiBSZXR1cm5zIGEgPGNvZGU+TnVtYmVyVGVybTwvY29kZT4gd2hvc2UgdmFsdWUgaXMgPGNvZGU+KHRoaXMgJmx0OyZsdDsgdCk8L2NvZGU+LiAqLworICAgIGFic3RyYWN0IHB1YmxpYyBOdW1iZXJUZXJtIHNoaWZ0TGVmdChOdW1iZXJUZXJtIHQpOworICAgIC8qKiBSZXR1cm5zIGEgPGNvZGU+TnVtYmVyVGVybTwvY29kZT4gd2hvc2UgdmFsdWUgaXMgPGNvZGU+KHRoaXMgJmd0OyZndDsgdCk8L2NvZGU+LiAqLworICAgIGFic3RyYWN0IHB1YmxpYyBOdW1iZXJUZXJtIHNoaWZ0UmlnaHQoTnVtYmVyVGVybSB0KTsKKyAgICAvKiogUmV0dXJucyBhIDxjb2RlPk51bWJlclRlcm08L2NvZGU+IHdob3NlIHZhbHVlIGlzIDxjb2RlPnNpZ251bSh0aGlzKTwvY29kZT4uICovCisgICAgYWJzdHJhY3QgcHVibGljIE51bWJlclRlcm0gc2lnbnVtKCk7CisgICAgLyoqIFJldHVybnMgYSA8Y29kZT5OdW1iZXJUZXJtPC9jb2RlPiB3aG9zZSB2YWx1ZSBpcyA8Y29kZT5zaW4odGhpcyk8L2NvZGU+LiAqLworICAgIGFic3RyYWN0IHB1YmxpYyBOdW1iZXJUZXJtIHNpbigpOworICAgIC8qKiBSZXR1cm5zIGEgPGNvZGU+TnVtYmVyVGVybTwvY29kZT4gd2hvc2UgdmFsdWUgaXMgPGNvZGU+c3FydCh0aGlzKTwvY29kZT4uICovCisgICAgYWJzdHJhY3QgcHVibGljIE51bWJlclRlcm0gc3FydCgpOworICAgIC8qKiBSZXR1cm5zIGEgPGNvZGU+TnVtYmVyVGVybTwvY29kZT4gd2hvc2UgdmFsdWUgaXMgPGNvZGU+KHRoaXMgLSB0KTwvY29kZT4uICovCisgICAgYWJzdHJhY3QgcHVibGljIE51bWJlclRlcm0gc3VidHJhY3QoTnVtYmVyVGVybSB0KTsKKyAgICAvKiogUmV0dXJucyBhIDxjb2RlPk51bWJlclRlcm08L2NvZGU+IHdob3NlIHZhbHVlIGlzIDxjb2RlPnRhbih0aGlzKTwvY29kZT4uICovCisgICAgYWJzdHJhY3QgcHVibGljIE51bWJlclRlcm0gdGFuKCk7CisgICAgLyoqIFJldHVybnMgYSA8Y29kZT5OdW1iZXJUZXJtPC9jb2RlPiB3aG9zZSB2YWx1ZSBpcyA8Y29kZT50b0RlZ3JlZXModGhpcyk8L2NvZGU+LiAqLworICAgIGFic3RyYWN0IHB1YmxpYyBOdW1iZXJUZXJtIHRvRGVncmVlcygpOworICAgIC8qKiBSZXR1cm5zIGEgPGNvZGU+TnVtYmVyVGVybTwvY29kZT4gd2hvc2UgdmFsdWUgaXMgPGNvZGU+KGRvdWJsZSkodGhpcyk8L2NvZGU+LiAqLworICAgIGFic3RyYWN0IHB1YmxpYyBOdW1iZXJUZXJtIHRvRmxvYXQoKTsKKyAgICAvKiogUmV0dXJucyBhIDxjb2RlPk51bWJlclRlcm08L2NvZGU+IHdob3NlIHZhbHVlIGlzIDxjb2RlPnRvUmFkaWFucyh0aGlzKTwvY29kZT4uICovCisgICAgYWJzdHJhY3QgcHVibGljIE51bWJlclRlcm0gdG9SYWRpYW5zKCk7CisgICAgLyoqIFJldHVybnMgYSA8Y29kZT5OdW1iZXJUZXJtPC9jb2RlPiB3aG9zZSB2YWx1ZSBpcyB0aGUgdHJ1bmNhdGUgb2YgPGNvZGU+dGhpczwvY29kZT4uICovCisgICAgYWJzdHJhY3QgcHVibGljIE51bWJlclRlcm0gdHJ1bmNhdGUoKTsKKyAgICAvKiogUmV0dXJucyBhIDxjb2RlPk51bWJlclRlcm08L2NvZGU+IHdob3NlIHZhbHVlIGlzIDxjb2RlPih0aGlzIF4gdCk8L2NvZGU+LiAqLworICAgIGFic3RyYWN0IHB1YmxpYyBOdW1iZXJUZXJtIHhvcihOdW1iZXJUZXJtIHQpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2xhbmcvT3V0T2ZMb29wLmphdmEgYi9zcmMvbGFuZy9PdXRPZkxvb3AuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTQzZjk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xhbmcvT3V0T2ZMb29wLmphdmEKQEAgLTAsMCArMSwyNCBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmc7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisvKioKKyAqIEEgdHJhaWwgZW50cnkgZm9yIG91dC1vZi1sb29wIGZsYWcuPGJyPgorICogVGhpcyA8Y29kZT5PdXRPZkxvb3A8L2NvZGU+IGNsYXNzIGlzIHVzZWQgaW4gCisgKiBzdWJjbGFzc2VzIG9mIDxjb2RlPkJsb2NrUHJlZGljYXRlPC9jb2RlPi48YnI+CisgKiA8Zm9udCBjb2xvcj0icmVkIj5UaGlzIGRvY3VtZW50IGlzIHVuZGVyIGNvbnN0cnVjdGlvbi48L2ZvbnQ+CisgKgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBPdXRPZkxvb3AgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsVW5kb2FibGUgeworICAgIEJsb2NrUHJlZGljYXRlIHA7CisKKyAgICBwdWJsaWMgT3V0T2ZMb29wKEJsb2NrUHJlZGljYXRlIF9wKSB7CisJcCA9IF9wOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVuZG8oKSB7CisJcC5vdXRPZkxvb3AgPSB0cnVlOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc3JjL2xhbmcvT3V0T2ZTY29wZS5qYXZhIGIvc3JjL2xhbmcvT3V0T2ZTY29wZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOGVmZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGFuZy9PdXRPZlNjb3BlLmphdmEKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmc7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisvKioKKyAqIEEgdHJhaWwgZW50cnkgZm9yIG91dC1vZi1zY29wZSBmbGFnLjxicj4KKyAqIFRoaXMgPGNvZGU+T3V0T2ZTY29wZTwvY29kZT4gY2xhc3MgaXMgdXNlZCBpbiAKKyAqIHN1YmNsYXNzZXMgb2YgPGNvZGU+QmxvY2tQcmVkaWNhdGU8L2NvZGU+Ljxicj4KKyAqIDxmb250IGNvbG9yPSJyZWQiPlRoaXMgZG9jdW1lbnQgaXMgdW5kZXIgY29uc3RydWN0aW9uLjwvZm9udD4KKyAqCisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIE91dE9mU2NvcGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUsVW5kb2FibGUgeworICAgIEJsb2NrUHJlZGljYXRlIHA7CisKKyAgICBwdWJsaWMgT3V0T2ZTY29wZShCbG9ja1ByZWRpY2F0ZSBfcCkgeworCXAgPSBfcDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bmRvKCkgeworCXAub3V0T2ZTY29wZSA9IGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9sYW5nL1BJbnN0YW50aWF0aW9uRXhjZXB0aW9uLmphdmEgYi9zcmMvbGFuZy9QSW5zdGFudGlhdGlvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTExMzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGFuZy9QSW5zdGFudGlhdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nOworLyoqCisgKiBJbnN0YW50aWF0aW9uIGVycm9yLjxicj4KKyAqIFRoZXJlIHdpbGwgYmUgYW4gaW5zdGFudGlhdGlvbiBlcnJvciAKKyAqIHdoZW4gYW4gYXJndW1lbnQgb2Ygb25lIG9mIGl0cyBjb21wb25lbnRzIGlzIGEgdmFyaWFibGUsCisgKiBhbmQgYW4gaW5zdGFudGlhdGVkIGFyZ3VtZW50IG9yIGNvbXBvbmVudCBpcyByZXF1aXJlZC4KKyAqCisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIFBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgQnVpbHRpbkV4Y2VwdGlvbiB7CisgICAgLyoqIEEgZnVuY3RvciBzeW1ib2wgb2YgPGNvZGU+aW5zdGFudGlhdGlvbi8yPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFRlcm0gSU5TVEFOVElBVElPTl9FUlJPUiA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiaW5zdGFudGlhdGlvbl9lcnJvciIsIDIpOworCisgICAgLyoqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+UEluc3RhbnRpYXRpb25FeGNlcHRpb248L2NvZGU+LiAqLworICAgIHB1YmxpYyBQSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigpe30KKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPlBJbnN0YW50aWF0aW9uRXhjZXB0aW9uPC9jb2RlPgorICAgICAqIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gKi8KKyAgICBwdWJsaWMgUEluc3RhbnRpYXRpb25FeGNlcHRpb24oUHJlZGljYXRlIF9nb2FsLCBpbnQgX2FyZ05vKSB7CisJdGhpcy5nb2FsICAgID0gX2dvYWw7CisJdGhpcy5hcmdObyAgID0gX2FyZ05vOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIGEgdGVybSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPlBJbnN0YW50aWF0aW9uRXhjZXB0aW9uPC9jb2RlPjoKKyAgICAgKiA8Y29kZT5pbnN0YW50aWF0aW9uX2Vycm9yKGdvYWwsYXJnTm8pPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGVybSBnZXRNZXNzYWdlVGVybSgpIHsKKwlUZXJtW10gYXJncyA9IHtuZXcgSmF2YU9iamVjdFRlcm0oZ29hbCksIG5ldyBJbnRlZ2VyVGVybShhcmdObyl9OworCXJldHVybiBuZXcgU3RydWN0dXJlVGVybShJTlNUQU5USUFUSU9OX0VSUk9SLCBhcmdzKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPlBJbnN0YW50aWF0aW9uRXhjZXB0aW9uPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCVN0cmluZyBzID0gIntJTlNUQU5USUFUSU9OIEVSUk9SOiAiICsgZ29hbC50b1N0cmluZygpOworCWlmIChhcmdObyA+IDApCisJICAgIHMgKz0gIiAtIGFyZyAiICsgYXJnTm87CisJcyArPSAifSI7CisJcmV0dXJuIHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2xhbmcvUGVybWlzc2lvbkV4Y2VwdGlvbi5qYXZhIGIvc3JjL2xhbmcvUGVybWlzc2lvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNmM3ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGFuZy9QZXJtaXNzaW9uRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw2OCBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmc7CisvKioKKyAqIFBlcm1pc3Npb24gZXJyb3IuPGJyPgorICogVGhlcmUgd2lsbCBiZSBhIHBlcm1pc3Npb24gZXJyb3Igd2hlbiBpdCBpcyBub3QgcGVybWl0dGVkCisgKiB0byBwZXJmb3JtIGEgc3BlY2lmaWMgb3BlcmF0aW9uLgorICoKKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgUGVybWlzc2lvbkV4Y2VwdGlvbiBleHRlbmRzIEJ1aWx0aW5FeGNlcHRpb24geworICAgIC8qKiBBIGZ1bmN0b3Igc3ltYm9sIG9mIDxjb2RlPnBlcm1pc3Npb25fZXJyb3IvNTwvY29kZT4uICovCisgICAgcHVibGljIHN0YXRpYyBTeW1ib2xUZXJtIFBFUk1JU1NJT05fRVJST1IgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woInBlcm1pc3Npb25fZXJyb3IiLCA1KTsKKworICAgIC8qIG9wZXJhdGlvbiA6Oj0gYWNjZXNzIHwgY3JlYXRlIHwgaW5wdXQgfCBtb2RpZnkgfCBvcGVuIHwgb3V0cHV0IHwgcmVwb3NpdGlvbiB8IG5ldyAqLworICAgIC8qKiBIb2xkcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvcGVyYXRpb24uICovCisgICAgcHVibGljIFN0cmluZyBvcGVyYXRpb247CisKKyAgICAvKgorICAgICAgcGVybWlzc2lvblR5cGUgOjo9IGJpbmFyeV9zdHJlYW0gfCBmbGFnIHwgb3BlcmF0b3IgfCBwYXN0X2VuZF9vZl9zdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlX3Byb2NlZHVyZSB8IHN0YXRpY19wcm9jZWR1cmUgfCBzb3VyY2Vfc2luaworCQkJIHN0cmVhbSB8IHRleHRfc3RyZWFtCisgICAgKi8KKyAgICAvKiogSG9sZHMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgcGVybWlzc2lvbiB0eXBlLiAqLworICAgIHB1YmxpYyBTdHJpbmcgcGVybWlzc2lvblR5cGU7CisKKyAgICAvKiogSG9sZHMgdGhlIGFyZ3VtZW50IG9yIG9uZSBvZiBpdHMgY29tcG9uZW50cyB3aGljaCBjYXVzZWQgdGhlIGVycm9yLiAqLworICAgIHB1YmxpYyBUZXJtIGN1bHByaXQ7CisKKyAgICAvKiogSG9sZHMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZGV0YWlsIG1lc3NhZ2UuICovCisgICAgcHVibGljIFN0cmluZyBtZXNzYWdlOworCisgICAgLyoqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+UGVybWlzc2lvbkV4Y2VwdGlvbjwvY29kZT4KKyAgICAgKiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuICovCisgICAgcHVibGljIFBlcm1pc3Npb25FeGNlcHRpb24oUHJlZGljYXRlIF9nb2FsLCAKKwkJCSAgICAgICBTdHJpbmcgX29wZXJhdGlvbiwgCisJCQkgICAgICAgU3RyaW5nIF9wZXJtaXNzaW9uVHlwZSwgCisJCQkgICAgICAgVGVybSBfY3VscHJpdCwgCisJCQkgICAgICAgU3RyaW5nIF9tZXNzYWdlKSB7CisJdGhpcy5nb2FsID0gX2dvYWw7CisJb3BlcmF0aW9uID0gX29wZXJhdGlvbjsKKwlwZXJtaXNzaW9uVHlwZSAgID0gX3Blcm1pc3Npb25UeXBlOworCWN1bHByaXQgICA9IF9jdWxwcml0OworCW1lc3NhZ2UgICA9IF9tZXNzYWdlOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIGEgdGVybSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPlBlcm1pc3Npb25FeGNlcHRpb248L2NvZGU+OgorICAgICAqIDxjb2RlPnBlcm1pc3Npb25fZXJyb3IoZ29hbCxhcmdObyxvcGVyYXRpb24scGVybWlzc2lvblR5cGUsY3VscHJpdCxtZXNzYWdlKTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFRlcm0gZ2V0TWVzc2FnZVRlcm0oKSB7CisJVGVybVtdIGFyZ3MgPSB7CisJICAgIG5ldyBKYXZhT2JqZWN0VGVybShnb2FsKSwgCisJICAgIFN5bWJvbFRlcm0ubWFrZVN5bWJvbChvcGVyYXRpb24pLAorCSAgICBTeW1ib2xUZXJtLm1ha2VTeW1ib2wocGVybWlzc2lvblR5cGUpLAorCSAgICBjdWxwcml0LAorCSAgICBTeW1ib2xUZXJtLm1ha2VTeW1ib2wobWVzc2FnZSl9OworCXJldHVybiBuZXcgU3RydWN0dXJlVGVybShQRVJNSVNTSU9OX0VSUk9SLCBhcmdzKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPlBlcm1pc3Npb25FeGNlcHRpb248L2NvZGU+LiAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJU3RyaW5nIHMgPSAie1BFUk1JU1NJT04gRVJST1I6ICIgKyBnb2FsLnRvU3RyaW5nKCk7CisJcyArPSAiIC0gY2FuIG5vdCAiICsgb3BlcmF0aW9uICsgIiAiICsgcGVybWlzc2lvblR5cGUgKyAiICIgKyBjdWxwcml0LnRvU3RyaW5nKCk7CisJcyArPSAiOiAiICsgbWVzc2FnZTsKKwlzICs9ICJ9IjsKKwlyZXR1cm4gczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbGFuZy9QcmVkaWNhdGUuamF2YSBiL3NyYy9sYW5nL1ByZWRpY2F0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNTgyN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGFuZy9QcmVkaWNhdGUuamF2YQpAQCAtMCwwICsxLDI5IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZzsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKy8qKgorICogVGhlIHN1cGVyY2xhc3Mgb2YgY2xhc3NlcyBmb3IgcHJlZGljYXRlcy4KKyAqIFRoZSBzdWJjbGFzc2VzIG9mIDxjb2RlPlByZWRpY2F0ZTwvY29kZT4gbXVzdCBvdmVycmlkZQorICogdGhlIDxjb2RlPmV4ZWM8L2NvZGU+IGFuZCA8Y29kZT5hcml0eTwvY29kZT4gbWV0aG9kcy4KKyAqCisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFByZWRpY2F0ZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgLyoqIEhvbGRzIGEgY29udGludWF0aW9uIGdvYWwgKi8KKyAgICBwdWJsaWMgUHJlZGljYXRlIGNvbnQgPSBudWxsOworCisgICAgLyoqIAorICAgICAqIEV4ZWN1dGVzIHRoaXMgcHJlZGljYXRlIGFuZCByZXR1cm5zIGEgY29udGludWF0aW9uIGdvYWwuCisgICAgICogQHBhcmFtIGVuZ2luZSBjdXJyZW50IFByb2xvZyBlbmdpbmUKKyAgICAgKiBAZXhjZXB0aW9uIFByb2xvZ0V4Y2VwdGlvbiBpZiBhIFByb2xvZyBleGNlcHRpb24gaXMgcmFpc2VkLgorICAgICAqIEBzZWUgUHJvbG9nCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHRocm93cyBQcm9sb2dFeGNlcHRpb247CisKKyAgICAvKiogUmV0dXJucyB0aGUgYXJpdHkgb2YgdGhpcyBwcmVkaWNhdGUuICovCisgICAgcHVibGljIGFic3RyYWN0IGludCBhcml0eSgpOworCisgICAgLyoqIFNldHMgdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgYW5kIGNvbnRpbnVhdGlvbiBnb2FsLiAqLworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3VtZW50KFRlcm1bXSBhcmdzLCBQcmVkaWNhdGUgY29udCl7fQorfQpkaWZmIC0tZ2l0IGEvc3JjL2xhbmcvUHJlZGljYXRlRW5jb2Rlci5qYXZhIGIvc3JjL2xhbmcvUHJlZGljYXRlRW5jb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NjIwOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGFuZy9QcmVkaWNhdGVFbmNvZGVyLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworLyoqCisgKiBUaGUgPGNvZGU+UHJlZGljYXRlRW5jb2RlcjwvY29kZT4gY2xhc3MgY29udGFpbnMgc3RhdGljIG1ldGhvZHMgZm9yIGVuY29kaW5nIHByZWRpY2F0ZSBuYW1lcy48YnI+CisgKiBUaGUgcHJlZGljYXRlIHdpdGggPGNvZGU+aG9nZTpmL248L2NvZGU+IGlzIGVuY29kZWQgdG8gPGNvZGU+aG9nZS5QUkVEX2ZfbjwvY29kZT4sIHdoZXJlCisgKiA8Y29kZT5ob2dlPC9jb2RlPiBpcyBwYWNrYWdlIG5hbWUsCisgKiA8Y29kZT5mPC9jb2RlPiBpcyBwcmVkaWNhdGUgbmFtZSwgYW5kIAorICogPGNvZGU+bjwvY29kZT4gaXMgYXJpdHkuPGJyPgorICoKKyAqIFdoZW4gZW5jb2RpbmcgYSBwcmVkaWNhdGUgbmFtZSwgd2UgYXBwbHkgdGhlIGZvbGxvd2luZyBydWxlczo8YnI+CisgKjx1bD4KKyAqPGxpPlRoZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycworICogJmxkcXVvOzxjb2RlPmE8L2NvZGU+JnJkcXVvOyB0aHJvdWdoICZsZHF1bzs8Y29kZT56PC9jb2RlPiZyZHF1bzssIAorICogJmxkcXVvOzxjb2RlPkE8L2NvZGU+JnJkcXVvOyB0aHJvdWdoICZsZHF1bzs8Y29kZT5aPC9jb2RlPiZyZHF1bzsgYW5kIAorICogJmxkcXVvOzxjb2RlPjA8L2NvZGU+JnJkcXVvOyB0aHJvdWdoICZsZHF1bzs8Y29kZT45PC9jb2RlPiZyZHF1bzsgcmVtYWluIHRoZSBzYW1lLgorICo8bGk+VGhlIHNwZWNpYWwgY2hhcmFjdGVycyAmbGRxdW87PGNvZGU+XzwvY29kZT4mcmRxdW87IGFuZCAmbGRxdW87PGNvZGU+JDwvY29kZT4mcmRxdW87IHJlbWFpbiB0aGUgc2FtZS4KKyAqPGxpPkFsbCBvdGhlciBjaGFyYWN0ZXJzIGFyZSBmaXJzdCBjb252ZXJ0ZWQgaW50byBhIGxpc3Qgb2YgY2hhcmFjdGVyIGNvZGVzLiAKKyAqIFRoZW4gZWFjaCBjaGFyYWN0ZXIgY29kZSBpcyByZXByZXNlbnRlZCBieSB0aGUgNS1jaGFyYWN0ZXIgc3RyaW5nICZsZHF1bzs8Y29kZT4kWFlaVzwvY29kZT4mcmRxdW87LCAKKyAqIHdoZXJlIDxjb2RlPlhZWlc8L2NvZGU+IGlzIHRoZSBmb3VyLWRpZ2l0IGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgY29kZS4KKyAqPC91bD4KKyAqCisgKiBGb3IgZXhhbXBsZSwKKyAqIGEgcHJlZGljYXRlIHdpdGggPGNvZGU+aG9nZTooPS4uKS8yPC9jb2RlPiBpcyBlbmNvZGVkIHRvIDxjb2RlPmhvZ2UuUFJFRF8kMDAzRCQwMDJFJDAwMkVfMjwvY29kZT4uCisgKgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4xCisgKi8KK3B1YmxpYyBjbGFzcyBQcmVkaWNhdGVFbmNvZGVyIHsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgY2xhc3MgZm9yCisgICAgICogdGhlIHByZWRpY2F0ZSB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCisgICAgICogQHBhcmFtIHBrZyBwYWNrYWdlIG5hbWUKKyAgICAgKiBAcGFyYW0gZnVuY3RvciBwcmVkaWNhdGUgbmFtZQorICAgICAqIEBwYXJhbSBhcml0eSBwcmVkaWNhdGUgYXJpdHkKKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGNsYXNzIGZvcgorICAgICAqIHRoZSBwcmVkaWNhdGUgdGhhdCBjb3JyZXNwb25kcyB0byA8Y29kZT5wa2c6ZnVuY3Rvci9hcml0eTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBwa2csIFN0cmluZyBmdW5jdG9yLCBpbnQgYXJpdHkpIHsKKwlTdHJpbmcgeCA9IGZ1bmN0b3I7CisJUGF0dGVybiBwID0gUGF0dGVybi5jb21waWxlKCIoW15hLXpBLVowLTlfJyQnXSkiKTsKKwlNYXRjaGVyIG0gPSBwLm1hdGNoZXIoeCk7CisJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCWJvb2xlYW4gcmVzdWx0ID0gbS5maW5kKCk7CisJd2hpbGUgKHJlc3VsdCkgeworCSAgICAvLwkgICAgbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgU3RyaW5nLmZvcm1hdCgiXFwkJTJYIiwgKGludCkobS5ncm91cCgpLmNoYXJBdCgwKSkpKTsKKwkgICAgbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgU3RyaW5nLmZvcm1hdCgiXFwkJTA0WCIsIChpbnQpKG0uZ3JvdXAoKS5jaGFyQXQoMCkpKSk7CisJICAgIHJlc3VsdCA9IG0uZmluZCgpOworCX0KKwltLmFwcGVuZFRhaWwoc2IpOworCXggPSBzYi50b1N0cmluZygpOworCWlmIChwa2cuZXF1YWxzKCJ1c2VyIikpCisJICAgIHJldHVybiAiUFJFRF8iICsgeCArICJfIiArIGFyaXR5OworCWVsc2UKKwkgICAgcmV0dXJuIHBrZyArICIuUFJFRF8iICsgeCArICJfIiArIGFyaXR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSA8Y29kZT5qYXZhLmxhbmcuQ2xhc3M8L2NvZGU+IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY2F0ZQorICAgICAqIGNsYXNzIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KKyAgICAgKiBAcGFyYW0gcGtnIHBhY2thZ2UgbmFtZQorICAgICAqIEBwYXJhbSBmdW5jdG9yIHByZWRpY2F0ZSBuYW1lCisgICAgICogQHBhcmFtIGFyaXR5IHByZWRpY2F0ZSBhcml0eQorICAgICAqIEByZXR1cm4gYSA8Y29kZT5qYXZhLmxhbmcuQ2xhc3M8L2NvZGU+IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY2F0ZQorICAgICAqIGNsYXNzIHRoYXQgY29ycmVzcG9uZHMgdG8gPGNvZGU+cGtnOmZ1bmN0b3IvYXJpdHk8L2NvZGU+CisgICAgICogaWYgZXhpc3RzLCBvdGhlcndpc2UgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgUHJvbG9nIENhZmUgMS4xLCByZXBsYWNlZCBieSB7QGxpbmsgUHJvbG9nQ2xhc3NMb2FkZXIjbG9hZFByZWRpY2F0ZUNsYXNzKFN0cmluZyxTdHJpbmcsaW50LGJvb2xlYW4pfTsKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldENsYXNzKFN0cmluZyBwa2csIFN0cmluZyBmdW5jdG9yLCBpbnQgYXJpdHkpIHsKKwlTdHJpbmcgY2xhc3NOYW1lID0gUHJlZGljYXRlRW5jb2Rlci5lbmNvZGUocGtnLCBmdW5jdG9yLCBhcml0eSk7CisJQ2xhc3MgY2xhenogPSBudWxsOworCXRyeSB7CisJICAgIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOworCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkge30KKwlyZXR1cm4gY2xheno7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgd2hldGhlciB0aGUgcHJlZGljYXRlIGNsYXNzIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnRzIGlzIGRlZmluZWQuCisgICAgICogQHBhcmFtIHBrZyBwYWNrYWdlIG5hbWUKKyAgICAgKiBAcGFyYW0gZnVuY3RvciBwcmVkaWNhdGUgbmFtZQorICAgICAqIEBwYXJhbSBhcml0eSBwcmVkaWNhdGUgYXJpdHkKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVkaWNhdGUgPGNvZGU+cGtnOmZ1bmN0b3IvYXJpdHk8L2NvZGU+CisgICAgICogaXMgZGVmaW5lZCwgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiBQcm9sb2cgQ2FmZSAxLjEsIHJlcGxhY2VkIGJ5IHtAbGluayBQcm9sb2dDbGFzc0xvYWRlciNkZWZpbmVkUHJlZGljYXRlKFN0cmluZyxTdHJpbmcsaW50KX07CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGRlZmluZWQoU3RyaW5nIHBrZywgU3RyaW5nIGZ1bmN0b3IsIGludCBhcml0eSkgeworCUNsYXNzIGNsYXp6ID0gUHJlZGljYXRlRW5jb2Rlci5nZXRDbGFzcyhwa2csIGZ1bmN0b3IsIGFyaXR5KTsKKwlyZXR1cm4gY2xhenogIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7CisJU3RyaW5nIHAgPSBhcmd2WzBdOworCVN0cmluZyBmID0gYXJndlsxXTsKKwlpbnQgbiA9IChJbnRlZ2VyLnZhbHVlT2YoYXJndlsyXSkpLmludFZhbHVlKCk7CisJU3lzdGVtLm91dC5wcmludGxuKHAgKyAiOiIgKyBmICsgIi8iICsgbik7CisJU3lzdGVtLm91dC5wcmludGxuKFByZWRpY2F0ZUVuY29kZXIuZW5jb2RlKHAsZixuKSk7CisJU3lzdGVtLm91dC5wcmludGxuKFByZWRpY2F0ZUVuY29kZXIuZGVmaW5lZChwLGYsbikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9sYW5nL1Byb2xvZy5qYXZhIGIvc3JjL2xhbmcvUHJvbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE2NTQ0NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sYW5nL1Byb2xvZy5qYXZhCkBAIC0wLDAgKzEsNDYxIEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZzsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEuaW8uKjsKKy8qKgorICogUHJvbG9nIGVuZ2luZS4KKyAqCisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjIKKyovCitwdWJsaWMgY2xhc3MgUHJvbG9nIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICAvKiogUHJvbG9nIHRocmVhZCAqLworICAgIHB1YmxpYyBQcm9sb2dDb250cm9sIGNvbnRyb2w7CisgICAgLyoqIEFyZ3VtZW50IHJlZ2lzdGVycyAqLworICAgIHB1YmxpYyBUZXJtW10gYXJlZ3M7CisgICAgLyoqIENvbnRpbnVhdGlvbiBnb2FsIHJlZ2lzdGVyICovCisgICAgcHVibGljIFByZWRpY2F0ZSBjb250OworICAgIC8qKiBDaG9pY2UgcG9pbnQgZnJhbWUgc3RhY2sgKi8KKyAgICBwdWJsaWMgQ1BGU3RhY2sgc3RhY2s7CisgICAgLyoqIFRyYWlsIHN0YWNrICovCisgICAgcHVibGljIFRyYWlsIHRyYWlsOworICAgIC8qIFB1c2ggZG93biBsaXN0ICovCisgICAgLy8gICAgcHVibGljIFB1c2hEb3duTGlzdCBwZGw7CisgICAgLyoqIEN1dCBwb2ludGVyICovCisgICAgcHVibGljIGludCBCMDsKKyAgICAvKiogQ2xhc3MgbG9hZGVyICovCisgICAgcHVibGljIFByb2xvZ0NsYXNzTG9hZGVyIHBjbDsKKyAgICAvKiogSW50ZXJuYWwgRGF0YWJhc2UgKi8KKyAgICBwdWJsaWMgSW50ZXJuYWxEYXRhYmFzZSBpbnRlcm5hbERCOworCisgICAgLyoqIEN1cnJlbnQgdGltZSBzdGFtcCBvZiBjaG9pY2UgcG9pbnQgZnJhbWUgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBDUEZUaW1lU3RhbXA7CisKKyAgICAvKioKKyAgICAgKiBFeGNlcHRpb24gbGV2ZWwgb2YgY29udGludWF0aW9uIHBhc3NpbmcgbG9vcDoKKyAgICAgKiA8bGk+PGNvZGU+MDwvY29kZT4gZm9yIG5vIGV4Y2VwdGlvbiwKKyAgICAgKiA8bGk+PGNvZGU+MTwvY29kZT4gZm9yIDxjb2RlPmhhbHQvMDwvY29kZT4sCisgICAgICogPGxpPjxjb2RlPjI8L2NvZGU+IGZvciA8Y29kZT5mcmVlemUvMjwvY29kZT4gKG5vdCBzdXBwb3J0ZWQgeWV0KQorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIGludCBleGNlcHRpb25SYWlzZWQ7CisKKyAgICAvKiogPGZvbnQgY29sb3I9InJlZCI+Tm90IHN1cHBvcnRlZCB5ZXQ8L2ZvbnQ+LiBQcm9sb2cgaW1wbGVtZW50YXRpb24gZmxhZzogPGNvZGU+Ym91bmRlZDwvY29kZT4uICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYm91bmRlZCA9IGZhbHNlOworICAgIC8qKiBQcm9sb2cgaW1wbGVtZW50YXRpb24gZmxhZzogPGNvZGU+bWF4X2ludGVnZXI8L2NvZGU+LiAqLworICAgIHByb3RlY3RlZCBpbnQgbWF4SW50ZWdlciA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgIC8qKiBQcm9sb2cgaW1wbGVtZW50YXRpb24gZmxhZzogPGNvZGU+bWluX2ludGVnZXI8L2NvZGU+LiAqLworICAgIHByb3RlY3RlZCBpbnQgbWluSW50ZWdlciA9IEludGVnZXIuTUlOX1ZBTFVFOworICAgIC8qKiBQcm9sb2cgaW1wbGVtZW50YXRpb24gZmxhZzogPGNvZGU+aW50ZWdlcl9yb3VuZGluZ19mdW5jdGlvbjwvY29kZT4uICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBpbnRlZ2VyUm91bmRpbmdGdW5jdGlvbiA9ICJkb3duIjsKKyAgICAvKiogPGZvbnQgY29sb3I9InJlZCI+Tm90IHN1cHBvcnRlZCB5ZXQ8L2ZvbnQ+LiBQcm9sb2cgaW1wbGVtZW50YXRpb24gZmxhZzogPGNvZGU+Y2hhcl9jb252ZXJzaW9uPC9jb2RlPi4gKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNoYXJDb252ZXJzaW9uOworICAgIC8qKiBQcm9sb2cgaW1wbGVtZW50YXRpb24gZmxhZzogPGNvZGU+ZGVidWc8L2NvZGU+LiAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZGVidWc7CisgICAgLyoqIFByb2xvZyBpbXBsZW1lbnRhdGlvbiBmbGFnOiA8Y29kZT5tYXhfYXJpdHk8L2NvZGU+LiAqLworICAgIHByb3RlY3RlZCBpbnQgbWF4QXJpdHkgPSAyNTU7CisgICAgLyoqIFByb2xvZyBpbXBsZW1lbnRhdGlvbiBmbGFnOiA8Y29kZT51bmtub3duPC9jb2RlPi4gKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHVua25vd247CisgICAgLyoqIDxmb250IGNvbG9yPSJyZWQiPk5vdCBzdXBwb3J0ZWQgeWV0PC9mb250Pi4gUHJvbG9nIGltcGxlbWVudGF0aW9uIGZsYWc6IDxjb2RlPmRvdWJsZV9xdW90ZXM8L2NvZGU+LiAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZG91YmxlUXVvdGVzOworICAgIC8qKiBQcm9sb2cgaW1wbGVtZW50YXRpb24gZmxhZzogPGNvZGU+cHJpbnRfc3RhY2tfdHJhY2U8L2NvZGU+LiAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcHJpbnRTdGFja1RyYWNlOworCisgICAgLyoqIEhvbGRzIGEgbGlzdCBvZiBmcm96ZW4gZ29hbHMgZm9yIDxjb2RlPmZyZWV6ZS8yPC9jb2RlPiAobm90IGltcGxlbWVudGVkIHlldCkuICovCisgICAgcHJvdGVjdGVkIFRlcm0gcGVuZGluZ0dvYWxzOyAKKyAgICAvKiogSG9sZHMgYW4gZXhjZXB0aW9uIHRlcm0gZm9yIDxjb2RlPmNhdGNoLzM8L2NvZGU+IGFuZCA8Y29kZT50aHJvdy8xPC9jb2RlPi4gKi8KKyAgICBwcm90ZWN0ZWQgVGVybSBleGNlcHRpb247CisKKyAgICAvKiogSG9sZHMgdGhlIHN0YXJ0IHRpbWUgYXMgPGNvZGU+bG9uZzwvY29kZT4gZm9yIDxjb2RlPnN0YXRpc3RpY3MvMjwvY29kZT4uICovCisgICAgcHJvdGVjdGVkIGxvbmcgc3RhcnRSdW50aW1lOworICAgIC8qKiBIb2xkcyB0aGUgcHJldmlvdXMgdGltZSBhcyA8Y29kZT5sb25nPC9jb2RlPiBmb3IgPGNvZGU+c3RhdGlzdGljcy8yPC9jb2RlPi4gKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBwcmV2aW91c1J1bnRpbWU7CisKKyAgICAvKiogSGFzaHRhYmxlIGZvciBjcmVhdGluZyBhIGNvcHkgb2YgdGVybS4gKi8KKyAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlPFZhcmlhYmxlVGVybSxWYXJpYWJsZVRlcm0+IGNvcHlIYXNoOworCisgICAgLyoqIFRoZSBzaXplIG9mIHRoZSBwdXNoYmFjayBidWZmZXIgdXNlZCBmb3IgY3JlYXRpbmcgaW5wdXQgc3RyZWFtcy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBQVVNIQkFDS19TSVpFID0gMzsKKyAgICAvLyAgICBwdWJsaWMgc3RhdGljIGludCBQVVNIQkFDS19TSVpFID0gMjsKKworICAgIC8qKiBTdGFuZGFyZCBpbnB1dCBzdHJlYW0uICovCisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBQdXNoYmFja1JlYWRlciB1c2VySW5wdXQ7CisgICAgLyoqIFN0YW5kYXJkIG91dHB1dCBzdHJlYW0uICovCisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBQcmludFdyaXRlciB1c2VyT3V0cHV0OworICAgIC8qKiBTdGFuZGFyZCBlcnJvciBzdHJlYW0uICovCisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBQcmludFdyaXRlciB1c2VyRXJyb3I7CisgICAgLyoqIEN1cnJlbnQgaW5wdXQgc3RyZWFtLiAqLworICAgIHByb3RlY3RlZCB0cmFuc2llbnQgUHVzaGJhY2tSZWFkZXIgY3VycmVudElucHV0OworICAgIC8qKiBDdXJyZW50IG91dHB1dCBzdHJlYW0uICovCisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBQcmludFdyaXRlciBjdXJyZW50T3V0cHV0OworICAgIC8qKiBIYXNodGFibGUgZm9yIG1hbmFnaW5nIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcy4gKi8KKyAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlT2ZUZXJtIHN0cmVhbU1hbmFnZXI7CisKKyAgICAvKiogSGFzaHRhYmxlIGZvciBtYW5hZ2luZyBpbnRlcm5hbCBkYXRhYmFzZXMuICovCisgICAgcHJvdGVjdGVkIEhhc2h0YWJsZU9mVGVybSBoYXNoTWFuYWdlcjsKKworICAgIC8qKiBIb2xkcyBhbiBhdG9tIDxjb2RlPltdPGNvZGU+IChlbXB0eSBsaXN0KS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFRlcm0gTmlsICAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiW10iKTsKKworICAgIC8qIFNvbWUgc3ltYm9scyBmb3Igc3RyZWFtIG9wdGlvbnMgKi8KKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fTU9ERV8xICAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgibW9kZSIsIDEpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9BTElBU18xICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJhbGlhcyIsIDEpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9UWVBFXzEgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJ0eXBlIiwgMSk7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gU1lNX1JFQUQgICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woInJlYWQiKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fQVBQRU5EICAgICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiYXBwZW5kIik7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gU1lNX0lOUFVUICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woImlucHV0Iik7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gU1lNX09VVFBVVCAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woIm91dHB1dCIpOworICAgIHN0YXRpYyBTeW1ib2xUZXJtIFNZTV9URVhUICAgICAgID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJ0ZXh0Iik7CisgICAgc3RhdGljIFN5bWJvbFRlcm0gU1lNX1VTRVJJTlBVVCAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woInVzZXJfaW5wdXQiKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fVVNFUk9VVFBVVCA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgidXNlcl9vdXRwdXQiKTsKKyAgICBzdGF0aWMgU3ltYm9sVGVybSBTWU1fVVNFUkVSUk9SICA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgidXNlcl9lcnJvciIpOworCisgICAgLyoqIENvbnN0cnVjdHMgbmV3IFByb2xvZyBlbmdpbmUuICovCisgICAgcHVibGljIFByb2xvZyhQcm9sb2dDb250cm9sIGMpIHsgCisJY29udHJvbCAgICA9IGM7CisJYXJlZ3MgICAgICA9IG5ldyBUZXJtW21heEFyaXR5XTsKKwljb250ICAgICAgID0gbnVsbDsKKwlzdGFjayAgICAgID0gbmV3IENQRlN0YWNrKHRoaXMpOworCXRyYWlsICAgICAgPSBuZXcgVHJhaWwodGhpcyk7CisJLy8JcGRsICAgICAgICA9IG5ldyBQdXNoRG93bkxpc3QoKTsKKwlwY2wgICAgICAgID0gbmV3IFByb2xvZ0NsYXNzTG9hZGVyKCk7CisJaW50ZXJuYWxEQiA9IG5ldyBJbnRlcm5hbERhdGFiYXNlKCk7CisJaW5pdE9uY2UoKTsKKyAgICB9CisKKyAgICAvKiogCisgICAgICogSW5pdGlhbGl6ZXMgc29tZSBsb2NhbCBpbnN0YW5jZXMgb25seSBvbmNlLgorICAgICAqIFRoaXMgPGNvZGU+aW5pdE9uY2U8L2NvZGU+IG1ldGhvZCBpcyBpbnZva2VkIGluIHRoZSBjb25zdHJ1Y3RvcgorICAgICAqIGFuZCBpbml0aWFsaXplcyB0aGUgZm9sbG93aW5nIGluc3RhbmNlczoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+PGNvZGU+dXNlcklucHV0PC9jb2RlPgorICAgICAqICAgPGxpPjxjb2RlPnVzZXJPdXRwdXQ8L2NvZGU+CisgICAgICogICA8bGk+PGNvZGU+dXNlckVycm9yPC9jb2RlPgorICAgICAqICAgPGxpPjxjb2RlPmNvcHlIYXNoPC9jb2RlPgorICAgICAqICAgPGxpPjxjb2RlPmhhc2hNYW5hZ2VyPC9jb2RlPgorICAgICAqICAgPGxpPjxjb2RlPnN0cmVhbU1hbmFnZXI8L2NvZGU+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0T25jZSgpIHsKKwl1c2VySW5wdXQgICA9IG5ldyBQdXNoYmFja1JlYWRlcihuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKFN5c3RlbS5pbikpLCBQVVNIQkFDS19TSVpFKTsKKwl1c2VyT3V0cHV0ICA9IG5ldyBQcmludFdyaXRlcihuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0KSksIHRydWUpOworCXVzZXJFcnJvciAgID0gbmV3IFByaW50V3JpdGVyKG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5lcnIpKSwgdHJ1ZSk7CisKKwljb3B5SGFzaCAgICAgID0gbmV3IEhhc2h0YWJsZTxWYXJpYWJsZVRlcm0sVmFyaWFibGVUZXJtPigpOworCWhhc2hNYW5hZ2VyICAgPSBuZXcgSGFzaHRhYmxlT2ZUZXJtKCk7CisJc3RyZWFtTWFuYWdlciA9IG5ldyBIYXNodGFibGVPZlRlcm0oKTsKKworCXN0cmVhbU1hbmFnZXIucHV0KFNZTV9VU0VSSU5QVVQsIG5ldyBKYXZhT2JqZWN0VGVybSh1c2VySW5wdXQpKTsKKwlzdHJlYW1NYW5hZ2VyLnB1dChuZXcgSmF2YU9iamVjdFRlcm0odXNlcklucHV0KSwgCisJCQkgIG1ha2VTdHJlYW1Qcm9wZXJ0eShTWU1fUkVBRCwgU1lNX0lOUFVULCBTWU1fVVNFUklOUFVULCBTWU1fVEVYVCkpOworCXN0cmVhbU1hbmFnZXIucHV0KFNZTV9VU0VST1VUUFVULCBuZXcgSmF2YU9iamVjdFRlcm0odXNlck91dHB1dCkpOworCXN0cmVhbU1hbmFnZXIucHV0KG5ldyBKYXZhT2JqZWN0VGVybSh1c2VyT3V0cHV0KSwKKwkJCSAgbWFrZVN0cmVhbVByb3BlcnR5KFNZTV9BUFBFTkQsIFNZTV9PVVRQVVQsIFNZTV9VU0VST1VUUFVULCBTWU1fVEVYVCkpOworCXN0cmVhbU1hbmFnZXIucHV0KFNZTV9VU0VSRVJST1IsIG5ldyBKYXZhT2JqZWN0VGVybSh1c2VyRXJyb3IpKTsKKwlzdHJlYW1NYW5hZ2VyLnB1dChuZXcgSmF2YU9iamVjdFRlcm0odXNlckVycm9yKSwKKwkJCSAgbWFrZVN0cmVhbVByb3BlcnR5KFNZTV9BUFBFTkQsIFNZTV9PVVRQVVQsIFNZTV9VU0VSRVJST1IsIFNZTV9URVhUKSk7CisgICAgfQorCisgICAgLyoqIEluaXRpYWxpemVzIHRoaXMgUHJvbG9nIGVuZ2luZS4gKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgeyAKKwlzdGFjay5pbml0KCk7CisJdHJhaWwuaW5pdCgpOworCS8vCXBkbC5pbml0KCk7CisJQjAgPSBzdGFjay50b3AoKTsKKwlDUEZUaW1lU3RhbXAgPSBMb25nLk1JTl9WQUxVRTsKKworCS8vIENyZWF0ZXMgYW4gaW5pdGlhbCBjaG9pY2UgcG9pbnQgZnJhbWUuCisJVGVybVtdIG5vYXJnID0ge307CisJc3RhY2suY3JlYXRlKG5vYXJnLCBudWxsKTsKKwlzdGFjay5zZXRUUih0cmFpbC50b3AoKSk7CisJc3RhY2suc2V0VGltZVN0YW1wKCsrQ1BGVGltZVN0YW1wKTsKKwlzdGFjay5zZXRCUChuZXcgRmFpbHVyZShjb250cm9sKSk7CisJc3RhY2suc2V0QjAoQjApOworCisJZXhjZXB0aW9uUmFpc2VkID0gMDsKKworCWNoYXJDb252ZXJzaW9uICA9ICJvZmYiOworCWRlYnVnICAgICAgICAgICA9ICJvZmYiOworCXVua25vd24gICAgICAgICA9ICJlcnJvciI7CisJZG91YmxlUXVvdGVzICAgID0gImNvZGVzIjsKKwlwcmludFN0YWNrVHJhY2UgPSAib2ZmIjsKKworCXBlbmRpbmdHb2FscyAgICA9IE5pbDsKKwlleGNlcHRpb24gICAgICAgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woIiRub25lIik7CisJc3RhcnRSdW50aW1lICAgID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJcHJldmlvdXNSdW50aW1lID0gMDsKKworCXVzZXJPdXRwdXQuZmx1c2goKTsKKwl1c2VyRXJyb3IuZmx1c2goKTsKKwljdXJyZW50SW5wdXQgID0gdXNlcklucHV0OworCWN1cnJlbnRPdXRwdXQgPSB1c2VyT3V0cHV0OworICAgIH0KKworICAgIC8qKiBTZXRzIHRoZSB0b3Agb2YgY2hvaWNlIHBvcmludCBzdGFjayB0byA8Y29kZT5CMDwvY29kZT4gKGN1dCBwb2ludGVyKS4gKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCMCgpICAgIHsgQjAgPSBzdGFjay50b3AoKTsgfQorCisgICAgLyoqIERpc2NhcmRzIGFsbCBjaG9pY2UgcG9pbnRzIGFmdGVyIHRoZSB2YWx1ZSBvZiA8Y29kZT5pPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgdm9pZCBjdXQoaW50IGkpIHsgc3RhY2suY3V0KGkpOyB9CisKKyAgICAvKiogRGlzY2FyZHMgYWxsIGNob2ljZSBwb2ludHMgYWZ0ZXIgdGhlIHZhbHVlIG9mIDxjb2RlPkIwPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgdm9pZCBuZWNrQ3V0KCkgIHsgc3RhY2suY3V0KEIwKTsgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGVybSA8Y29kZT50PC9jb2RlPi4gCisgICAgICogQHBhcmFtIHQgYSB0ZXJtIHRvIGJlIGNvcGllZC4gSXQgbXVzdCBiZSBkZXJlZmVyZW5jZWQuCisgICAgICovCisgICAgcHVibGljIFRlcm0gY29weShUZXJtIHQpIHsKKwljb3B5SGFzaC5jbGVhcigpOworCXJldHVybiB0LmNvcHkodGhpcyk7CisgICAgfQorCisgICAgLyogCisgICAgcHVibGljIGJvb2xlYW4gdW5pZnkoVGVybSBhMSwgVGVybSBhMikgeworCVRlcm0gZDEsIGQyOworCXBkbC5pbml0KCk7CisJcGRsLnB1c2goYTEpOworCXBkbC5wdXNoKGEyKTsKKwl3aGlsZSAoISBwZGwuZW1wdHkoKSkgeworCSAgICBkMSA9IHBkbC5wb3AoKS5kZXJlZmVyZW5jZSgpOworCSAgICBkMiA9IHBkbC5wb3AoKS5kZXJlZmVyZW5jZSgpOworCSAgICBpZiAoZDEgIT0gZDIpIHsKKwkJaWYgKGQxLmlzVmFyaWFibGUoKSkgeworCQkgICAgKChWYXJpYWJsZVRlcm0pZDEpLmJpbmQoZDIsIHRyYWlsKTsKKwkJfSBlbHNlIGlmIChkMi5pc1ZhcmlhYmxlKCkpIHsKKwkJICAgICgoVmFyaWFibGVUZXJtKWQyKS5iaW5kKGQxLCB0cmFpbCk7CisJCX0gZWxzZSBpZiAoZDIuaXNMaXN0KCkpIHsKKwkJICAgIGlmICghIGQxLmlzTGlzdCgpKQorCQkJcmV0dXJuIGZhbHNlOworCQkgICAgcGRsLnB1c2goKChMaXN0VGVybSlkMSkuY2RyKCkpOworCQkgICAgcGRsLnB1c2goKChMaXN0VGVybSlkMikuY2RyKCkpOworCQkgICAgcGRsLnB1c2goKChMaXN0VGVybSlkMSkuY2FyKCkpOworCQkgICAgcGRsLnB1c2goKChMaXN0VGVybSlkMikuY2FyKCkpOworCQl9IGVsc2UgaWYgKGQyLmlzU3RydWN0dXJlKCkpIHsKKwkJICAgIGlmICghIGQxLmlzU3RydWN0dXJlKCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCSAgICBpZiAoISAoKFN0cnVjdHVyZVRlcm0pZDEpLmZ1bmN0b3IuZXF1YWxzKCgoU3RydWN0dXJlVGVybSlkMikuZnVuY3RvcikpCisJCQlyZXR1cm4gZmFsc2U7CisJCSAgICBmb3IgKGludCBpPTA7IGk8KChTdHJ1Y3R1cmVUZXJtKWQxKS5hcml0eTsgaSsrKSB7CisJCQlwZGwucHVzaCgoKFN0cnVjdHVyZVRlcm0pZDEpLmFyZ3NbaV0pOworCQkJcGRsLnB1c2goKChTdHJ1Y3R1cmVUZXJtKWQyKS5hcmdzW2ldKTsKKwkJICAgIH0KKwkJfSBlbHNlIGlmICghIGQxLmVxdWFscyhkMikpIHsKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJfQorCSAgICB9CisJfQorCXJldHVybiB0cnVlOworICAgIH0KKyAgICAqLworCisgICAgLyoqIAorICAgICAqIERvIGJhY2t0cmFrLgorICAgICAqIFRoaXMgbWV0aG9kIHJlc3RvcmVzIHRoZSB2YWx1ZSBvZiA8Y29kZT5CMDwvY29kZT4KKyAgICAgKiBhbmQgcmV0dXJucyB0aGUgYmFja3RyYWsgcG9pbnQgaW4gY3VycmVudCBjaG9pY2UgcG9pbnQuCisgICAgICovCisgICAgcHVibGljIFByZWRpY2F0ZSBmYWlsKCkgeworCUIwID0gc3RhY2suZ2V0QjAoKTsgICAgIC8vIHJlc3RvcmUgQjAKKwlyZXR1cm4gc3RhY2suZ2V0QlAoKTsgICAvLyBleGVjdXRlIG5leHQgY2xhdXNlCisgICAgfQorCisgICAgLyoqIAorICAgICAqIFJldHVybnMgdGhlIDxjb2RlPlByZWRpY2F0ZTwvY29kZT4gb2JqZWN0IHJlZmVyZWQsIHJlc3BlY3RpdmVseSwgCisgICAgICogPGNvZGU+dmFyPC9jb2RlPiwgPGNvZGU+SW50PC9jb2RlPiwgPGNvZGU+ZmxvPC9jb2RlPiwgCisgICAgICogPGNvZGU+Y29uPC9jb2RlPiwgPGNvZGU+c3RyPC9jb2RlPiwgb3IgPGNvZGU+bGlzPC9jb2RlPiwgCisgICAgICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGRlcmVmZXJlbmNlZCB2YWx1ZSBvZiBhcmd1bWVudCAKKyAgICAgKiByZWdpc3RlciA8Y29kZT5hcmVnWzFdPC9jb2RlPiBpcyBhCisgICAgICogdmFyaWFibGUsIGludGVnZXIsIGZsb2F0LAorICAgICAqIGF0b20sIGNvbXBvdW5kIHRlcm0sIG9yIG5vbi1lbXB0eSBsaXN0LCByZXNwZWN0aXZlbHkuCisgICAgICovCisgICAgcHVibGljIFByZWRpY2F0ZSBzd2l0Y2hfb25fdGVybShQcmVkaWNhdGUgdmFyLCAKKwkJCQkgICAgUHJlZGljYXRlIEludCwgCisJCQkJICAgIFByZWRpY2F0ZSBmbG8sCisJCQkJICAgIFByZWRpY2F0ZSBjb24sIAorCQkJCSAgICBQcmVkaWNhdGUgc3RyLCAKKwkJCQkgICAgUHJlZGljYXRlIGxpcykgeworCVRlcm0gYXJnMSA9IGFyZWdzWzFdLmRlcmVmZXJlbmNlKCk7CisJaWYgKGFyZzEuaXNWYXJpYWJsZSgpKQorCSAgICByZXR1cm4gdmFyOworCWlmIChhcmcxLmlzSW50ZWdlcigpKQorCSAgICByZXR1cm4gSW50OworCWlmIChhcmcxLmlzRG91YmxlKCkpCisJICAgIHJldHVybiBmbG87CisJaWYgKGFyZzEuaXNTeW1ib2woKSkKKwkgICAgcmV0dXJuIGNvbjsKKwlpZiAoYXJnMS5pc1N0cnVjdHVyZSgpKQorCSAgICByZXR1cm4gc3RyOworCWlmIChhcmcxLmlzTGlzdCgpKQorCSAgICByZXR1cm4gbGlzOworCXJldHVybiB2YXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIGRlcmVmZXJlbmNlZCB2YWx1ZSBvZiBhcnVnbWVudCByZWdpc3RlciA8Y29kZT5hcmVnWzFdPC9jb2RlPgorICAgICAqIGlzIGFuIGludGVnZXIsIGZsb2F0LCBhdG9tLCBvciBjb21wb3VuZCB0ZXJtIChleGNlcHQgZm9yIG5vbi1lbXB0eSBsaXN0KSwKKyAgICAgKiB0aGlzIHJldHVybnMgdGhlIDxjb2RlPlByZWRpY2F0ZTwvY29kZT4gb2JqZWN0IHRvIHdoaWNoIGl0cyBrZXkgaXMgbWFwcGVkCisgICAgICogaW4gaGFzaHRhYmxlIDxjb2RlPmhhc2g8L2NvZGU+LgorICAgICAqCisgICAgICogVGhlIGtleSBpcyBjYWxjdWxhdGVkIGFzIGZvbGxvd3M6CisgICAgICogPHVsPgorICAgICAqICAgPGxpPmludGVnZXIgLSBpdHNlbGYKKyAgICAgKiAgIDxsaT5mbG9hdCAtIGl0c2VsZgorICAgICAqICAgPGxpPmF0b20gLSBpdHNlbGYKKyAgICAgKiAgIDxsaT5jb21wb3VuZCB0ZXJtIC0gZnVuY3Rvci9hcml0eQorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBJZiB0aGVyZSBpcyBubyBtYXBwaW5nIGZvciB0aGUga2V5IG9mIDxjb2RlPmFyZWdbMV08L2NvZGU+LCAKKyAgICAgKiB0aGlzIHJldHVybnMgPGNvZGU+b3RoZXJ3aXNlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJlZGljYXRlIHN3aXRjaF9vbl9oYXNoKEhhc2h0YWJsZTxUZXJtLFByZWRpY2F0ZT4gaGFzaCwgUHJlZGljYXRlIG90aGVyd2lzZSkgeworCVRlcm0gYXJnMSA9IGFyZWdzWzFdLmRlcmVmZXJlbmNlKCk7CisJVGVybSBrZXk7CisJaWYgKGFyZzEuaXNJbnRlZ2VyKCkgfHwgYXJnMS5pc0RvdWJsZSgpIHx8IGFyZzEuaXNTeW1ib2woKSkgeworCSAgICBrZXkgPSBhcmcxOworCX0gZWxzZSBpZiAoYXJnMS5pc1N0cnVjdHVyZSgpKSB7CisJICAgIGtleSA9ICgoU3RydWN0dXJlVGVybSkgYXJnMSkuZnVuY3RvcigpOworCX0gZWxzZSB7CisJICAgIHRocm93IG5ldyBTeXN0ZW1FeGNlcHRpb24oIkludmFsaWQgYXJndW1lbnQgaW4gc3dpdGNoX29uX2hhc2giKTsKKwl9CisJUHJlZGljYXRlIHAgPSBoYXNoLmdldChrZXkpOworCWlmIChwICE9IG51bGwpCisJICAgIHJldHVybiBwOworCWVsc2UgCisJICAgIHJldHVybiBvdGhlcndpc2U7CisgICAgfQorCisgICAgLyoqIFJlc3RvcmVzIHRoZSBhcmd1bWVudCByZWdpc3RlcnMgYW5kIGNvbnRpbnVhdGlvbiBnb2FsIHJlZ2lzdGVyIGZyb20gdGhlIGN1cnJlbnQgY2hvaWNlIHBvaW50IGZyYW1lLiAqLworICAgIHB1YmxpYyB2b2lkIHJlc3RvcmUoKSB7CisJVGVybVtdIGFyZ3MgPSBzdGFjay5nZXRBcmdzKCk7CisJaW50IGkgPSBhcmdzLmxlbmd0aDsKKwlTeXN0ZW0uYXJyYXljb3B5KGFyZ3MsIDAsIGFyZWdzLCAxLCBpKTsKKwljb250ID0gc3RhY2suZ2V0Q29udCgpOworICAgIH0KKworICAgIC8qKiBDcmVhdGVzIGEgbmV3IGNob2ljZSBwb2ludCBmcmFtZS4gKi8KKyAgICBwdWJsaWMgUHJlZGljYXRlIGp0cnkoUHJlZGljYXRlIHAsIFByZWRpY2F0ZSBuZXh0KSB7CisJaW50IGkgPSBwLmFyaXR5KCk7CisJVGVybVtdIGFyZ3MgPSBuZXcgVGVybVtpXTsKKwlTeXN0ZW0uYXJyYXljb3B5KGFyZWdzLCAxLCBhcmdzLCAwLCBpKTsKKwlzdGFjay5jcmVhdGUoYXJncywgY29udCk7CisJc3RhY2suc2V0VFIodHJhaWwudG9wKCkpOworCXN0YWNrLnNldFRpbWVTdGFtcCgrK0NQRlRpbWVTdGFtcCk7CisJc3RhY2suc2V0QlAobmV4dCk7CisJc3RhY2suc2V0QjAoQjApOworCXJldHVybiBwOworICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBSZXNldHMgYWxsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjdXJyZW50IGNob2ljZSBwb2ludCBmcmFtZSwKKyAgICAgKiB1cGRhdGVzIGl0cyBuZXh0IGNsYXVzZSBmaWVsZCB0byA8Y29kZT5uZXh0PC9jb2RlPiwKKyAgICAgKiBhbmQgdGhlbiByZXR1cm5zIDxjb2RlPnA8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBQcmVkaWNhdGUgcmV0cnkoUHJlZGljYXRlIHAsIFByZWRpY2F0ZSBuZXh0KSB7CisJcmVzdG9yZSgpOworCXRyYWlsLnVud2luZChzdGFjay5nZXRUUigpKTsKKwlzdGFjay5zZXRCUChuZXh0KTsKKwlyZXR1cm4gcDsKKyAgICB9CisKKyAgICAvKiogCisgICAgICogUmVzZXRzIGFsbCBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZnJvbSB0aGUgY3VycmVudCBjaG9pY2UgcG9pbnQgZnJhbWUsCisgICAgICogZGlzY2FyZCBpdCwgYW5kIHRoZW4gcmV0dXJucyA8Y29kZT5wPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJlZGljYXRlIHRydXN0KFByZWRpY2F0ZSBwKSB7CisJcmVzdG9yZSgpOworCXRyYWlsLnVud2luZChzdGFjay5nZXRUUigpKTsKKwlzdGFjay5kZWxldGUoKTsKKwlyZXR1cm4gcDsKKyAgICB9CisKKyAgICBUZXJtIG1ha2VTdHJlYW1Qcm9wZXJ0eShTeW1ib2xUZXJtIF9tb2RlLCBTeW1ib2xUZXJtIGlvLCBTeW1ib2xUZXJtIF9hbGlhcywgU3ltYm9sVGVybSBfdHlwZSkgeworCVRlcm1bXSBtb2RlICA9IHtfbW9kZX07CisJVGVybVtdIGFsaWFzID0ge19hbGlhc307CisJVGVybVtdIHR5cGUgID0ge190eXBlfTsKKworCVRlcm0gdCA9IE5pbDsKKwl0ID0gbmV3IExpc3RUZXJtKG5ldyBTdHJ1Y3R1cmVUZXJtKFNZTV9NT0RFXzEsICBtb2RlICksIHQpOworCXQgPSBuZXcgTGlzdFRlcm0oaW8sIHQpOworCXQgPSBuZXcgTGlzdFRlcm0obmV3IFN0cnVjdHVyZVRlcm0oU1lNX0FMSUFTXzEsIGFsaWFzKSwgdCk7CisJdCA9IG5ldyBMaXN0VGVybShuZXcgU3RydWN0dXJlVGVybShTWU1fVFlQRV8xLCAgdHlwZSApLCB0KTsKKwlyZXR1cm4gdDsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgY3VycmVudCB0aW1lIHN0YW1wIG9mIGNob2ljZSBwb2ludCBmcmFtZS4gKi8KKyAgICBwdWJsaWMgbG9uZyAgICBnZXRDUEZUaW1lU3RhbXAoKSB7IHJldHVybiBDUEZUaW1lU3RhbXA7IH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBQcm9sb2cgaW1wbGVtZW50YXRpb24gZmxhZzogPGNvZGU+Ym91bmRlZDwvY29kZT4uICovCisgICAgcHVibGljIGJvb2xlYW4gaXNCb3VuZGVkKCkgeyByZXR1cm4gYm91bmRlZDsgfQorCisgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIG9mIFByb2xvZyBpbXBsZW1lbnRhdGlvbiBmbGFnOiA8Y29kZT5tYXhfaW50ZWdlcjwvY29kZT4uICovCisgICAgcHVibGljIGludCBnZXRNYXhJbnRlZ2VyKCkgeyByZXR1cm4gbWF4SW50ZWdlcjsgfQorCisgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIG9mIFByb2xvZyBpbXBsZW1lbnRhdGlvbiBmbGFnOiA8Y29kZT5taW5faW50ZWdlcjwvY29kZT4uICovCisgICAgcHVibGljIGludCBnZXRNaW5JbnRlZ2VyKCkgeyByZXR1cm4gbWluSW50ZWdlcjsgfQorCisgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIG9mIFByb2xvZyBpbXBsZW1lbnRhdGlvbiBmbGFnOiA8Y29kZT5pbnRlZ2VyX3JvdW5kaW5nX2Z1bmN0aW9uPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEludGVnZXJSb3VuZGluZ0Z1bmN0aW9uKCkgeyByZXR1cm4gaW50ZWdlclJvdW5kaW5nRnVuY3Rpb247IH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBQcm9sb2cgaW1wbGVtZW50YXRpb24gZmxhZzogPGNvZGU+Y2hhcl9jb252ZXJzaW9uPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJDb252ZXJzaW9uKCkgeyByZXR1cm4gY2hhckNvbnZlcnNpb247IH0KKyAgICAvKiogU2V0cyB0aGUgdmFsdWUgb2YgUHJvbG9nIGltcGxlbWVudGF0aW9uIGZsYWc6IDxjb2RlPmNoYXJfY29udmVyc2lvbjwvY29kZT4uICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hhckNvbnZlcnNpb24oU3RyaW5nIG1vZGUpIHsgY2hhckNvbnZlcnNpb24gPSBtb2RlO30KKworICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBQcm9sb2cgaW1wbGVtZW50YXRpb24gZmxhZzogPGNvZGU+ZGVidWc8L2NvZGU+LiAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVidWcoKSB7IHJldHVybiBkZWJ1ZzsgfQorICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBvZiBQcm9sb2cgaW1wbGVtZW50YXRpb24gZmxhZzogPGNvZGU+ZGVidWc8L2NvZGU+LiAqLworICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKFN0cmluZyBtb2RlKSB7IGRlYnVnID0gbW9kZTt9CisKKyAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgb2YgUHJvbG9nIGltcGxlbWVudGF0aW9uIGZsYWc6IDxjb2RlPm1heF9hcml0eTwvY29kZT4uICovCisgICAgcHVibGljIGludCBnZXRNYXhBcml0eSgpIHsgcmV0dXJuIG1heEFyaXR5OyB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgb2YgUHJvbG9nIGltcGxlbWVudGF0aW9uIGZsYWc6IDxjb2RlPnVua25vd248L2NvZGU+LiAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5rbm93bigpIHsgcmV0dXJuIHVua25vd247IH0KKyAgICAvKiogU2V0cyB0aGUgdmFsdWUgb2YgUHJvbG9nIGltcGxlbWVudGF0aW9uIGZsYWc6IDxjb2RlPnVua25vd248L2NvZGU+LiAqLworICAgIHB1YmxpYyB2b2lkIHNldFVua25vd24oU3RyaW5nIG1vZGUpIHsgdW5rbm93biA9IG1vZGU7fQorCisgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIG9mIFByb2xvZyBpbXBsZW1lbnRhdGlvbiBmbGFnOiA8Y29kZT5kb3VibGVfcXVvdGVzPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERvdWJsZVF1b3RlcygpIHsgcmV0dXJuIGRvdWJsZVF1b3RlczsgfQorICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBvZiBQcm9sb2cgaW1wbGVtZW50YXRpb24gZmxhZzogPGNvZGU+ZG91YmxlX3F1b3RlczwvY29kZT4uICovCisgICAgcHVibGljIHZvaWQgc2V0RG91YmxlUXVvdGVzKFN0cmluZyBtb2RlKSB7IGRvdWJsZVF1b3RlcyA9IG1vZGU7fQorCisgICAgLyoqIFJldHVybnMgdGhlIHZhbHVlIG9mIFByb2xvZyBpbXBsZW1lbnRhdGlvbiBmbGFnOiA8Y29kZT5wcmludF9zdGFja190cmFjZTwvY29kZT4uICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcmludFN0YWNrVHJhY2UoKSB7IHJldHVybiBwcmludFN0YWNrVHJhY2U7IH0KKyAgICAvKiogU2V0cyB0aGUgdmFsdWUgb2YgUHJvbG9nIGltcGxlbWVudGF0aW9uIGZsYWc6IDxjb2RlPnByaW50X3N0YWNrX3RyYWNlPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmludFN0YWNrVHJhY2UoU3RyaW5nIG1vZGUpIHsgcHJpbnRTdGFja1RyYWNlID0gbW9kZTt9CisKKyAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgb2YgPGNvZGU+ZXhjZXB0aW9uPC9jb2RlPi4gVGhpcyBpcyB1c2VkIGluIDxjb2RlPmNhdGNoLzM8L2NvZGU+LiAqLworICAgIHB1YmxpYyBUZXJtIGdldEV4Y2VwdGlvbigpIHsgcmV0dXJuIGV4Y2VwdGlvbjsgfQorICAgIC8qKiBTZXRzIHRoZSB2YWx1ZSBvZiA8Y29kZT5leGNlcHRpb248L2NvZGU+LiBUaGlzIGlzIHVzZWQgaW4gPGNvZGU+dGhyb3cvMTwvY29kZT4uICovCisgICAgcHVibGljIHZvaWQgc2V0RXhjZXB0aW9uKFRlcm0gdCkgeyBleGNlcHRpb24gPSB0O30KKworICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiA8Y29kZT5zdGFydFJ1bnRpbWU8L2NvZGU+LiBUaGlzIGlzIHVzZWQgaW4gPGNvZGU+c3RhdGlzdGljcy8yPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTdGFydFJ1bnRpbWUoKSB7IHJldHVybiBzdGFydFJ1bnRpbWU7IH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiA8Y29kZT5wcmV2aW91c1J1bnRpbWU8L2NvZGU+LiBUaGlzIGlzIHVzZWQgaW4gPGNvZGU+c3RhdGlzdGljcy8yPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRQcmV2aW91c1J1bnRpbWUoKSB7IHJldHVybiBwcmV2aW91c1J1bnRpbWU7IH0KKyAgICAvKiogU2V0cyB0aGUgdmFsdWUgb2YgPGNvZGU+cHJldmlvdXNSdW50aW1lPC9jb2RlPi4gVGhpcyBpcyB1c2VkIGluIDxjb2RlPnN0YXRpc3RpY3MvMjwvY29kZT4uICovCisgICAgcHVibGljIHZvaWQgc2V0UHJldmlvdXNSdW50aW1lKGxvbmcgdCkgeyBwcmV2aW91c1J1bnRpbWUgPSB0OyB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgc3RhbmRhcmQgaW5wdXQgc3RyZWFtLiAqLworICAgIHB1YmxpYyBQdXNoYmFja1JlYWRlciAgZ2V0VXNlcklucHV0KCkgeyByZXR1cm4gdXNlcklucHV0OyB9CisgICAgLyoqIFJldHVybnMgdGhlIHN0YW5kYXJkIG91dHB1dCBzdHJlYW0uICovCisgICAgcHVibGljIFByaW50V3JpdGVyICAgICBnZXRVc2VyT3V0cHV0KCkgeyByZXR1cm4gdXNlck91dHB1dDsgfQorICAgIC8qKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW0uICovCisgICAgcHVibGljIFByaW50V3JpdGVyICAgICBnZXRVc2VyRXJyb3IoKSB7IHJldHVybiB1c2VyRXJyb3I7IH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbS4gKi8KKyAgICBwdWJsaWMgUHVzaGJhY2tSZWFkZXIgIGdldEN1cnJlbnRJbnB1dCgpIHsgcmV0dXJuIGN1cnJlbnRJbnB1dDsgfQorICAgIC8qKiBTZXRzIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbSB0byA8Y29kZT5pbjwvY29kZT4uICovCisgICAgcHVibGljIHZvaWQgICAgICAgICAgICBzZXRDdXJyZW50SW5wdXQoUHVzaGJhY2tSZWFkZXIgaW4pIHsgY3VycmVudElucHV0ID0gaW47IH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSBjdXJyZW50IG91dHB1dCBzdHJlYW0uICovCisgICAgcHVibGljIFByaW50V3JpdGVyICAgICBnZXRDdXJyZW50T3V0cHV0KCkgeyByZXR1cm4gY3VycmVudE91dHB1dDsgfQorICAgIC8qKiBTZXRzIHRoZSBjdXJyZW50IG91dHB1dCBzdHJlYW0gdG8gPGNvZGU+b3V0PC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgdm9pZCAgICAgICAgICAgIHNldEN1cnJlbnRPdXRwdXQoUHJpbnRXcml0ZXIgb3V0KSB7IGN1cnJlbnRPdXRwdXQgPSBvdXQ7IH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSBzdHJlYW0gbWFuYWdlci4gKi8KKyAgICBwdWJsaWMgSGFzaHRhYmxlT2ZUZXJtIGdldFN0cmVhbU1hbmFnZXIoKSB7IHJldHVybiBzdHJlYW1NYW5hZ2VyOyB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgaGFzaCBtYW5hZ2VyLiAqLworICAgIHB1YmxpYyBIYXNodGFibGVPZlRlcm0gZ2V0SGFzaE1hbmFnZXIoKSB7IHJldHVybiBoYXNoTWFuYWdlcjsgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2xhbmcvUHJvbG9nQ2xhc3NMb2FkZXIuamF2YSBiL3NyYy9sYW5nL1Byb2xvZ0NsYXNzTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ1ZTBhNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sYW5nL1Byb2xvZ0NsYXNzTG9hZGVyLmphdmEKQEAgLTAsMCArMSw1MSBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmc7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisvKioKKyAqIFByb2xvZyBjbGFzcyBsb2FkZXIuCisgKgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4xCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9sb2dDbGFzc0xvYWRlciBleHRlbmRzIENsYXNzTG9hZGVyIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSA8Y29kZT5qYXZhLmxhbmcuQ2xhc3M8L2NvZGU+IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY2F0ZQorICAgICAqIGNsYXNzIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KKyAgICAgKiBAcGFyYW0gcGtnIHBhY2thZ2UgbmFtZQorICAgICAqIEBwYXJhbSBmdW5jdG9yIHByZWRpY2F0ZSBuYW1lCisgICAgICogQHBhcmFtIGFyaXR5IHByZWRpY2F0ZSBhcml0eQorICAgICAqIEBwYXJhbSByZXNvbHZlIElmIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gcmVzb2x2ZSB0aGUgY2xhc3MKKyAgICAgKiBAcmV0dXJuIGEgPGNvZGU+amF2YS5sYW5nLkNsYXNzPC9jb2RlPiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWNhdGUKKyAgICAgKiBjbGFzcyB0aGF0IGNvcnJlc3BvbmRzIHRvIDxjb2RlPnBrZzpmdW5jdG9yL2FyaXR5PC9jb2RlPgorICAgICAqIGlmIGV4aXN0cywgb3RoZXJ3aXNlIHRocm93cyA8Y29kZT5DbGFzc05vdEZvdW5kRXhjZXB0aW9uPC9jb2RlPi4KKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgbG9hZFByZWRpY2F0ZUNsYXNzKFN0cmluZyBwa2csIAorCQkJCSAgICBTdHJpbmcgZnVuY3RvciwgCisJCQkJICAgIGludCBhcml0eSwgCisJCQkJICAgIGJvb2xlYW4gcmVzb2x2ZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworCXJldHVybiBsb2FkQ2xhc3MoUHJlZGljYXRlRW5jb2Rlci5lbmNvZGUocGtnLCBmdW5jdG9yLCBhcml0eSksIHJlc29sdmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIHByZWRpY2F0ZSBjbGFzcyBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50cyBpcyBkZWZpbmVkLgorICAgICAqIEBwYXJhbSBwa2cgcGFja2FnZSBuYW1lCisgICAgICogQHBhcmFtIGZ1bmN0b3IgcHJlZGljYXRlIG5hbWUKKyAgICAgKiBAcGFyYW0gYXJpdHkgcHJlZGljYXRlIGFyaXR5CisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZGljYXRlIDxjb2RlPnBrZzpmdW5jdG9yL2FyaXR5PC9jb2RlPgorICAgICAqIGlzIGRlZmluZWQsIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZGVmaW5lZFByZWRpY2F0ZShTdHJpbmcgcGtnLCAKKwkJCQkgICAgU3RyaW5nIGZ1bmN0b3IsIAorCQkJCSAgICBpbnQgYXJpdHkpIHsKKwlTdHJpbmcgY25hbWUgPSBQcmVkaWNhdGVFbmNvZGVyLmVuY29kZShwa2csIGZ1bmN0b3IsIGFyaXR5KTsKKwljbmFtZSA9IGNuYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyI7CisJamF2YS5uZXQuVVJMIHVybCA9IGdldFJlc291cmNlKGNuYW1lKTsKKwlyZXR1cm4gdXJsICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGZpbmRDbGFzcyhTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2xhbmcvUHJvbG9nQ29udHJvbC5qYXZhIGIvc3JjL2xhbmcvUHJvbG9nQ29udHJvbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZDA2OTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGFuZy9Qcm9sb2dDb250cm9sLmphdmEKQEAgLTAsMCArMSw0MDggQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworLyoqCisgKiBQcm9sb2cgdGhyZWFkLjxicj4KKyAqIFRoZSA8Y29kZT5Qcm9sb2dDb250cm9sPC9jb2RlPiBjbGFzcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiAKKyAqIDxlbT5Qcm9sb2cgQm94IENvbnRyb2wgRmxvdyBNb2RlbDwvZW0+Ljxicj4KKyAqIFRoaXMgPGNvZGU+UHJvbG9nQ29udHJvbDwvY29kZT4gcHJvdmlkZXMgbWV0aG9kcyAKKyAqIGZvciBib3RoIHNlcXVlbnRpYWwgYW5kIHBhcmFsbGVsIGV4ZWN1dGlvbi4KKyAqCisgKiA8cHJlPgorICogLy8gQW4gZXhhbXBsZSBvZiBzZXF1ZW50aWFsIGV4ZWN1dGlvbgorICogLy8gY2FsbHMgYSBnb2FsIDxjb2RlPmZhdGhlcihhYnJhaGFtLCBYKTwvY29kZT4gYW5kIGdldCBhbGwgc29sdXRpb25zLgorICogUHJvbG9nQ29udHJvbCBwID0gbmV3IFByb2xvZ0NvbnRyb2woKTsKKyAqIFByZWRpY2F0ZSBjb2RlID0gbmV3IFBSRURfZmF0aGVyXzIoKTsKKyAqIFRlcm0gYTEgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woImFicmFoYW0iKTsKKyAqIFRlcm0gYTIgPSBuZXcgVmFyaWFibGVUZXJtKCk7CisgKiBUZXJtW10gYXJncyA9IHthMSwgYTJ9OworICogcC5zZXRQcmVkaWNhdGUoY29kZSwgYXJncyk7CisgKiBmb3IgKGJvb2xlYW4gciA9IHAuY2FsbCgpOyByOyByID0gcC5yZWRvKCkpIHsKKyAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYTIudG9TdHJpbmcoKSk7CisgKiB9CisgKiA8L3ByZT4KKyAqCisgKiA8cHJlPgorICogLy8gVG8gZ2V0IG9ubHkgb25lIHNvbHV0aW9uLgorICogUHJvbG9nQ29udHJvbCBwID0gbmV3IFByb2xvZ0NvbnRyb2woKTsKKyAqIFByZWRpY2F0ZSBjb2RlID0gbmV3IFBSRURfZmF0aGVyXzIoKTsKKyAqIFRlcm0gYTEgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woImFicmFoYW0iKTsKKyAqIFRlcm0gYTIgPSBuZXcgVmFyaWFibGVUZXJtKCk7CisgKiBUZXJtW10gYXJncyA9IHthMSwgYTJ9OworICogaWYgKHAuZXhlY3V0ZShjb2RlLCBhcmdzKSkKKyAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYTIudG9TdHJpbmcoKSk7CisgKiBlbHNlIAorICogICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZmFpbCIpOworICogPC9wcmU+CisgKiAKKyAqIDxwcmU+CisgKiAvLyBBbiBleGFtcGxlIG9mIHBhcmFsbGVsIGV4ZWN1dGlvbgorICogLy8gY2FsbHMgPGNvZGU+cXVlZW5zKDQsWCk8L2NvZGU+IGFuZCA8Y29kZT5xdWVlbnMoOCxZKTwvY29kZT4gaW4gcGFyYWxsZWwuCisgKiAvLyBVc2FnZToKKyAqIC8vICAgJSBwbGNhZmUgLWNwIHF1ZWVucy5qYXIgVAorICogLy8gCisgKiBpbXBvcnQganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nLio7CisgKiBwdWJsaWMgY2xhc3MgVCB7CisgKiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgeworICogICAgIGxvbmcgdCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICogICAgIGJvb2xlYW4gcjEgPSB0cnVlOworICogICAgIGJvb2xlYW4gcjIgPSB0cnVlOworICogICAgIFRlcm0gYTFbXSA9IHtuZXcgSW50ZWdlclRlcm0oNCksIG5ldyBWYXJpYWJsZVRlcm0oKX07CisgKiAgICAgVGVybSBhMltdID0ge25ldyBJbnRlZ2VyVGVybSg4KSwgbmV3IFZhcmlhYmxlVGVybSgpfTsKKyAqCisgKiAgICAgUHJvbG9nQ29udHJvbCBlMSA9IG5ldyBQcm9sb2dDb250cm9sKCk7CisgKiAgICAgUHJvbG9nQ29udHJvbCBlMiA9IG5ldyBQcm9sb2dDb250cm9sKCk7CisgKiAgICAgVGVybSB2MSA9IG5ldyBWYXJpYWJsZVRlcm0oKTsKKyAqICAgICBUZXJtIHYyID0gbmV3IFZhcmlhYmxlVGVybSgpOworICogICAgIGUxLnNldFByZWRpY2F0ZShuZXcgUFJFRF9xdWVlbnNfMigpLCBhMSk7CisgKiAgICAgZTIuc2V0UHJlZGljYXRlKG5ldyBQUkVEX3F1ZWVuc18yKCksIGEyKTsKKyAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0Iik7CisgKiAgICAgZTEuc3RhcnQoKTsKKyAqICAgICBlMi5zdGFydCgpOworICogICAgIHdoaWxlIChyMSB8fCByMikgeworICoJICAgIHRyeSB7CisgKgkJVGhyZWFkLnNsZWVwKDEwKTsKKyAqCSAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQorICoJICAgIGlmIChyMSAmJiBlMS5yZWFkeSgpKSB7CisgKgkJcjEgPSBlMS5uZXh0KCk7CisgKgkJaWYgKHIxKSB7CisgKgkJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3VjY2VzczEgPSAiICsgYTFbMV0pOworICoJCSAgICBlMS5jb250KCk7CisgKgkJfSBlbHNlIHsKKyAqCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsMSIpOworICoJCX0KKyAqCSAgICB9IGVsc2UgaWYgKHIyICYmIGUyLnJlYWR5KCkpIHsKKyAqCQlyMiA9IGUyLm5leHQoKTsKKyAqCQlpZiAocjIpIHsKKyAqCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdWNjZXNzMiA9ICIgKyBhMlsxXSk7CisgKgkJICAgIGUyLmNvbnQoKTsKKyAqCQl9IGVsc2UgeworICoJCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWwyIik7CisgKgkJfQorICoJICAgIH0gZWxzZSB7CisgKgkJU3lzdGVtLm91dC5wcmludGxuKCJXYWl0aW5nIik7CisgKgkJdHJ5IHsKKyAqCQkgICAgVGhyZWFkLnNsZWVwKDEwMCk7CisgKgkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkge30KKyAqCSAgICB9CisgKgl9CisgKglTeXN0ZW0ub3V0LnByaW50bG4oIkVuZCIpOworICoJbG9uZyB0MSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICoJbG9uZyB0MiA9IHQxIC0gdDsKKyAqCVN5c3RlbS5vdXQucHJpbnRsbigidGltZSA9ICIgKyB0MiArICJtc2VjLiIpOworICogICAgfQorICogfQorICogPC9wcmU+CisgKiAKKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMgorICovCitwdWJsaWMgY2xhc3MgUHJvbG9nQ29udHJvbCBpbXBsZW1lbnRzIFJ1bm5hYmxlLCBTZXJpYWxpemFibGUgeworICAgIC8qKiBBIHZvbGF0aWxlIGluc3RhbmNlIHZhcmlhYmxlIGhvbGRpbmcgYSB0aHJlYWQuICovCisgICAgcHVibGljIHZvbGF0aWxlIFRocmVhZCB0aHJlYWQ7CisKKyAgICAvKiogSG9sZHMgYSBQcm9sb2cgZW5naW5lLiAqLworICAgIHB1YmxpYyBQcm9sb2cgZW5naW5lOworCisgICAgLyoqIEhvbGRzIGEgUHJvbG9nIGdvYWwgdG8gYmUgZXhlY3V0ZWQuICovCisgICAgcHVibGljIFByZWRpY2F0ZSBjb2RlOworCisgICAgLyoqIEEgZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSByZXN1bHQgb2YgZ29hbCBpcyA8Y29kZT50cnVlPC9jb2RlPiBvciA8Y29kZT5mYWxzZTwvY29kZT4uICovCisgICAgcHVibGljIGJvb2xlYW4gcmVzdWx0OworCisgICAgLyoqIEEgZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSByZXN1bHQgb2YgZ29hbCBpcyByZWFkeSBvciBub3QuICovCisgICAgcHVibGljIGJvb2xlYW4gcmVzdWx0UmVhZHk7CisKKyAgICAvKiogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5Qcm9sb2dDb250cm9sPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgUHJvbG9nQ29udHJvbCgpIHsKKwl0aHJlYWQgPSBudWxsOworCWVuZ2luZSA9IG5ldyBQcm9sb2codGhpcyk7CisJY29kZSA9IG51bGw7CisJcmVzdWx0ID0gZmFsc2U7CisJcmVzdWx0UmVhZHkgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKiogU2V0cyBhIGdvYWwgYW5kIGl0cyBhcmd1bWVudHMgdG8gdGhpcyBQcm9sb2cgdGhyZWFkLiAKKyAgICAgKiBBbiBpbml0aWFsIGNvbnRpbnVhdGlvbiBnb2FsIChhIDxjb2RlPlN1Y2Nlc3M8L2NvZGU+IG9iamVjdCkKKyAgICAgKiBpcyBzZXQgdG8gdGhlIDxjb2RlPmNvbnQ8L2NvZGU+IGZpZWxkIG9mIGdvYWwgPGNvZGU+cDwvY29kZT4gYXMgY29udGludWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByZWRpY2F0ZShQcmVkaWNhdGUgcCwgVGVybVtdIGFyZ3MpIHsKKwljb2RlID0gcDsKKwljb2RlLnNldEFyZ3VtZW50KGFyZ3MsIG5ldyBTdWNjZXNzKHRoaXMpKTsKKyAgICB9CisKKyAgICAvKiogU2V0cyBhIGdvYWwgPGNvZGU+Y2FsbCh0KTwvY29kZT4gdG8gdGhpcyBQcm9sb2cgdGhyZWFkLiAKKyAgICAgKiBBbiBpbml0aWFsIGNvbnRpbnVhdGlvbiBnb2FsIChhIDxjb2RlPlN1Y2Nlc3M8L2NvZGU+IG9iamVjdCkKKyAgICAgKiBpcyBzZXQgdG8gdGhlIDxjb2RlPmNvbnQ8L2NvZGU+IGZpZWxkIG9mIDxjb2RlPmNhbGwodCk8L2NvZGU+IGFzIGNvbnRpbnVhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmVkaWNhdGUoVGVybSB0KSAgeworCXRyeSB7CisJICAgIENsYXNzIGNsYXp6ID0gZW5naW5lLnBjbC5sb2FkUHJlZGljYXRlQ2xhc3MoImpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbiIsICJjYWxsIiwgMSwgdHJ1ZSk7CisJICAgIFRlcm1bXSBhcmdzID0ge2VuZ2luZS5jb3B5KHQpfTsKKwkgICAgY29kZSA9IChQcmVkaWNhdGUpKGNsYXp6Lm5ld0luc3RhbmNlKCkpOworCSAgICBjb2RlLnNldEFyZ3VtZW50KGFyZ3MsIG5ldyBTdWNjZXNzKHRoaXMpKTsKKwl9IGNhdGNoIChFeGNlcHRpb24gZSl7CisJICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN5c3RlbSBzdWNjZWVkcyB0byBmaW5kIGEgZmlyc3Qgc29sdXRpb24KKyAgICAgKiBvZiB0aGUgZ2l2ZW4gZ29hbCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS48YnI+CisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgdG8gZmluZCBvbmx5IG9uZSBzb2x1dGlvbi48YnI+CisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBmaXJzdCBpbml0aWxpemVzIHRoZSBQcm9sb2cgZW5naW5lIGJ5IGludm9raW5nIDxjb2RlPmVuZ2luZS5pbml0KCk8L2NvZGU+LAorICAgICAqIGFsbG9jYXRlcyBhIG5ldyA8Y29kZT5UaHJlYWQ8L2NvZGU+IG9iamVjdCwgYW5kIHN0YXJ0IHRoZSBleGVjdXRpb24gb2YgdGhlIGdpdmVuIGdvYWwuCisgICAgICogQW5kIHRoZW4gaXQgc3RvcHMgdGhlIHRocmVhZCBhbmQgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiAKKyAgICAgKiBpZiB0aGUgZ29hbCBzdWNjZWVkcywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAc2VlICNydW4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZXhlY3V0ZShQcmVkaWNhdGUgcCwgVGVybVtdIGFyZ3MpIHsKKwllbmdpbmUuaW5pdCgpOworCWNvZGUgPSBwOworCWNvZGUuc2V0QXJndW1lbnQoYXJncywgbmV3IFN1Y2Nlc3ModGhpcykpOworCXRocmVhZCA9IG5ldyBUaHJlYWQodGhpcyk7CisJdGhyZWFkLnN0YXJ0KCk7IC8vIGV4ZWN1dGUgcnVuKCkgaW4gbmV3IHRocmVhZC4KKwl0cnkgeworCSAgICB3YWl0KCk7ICAgICAvLyB3YWl0IGNhbGxlcidzIHRocmVhZC4KKwl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQorCXN0b3AoKTsKKwlyZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN5c3RlbSBzdWNjZWVkcyB0byBmaW5kIGEgZmlyc3Qgc29sdXRpb24KKyAgICAgKiBvZiB0aGUgZ29hbCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS48YnI+CisgICAgICogCisgICAgICogVGhpcyBtZXRob2QgZmlyc3QgaW52b2tlcyB0aGUgPGNvZGU+c3RhcnQoKTwvY29kZT4gbWV0aG9kIHRoYXQKKyAgICAgKiBpbml0aWxpemVzIHRoZSBQcm9sb2cgZW5naW5lLCBhbGxvY2F0ZXMgYSBuZXcgPGNvZGU+VGhyZWFkPC9jb2RlPiBvYmplY3QsIAorICAgICAqIGFuZCBzdGFydCB0aGUgZXhlY3V0aW9uLgorICAgICAqIEFuZCB0aGVuIGl0IHJldHVybnMgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHdob3NlIHZhbHVlIGlzIDxjb2RlPm5leHQoKTwvY29kZT4uCisgICAgICogQHNlZSAjc3RhcnQKKyAgICAgKiBAc2VlICNuZXh0CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNhbGwoKSB7CisJc3RhcnQoKTsKKwlyZXR1cm4gbmV4dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN5c3RlbSBzdWNjZWVkcyB0byBmaW5kIGEgbmV4dCBzb2x1dGlvbgorICAgICAqIG9mIHRoZSBnb2FsLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLjxicj4KKyAgICAgKiAKKyAgICAgKiBUaGlzIG1ldGhvZCBmaXJzdCBpbnZva2VzIHRoZSA8Y29kZT5jb250KCk8L2NvZGU+IG1ldGhvZCB0aGF0CisgICAgICogc2V0cyB0aGUgPGNvZGU+cmVzdWx0UmVhZHk8L2NvZGU+IHRvIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqIGFuZCB3YWtlcyB1cCBhbGwgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIG9uIHRoaXMgb2JqZWN0J3MgbW9uaXRvci4KKyAgICAgKiBBbmQgdGhlbiBpdCByZXR1cm5zIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB3aG9zZSB2YWx1ZSBpcyA8Y29kZT5uZXh0KCk8L2NvZGU+LgorICAgICAqIEBzZWUgI2NvbnQKKyAgICAgKiBAc2VlICNuZXh0CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlZG8oKSB7CisJY29udCgpOworCXJldHVybiBuZXh0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgaW52b2tlZCB3aGVuIHRoZSBzeXN0ZW0gc3VjY2VlZHMgdG8gZmluZCBhIHNvbHV0aW9uLjxicj4KKyAgICAgKiAKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGZyb20gdGhlIGluaXRpYWwgY29udGludWF0aW9uIGdvYWwKKyAgICAgKiAoYSA8Y29kZT5TdWNjZXNzPC9jb2RlPiBvYmplY3QpLjxicj4KKyAgICAgKiAKKyAgICAgKiBUaGlzIG1ldGhvZCBmaXJzdCBzZXRzIHRoZSA8Y29kZT5yZXN1bHRSZWFkeTwvY29kZT4gYW5kIDxjb2RlPnJlc3VsdDwvY29kZT4gdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICogQW5kIHRoZW4gaXQgd2FrZXMgdXAgYWxsIHRocmVhZHMgdGhhdCBhcmUgd2FpdGluZyBieSA8Y29kZT5ub3RpZnlBbGwoKTwvY29kZT4uCisgICAgICogRmluYWxseSwgd2hpbGUgdGhlIDxjb2RlPnRocmVhZDwvY29kZT4gaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IGFuZCAKKyAgICAgKiB0aGUgPGNvZGU+cmVzdWx0UmVhZHk8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+LCAKKyAgICAgKiBpdCB3YWl0cyB1bnRpbCBhbm90aGVyIHRocmVhZCBpbnZva2VzIHRoZSA8Y29kZT5ub3RpZnkoKTwvY29kZT4gbWV0aG9kIAorICAgICAqIG9yIHRoZSA8Y29kZT5ub3RpZnlBbGwoKTwvY29kZT4gbWV0aG9kIGZvciB0aGlzIG9iamVjdC4KKyAgICAgKiBAc2VlICNyZXN1bHRSZWFkeQorICAgICAqIEBzZWUgI3Jlc3VsdAorICAgICAqIEBzZWUgI3RocmVhZAorICAgICAqLworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzdWNjZXNzKCkgeworCXJlc3VsdFJlYWR5ID0gdHJ1ZTsKKwlyZXN1bHQgPSB0cnVlOworCW5vdGlmeUFsbCgpOworCXdoaWxlICh0aHJlYWQgIT0gbnVsbCAmJiByZXN1bHRSZWFkeSkgeworCSAgICB0cnkgeworCQl3YWl0KCk7CisJICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIElzIGludm9rZWQgYWZ0ZXIgZmFpbHVyZSBvZiBhbGwgdHJpYWxzLjxicj4KKyAgICAgKiAKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGZyb20gdGhlIDxjb2RlPnJ1bjwvY29kZT4gbWV0aG9kLjxicj4KKyAgICAgKiAKKyAgICAgKiBUaGlzIG1ldGhvZCBmaXJzdCBzZXRzIHRoZSA8Y29kZT5yZXN1bHRSZWFkeTwvY29kZT4gYW5kIDxjb2RlPnJlc3VsdDwvY29kZT4gCisgICAgICogdG8gPGNvZGU+dHJ1ZTwvY29kZT4gYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiByZXNwZWN0aXZlbHkuCisgICAgICogQW5kIHRoZW4gaXQgd2FrZXMgdXAgYWxsIHRocmVhZHMgdGhhdCBhcmUgd2FpdGluZyBieSA8Y29kZT5ub3RpZnlBbGwoKTwvY29kZT4uCisgICAgICogRmluYWxseSwgd2hpbGUgdGhlIDxjb2RlPnRocmVhZDwvY29kZT4gaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IGFuZCAKKyAgICAgKiB0aGUgPGNvZGU+cmVzdWx0UmVhZHk8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+LCAKKyAgICAgKiBpdCB3YWl0cyB1bnRpbCBhbm90aGVyIHRocmVhZCBpbnZva2VzIHRoZSA8Y29kZT5ub3RpZnkoKTwvY29kZT4gbWV0aG9kIAorICAgICAqIG9yIHRoZSA8Y29kZT5ub3RpZnlBbGwoKTwvY29kZT4gbWV0aG9kIGZvciB0aGlzIG9iamVjdC4KKyAgICAgKiBAc2VlICNyZXN1bHRSZWFkeQorICAgICAqIEBzZWUgI3Jlc3VsdAorICAgICAqIEBzZWUgI3RocmVhZAorICAgICAqLworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBmYWlsKCkgeworCXJlc3VsdFJlYWR5ID0gdHJ1ZTsKKwlyZXN1bHQgPSBmYWxzZTsKKwlub3RpZnlBbGwoKTsKKwl3aGlsZSAodGhyZWFkICE9IG51bGwgJiYgcmVzdWx0UmVhZHkpIHsKKwkgICAgdHJ5IHsKKwkJd2FpdCgpOworCSAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQorCX0KKyAgICB9CisKKyAgICAvKiogV2FpdHMgZm9yIHRoaXMgdGhyZWFkIHRvIGRpZS4gKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgam9pbigpIHsKKwl3aGlsZSAodGhyZWFkICE9IG51bGwgJiYgISByZXN1bHRSZWFkeSkgeworCSAgICB0cnkgeworCQl3YWl0KCk7CisJICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHt9CisJfQorCXN0b3AoKTsKKyAgICB9CisKKyAgICAvKiogCisgICAgICogRm9yY2VzIHRoZSB0aHJlYWQgdG8gc3RvcC48YnI+CisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBmaXJzdCBzZXRzIHRoZSA8Y29kZT5yZXN1bHRSZWFkeTwvY29kZT4gYW5kIDxjb2RlPnRocmVhZDwvY29kZT4gCisgICAgICogdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IGFuZCA8Y29kZT5udWxsPC9jb2RlPiByZXNwZWN0aXZlbHkuCisgICAgICogQW5kIHRoZW4gaXQgd2FrZXMgdXAgYWxsIHRocmVhZHMgdGhhdCBhcmUgd2FpdGluZyBieSA8Y29kZT5ub3RpZnlBbGwoKTwvY29kZT4uCisgICAgICogQHNlZSAjcmVzdWx0UmVhZHkKKyAgICAgKiBAc2VlICN0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKKwlyZXN1bHRSZWFkeSA9IGZhbHNlOworCXRocmVhZCA9IG51bGw7CisJbm90aWZ5QWxsKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yY2VzIHRoZSB0aHJlYWQgdG8gc3RhcnQgdGhlIGV4ZWN1dGlvbi48YnI+CisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBpbml0aWxpemVzIHRoZSBQcm9sb2cgZW5naW5lIGJ5IGludm9raW5nIDxjb2RlPmVuZ2luZS5pbml0KCk8L2NvZGU+LAorICAgICAqIGFsbG9jYXRlcyBhIG5ldyA8Y29kZT5UaHJlYWQ8L2NvZGU+IG9iamVjdCwgYW5kIHN0YXJ0IHRoZSBleGVjdXRpb24uCisgICAgICogVGhlIEphdmEgVmlydHVhbCBNYWNoaW5lIGNhbGxzIHRoZSA8Y29kZT5ydW48L2NvZGU+IG1ldGhvZCBvZiB0aGlzIHRocmVhZC4KKyAgICAgKiBAc2VlICNydW4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoKSB7CisJcmVzdWx0UmVhZHkgPSBmYWxzZTsKKwllbmdpbmUuaW5pdCgpOworCXRocmVhZCA9IG5ldyBUaHJlYWQodGhpcyk7CisJdGhyZWFkLnN0YXJ0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yY2VzIHRoZSB0aHJlYWQgdG8gY29udGludWUgdGhlIGV4ZWN1dGlvbi48YnI+CisgICAgICogCisgICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgPGNvZGU+cmVzdWx0UmVhZHk8L2NvZGU+IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwKKyAgICAgKiBhbmQgdGhlbiB3YWtlcyB1cCBhbGwgdGhyZWFkcyB0aGF0IGFyZSB3YWl0aW5nIGJ5IDxjb2RlPm5vdGlmeUFsbCgpPC9jb2RlPi4KKyAgICAgKiBAc2VlICNyZXN1bHRSZWFkeQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjb250KCkgeworCXJlc3VsdFJlYWR5ID0gZmFsc2U7CisJbm90aWZ5QWxsKCk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlc3VsdCBvZiBnb2FsIGlzIHJlYWR5LAorICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICogQHJldHVybiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHdob3NlIHZhbHVlIGlzIDxjb2RlPnJlc3VsdFJlYWR5PC9jb2RlPi4KKyAgICAgKiBAc2VlICNyZXN1bHRSZWFkeQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWFkeSgpIHsKKwlyZXR1cm4gcmVzdWx0UmVhZHk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlc3VsdCBvZiBnb2FsIGlzIHJlYWR5IGFuZCB0cnVlLCBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqIEByZXR1cm4gYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB3aG9zZSB2YWx1ZSBpcyA8Y29kZT4ocmVhZHkoKSAmYW1wOyZhbXA7IHJlc3VsdCk8L2NvZGU+LgorICAgICAqIEBzZWUgI3JlYWR5CisgICAgICogQHNlZSAjcmVzdWx0CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGluX3N1Y2Nlc3MoKSB7CisJcmV0dXJuIHJlYWR5KCkgJiYgcmVzdWx0OworICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXN1bHQgb2YgZ29hbCBpcyByZWFkeSBhbmQgZmFsc2UsIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICogQHJldHVybiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHdob3NlIHZhbHVlIGlzIDxjb2RlPihyZWFkeSgpICZhbXA7JmFtcDsgIXJlc3VsdCk8L2NvZGU+LgorICAgICAqIEBzZWUgI3JlYWR5CisgICAgICogQHNlZSAjcmVzdWx0CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGluX2ZhaWx1cmUoKSB7CisJcmV0dXJuIHJlYWR5KCkgJiYgISByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2FpdCB1bnRpbCB0aGUgc3lzdGVtIGZpbmRzIGEgbmV4dCBzb2x1dGlvbiwKKyAgICAgKiBhbmQgdGhlbiByZXR1cm5zIHRoZSByZXN1bHQgYXMgPGNvZGU+Ym9vbGVhbjwvY29kZT4uPGJyPgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgZmlyc3Qgd2FpdHMgdW50aWwgYW5vdGhlciB0aHJlYWQgaW52b2tlcyB0aGUgPGNvZGU+bm90aWZ5KCk8L2NvZGU+CisgICAgICogbWV0aG9kIG9yIHRoZSA8Y29kZT5ub3RpZnlBbGwoKTwvY29kZT4gbWV0aG9kIGZvciB0aGlzIG9iamVjdCwgCisgICAgICogd2hpbGUgdGhlIDxjb2RlPnRocmVhZDwvY29kZT4gaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IGFuZCAKKyAgICAgKiB0aGUgPGNvZGU+cmVzdWx0UmVhZHk8L2NvZGU+IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiBBbmQgdGhlbiBpbnZva2VzIHRoZSA8Y29kZT5zdG9wKCk8L2NvZGU+IGlmIHRoZSA8Y29kZT5yZXN1bHQ8L2NvZGU+IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiBGaW5hbGx5LCByZXR1cm5zIHRoZSA8Y29kZT5yZXN1bHQ8L2NvZGU+LgorICAgICAqIEBzZWUgI3Jlc3VsdFJlYWR5CisgICAgICogQHNlZSAjcmVzdWx0CisgICAgICogQHNlZSAjdGhyZWFkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIG5leHQoKSB7CisJd2hpbGUgKHRocmVhZCAhPSBudWxsICYmICEgcmVzdWx0UmVhZHkpIHsKKwkgICAgdHJ5IHsKKwkJd2FpdCgpOworCSAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7fQorCX0KKwlpZiAoISByZXN1bHQpIHsKKwkgICAgc3RvcCgpOworCX0KKwlyZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSBnb2FsLjxicj4KKyAgICAgKgorICAgICAqIEV2ZXJ5IHRpbWUgZmluZGluZyBhIHNvbHV0aW9uLCB0aGUgPGNvZGU+c3VjY2VzczwvY29kZT4gbWV0aG9kIGlzIGludm9rZWQuCisgICAgICogQW5kIHRoZW4gdGhlIDxjb2RlPmZhaWw8L2NvZGU+IG1ldGhvZCBpcyBpbnZva2VkIGFmdGVyIGZhaWx1cmUgb2YgYWxsIHRyaWFscy4KKyAgICAgKiBGaW5hbGx5LCB0aGUgPGNvZGU+c3RvcDwvY29kZT4gbWV0aG9kIGlzIGludm9rZWQgYXQgdGhlIGVuZCBvZiB0aGlzIDxjb2RlPnJ1bjwvY29kZT4uCisgICAgICogQHNlZSAjc3VjY2VzcworICAgICAqIEBzZWUgI2ZhaWwKKyAgICAgKiBAc2VlICNzdG9wCisgICAgICovCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworCXRyeSB7CisJICAgIG1haW5fbG9vcDp3aGlsZSh0cnVlKSB7CisJCXdoaWxlIChlbmdpbmUuZXhjZXB0aW9uUmFpc2VkID09IDApIHsKKwkJICAgIGlmICh0aHJlYWQgPT0gbnVsbCkKKwkJCWJyZWFrIG1haW5fbG9vcDsKKwkJICAgIGNvZGUgPSBjb2RlLmV4ZWMoZW5naW5lKTsKKwkJfQorCQlzd2l0Y2ggKGVuZ2luZS5leGNlcHRpb25SYWlzZWQpIHsKKwkJY2FzZSAxOiAgLy8gaGFsdC8wCisJCSAgICBicmVhayBtYWluX2xvb3A7CisJCWNhc2UgMjogIC8vIGZyZWV6ZS8yCisJCSAgICB0aHJvdyBuZXcgU3lzdGVtRXhjZXB0aW9uKCJmcmVlemUvMiBpcyBub3Qgc3VwcG9ydGVkIHlldCIpOworCQkgICAgLy8gRG8gc29tZXRoaW5nIGhlcmUKKwkJICAgIC8vIGVuZ2luZS5leGNlcHRpb25SYWlzZWQgPSAwIDsKKwkJICAgIC8vIGJyZWFrOworCQlkZWZhdWx0OgorCQkgICAgdGhyb3cgbmV3IFN5c3RlbUV4Y2VwdGlvbigiSW52YWxpZCB2YWx1ZSBvZiBleGNlcHRpb25SYWlzZWQiKTsKKwkJfQorCSAgICB9CisJfSBjYXRjaCAoUHJvbG9nRXhjZXB0aW9uIGUpeworCSAgICBpZiAoZW5naW5lLmdldFByaW50U3RhY2tUcmFjZSgpLmVxdWFscygib24iKSkKKwkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkgICAgZWxzZSAKKwkJU3lzdGVtLm91dC5wcmludGxuKGUudG9TdHJpbmcoKSk7CisJfSBjYXRjaCAoRXhjZXB0aW9uIGUpeworCSAgICBlLnByaW50U3RhY2tUcmFjZSgpOworCX0KKwlzdG9wKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2xhbmcvUHJvbG9nRXhjZXB0aW9uLmphdmEgYi9zcmMvbGFuZy9Qcm9sb2dFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGNhYjg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xhbmcvUHJvbG9nRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmc7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisvKioKKyAqIFRoZSBzdXBlcmNsYXNzIG9mIGNsYXNzZXMgZm9yIFByb2xvZyBleGNlcHRpb25zLjxicj4KKyAqCisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFByb2xvZ0V4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisgICAgLyoqIENvbnN0cnVjdHMgYSBuZXcgUHJvbG9nIGV4Y2VwdGlvbi4gKi8KKyAgICBwdWJsaWMgUHJvbG9nRXhjZXB0aW9uKCkge30KKworICAgIC8qKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHRlcm0gb2YgdGhpcyBvYmplY3QuICovCisgICAgYWJzdHJhY3QgcHVibGljIFRlcm0gZ2V0TWVzc2FnZVRlcm0oKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9sYW5nL1Byb2xvZ01haW4uamF2YSBiL3NyYy9sYW5nL1Byb2xvZ01haW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTFjNmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xhbmcvUHJvbG9nTWFpbi5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZzsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworLyoqCisgKiBQcm9sb2cgQ2FmZSBsYXVuY2hlci4KKyAqIFRoZSA8Y29kZT5Qcm9sb2dNYWluPC9jb2RlPiBjbGFzcyBsYXVuY2hzIHRoZSBQcm9sb2cgQ2FmZSBzeXN0ZW0uPGJyPgorICogVGhlIHVzYWdlIGlzIGFzIGZvbGxvd3MsIHdoZXJlIAorICogPGNvZGU+cGFja2FnZTwvY29kZT4gaXMgYSBwYWNrYWdlIG5hbWUsIGFuZCAKKyAqIDxjb2RlPnByZWRpY2F0ZTwvY29kZT4gaXMgYSBwcmVkaWNhdGUgbmFtZSAob25seSBhdG9tKS4KKyAqIDxwcmU+CisgKiAgICUgamF2YSAtY3AgJFBMQ0FGRURJUi9wbGNhZmUuamFyIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy5Qcm9sb2dNYWluIHBhY2thZ2U6cHJlZGljYXRlCisgKiAgICUgamF2YSAtY3AgJFBMQ0FGRURJUi9wbGNhZmUuamFyIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy5Qcm9sb2dNYWluIHByZWRpY2F0ZQorICogPC9wcmU+CisgKiBMZXQgdXMgc2hvdyBhIHNhbXBsZSBzZXNzaW9uIGZvciBsYXVuY2hpbmcgYSBzbWFsbCBQcm9sb2cgaW50ZXJwcmV0ZXI6CisgKiA8Y29kZT5qcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW46Y2FmZXRlcmlhLzA8L2NvZGU+Ljxicj4KKyAqIDxwcmU+CisgKiAgICAlIGphdmEgIC1jcCAkUExDQUZFRElSL3BsY2FmZS5qYXI6JENMQVNTUEFUSCBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmcuUHJvbG9nTWFpbiBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmJ1aWx0aW46Y2FmZXRlcmlhCisgKiAgICBQcm9sb2cgQ2FmZSBYLlguWCAoWVlZKQorICogICAgQ29weXJpZ2h0KEMpIDE5OTctMjAwWCBNLkJhbmJhcmEgYW5kIE4uVGFtdXJhCisgKiAgICB8ID8tIAorICogPC9wcmU+CisgKgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9sb2dNYWluIHsKKyAgICAvKiogVmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFZFUlNJT04gICA9ICJQcm9sb2cgQ2FmZSAxLjIuNSAobWFudGlzKSI7CisgICAgLyoqIENvcHlyaWdodCBpbmZvcm1hdGlvbiAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENPUFlSSUdIVCA9ICJDb3B5cmlnaHQoQykgMTk5Ny0yMDA5IE0uQmFuYmFyYSBhbmQgTi5UYW11cmEiOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgeworCVByb2xvZ0NvbnRyb2wgcDsKKwlQcmVkaWNhdGUgY29kZTsKKwlTdHJpbmcgZ29hbDsKKwlDbGFzcyBjbGF6ejsKKwl0cnkgeworCSAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlxuIiArIFZFUlNJT04pOyAKKwkgICAgU3lzdGVtLmVyci5wcmludGxuKENPUFlSSUdIVCk7CisJICAgIGlmIChhcmd2Lmxlbmd0aCAhPSAxKSB7CisJCXVzYWdlKCk7CisJCVN5c3RlbS5leGl0KDk5OSk7CisJICAgIH0gCisJICAgIGNsYXp6ID0gKG5ldyBQcm9sb2dDbGFzc0xvYWRlcigpKS5sb2FkUHJlZGljYXRlQ2xhc3MoImpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbiIsCisJCQkJCQkJCSAiaW5pdGlhbGl6YXRpb24iLAorCQkJCQkJCQkgMiwKKwkJCQkJCQkJIHRydWUpOworCSAgICBUZXJtIGFyZzEgPSBQcm9sb2cuTmlsOworCSAgICBhcmcxID0gbmV3IExpc3RUZXJtKFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgidXNlciIpLCBhcmcxKTsKKwkgICAgYXJnMSA9IG5ldyBMaXN0VGVybShTeW1ib2xUZXJtLm1ha2VTeW1ib2woImpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuYnVpbHRpbiIpLCBhcmcxKTsKKwkgICAgLy8JICAgIGFyZzEgPSBuZXcgTGlzdFRlcm0oU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmNvbXBpbGVyLnBsMmFtIiksIGFyZzEpOworCSAgICAvLwkgICAgYXJnMSA9IG5ldyBMaXN0VGVybShTeW1ib2xUZXJtLm1ha2VTeW1ib2woImpwLmFjLmtvYmVfdS5jcy5wcm9sb2cuY29tcGlsZXIuYW0yaiIpLCBhcmcxKTsKKwkgICAgVGVybSBhcmcyID0gcGFyc2VBdG9taWNHb2FsKGFyZ3ZbMF0pOworCSAgICBpZiAoYXJnMiAgPT0gbnVsbCkgeworCQl1c2FnZSgpOworCQlTeXN0ZW0uZXhpdCgxKTsKKwkgICAgfQorCSAgICBUZXJtW10gYXJncyA9IHthcmcxLCBhcmcyfTsKKwkgICAgY29kZSA9IChQcmVkaWNhdGUpKGNsYXp6Lm5ld0luc3RhbmNlKCkpOworCSAgICBwID0gbmV3IFByb2xvZ0NvbnRyb2woKTsKKwkgICAgcC5zZXRQcmVkaWNhdGUoY29kZSwgYXJncyk7CisJICAgIGZvciAoYm9vbGVhbiByID0gcC5jYWxsKCk7IHI7IHIgPSBwLnJlZG8oKSkge30KKwkgICAgU3lzdGVtLmV4aXQoMCk7CisJfSBjYXRjaCAoRXhjZXB0aW9uIGUpeworCSAgICBlLnByaW50U3RhY2tUcmFjZSgpOworCSAgICBTeXN0ZW0uZXhpdCgxKTsKKwl9CisgICAgfQorCisgICAgLyoqIFJldHVybnMgYSB0ZXJtIGZvciBnaXZlbiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYXRvbSBnb2FsLCBvciAKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBwYXJzaW5nIGZhaWxzLgorICAgICAqIEBwYXJhbSBzICBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBpbml0aWFsIGdvYWwgKGV4LiBmb2dlOm1haW4pLgorICAgICAqIEByZXR1cm4gYSB0ZXJtIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGEgZ2l2ZW4gc3RyaW5nLAorICAgICAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHBhcnNpbmcgZmFpbHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBUZXJtIHBhcnNlQXRvbWljR29hbChTdHJpbmcgcykgeworCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocywgIjoiKTsKKwlpbnQgaSA9IHN0LmNvdW50VG9rZW5zKCk7CisJaWYgKGkgPT0gMSkgeworCSAgICBUZXJtW10gYXJncyA9IHtTeW1ib2xUZXJtLm1ha2VTeW1ib2woInVzZXIiKSwgCisJCQkgICBTeW1ib2xUZXJtLm1ha2VTeW1ib2woc3QubmV4dFRva2VuKCkpfTsKKwkgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVUZXJtKFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiOiIsIDIpLCBhcmdzKTsKKwl9IGVsc2UgaWYgKGkgPT0gMikgeworCSAgICBUZXJtW10gYXJncyA9IHtTeW1ib2xUZXJtLm1ha2VTeW1ib2woc3QubmV4dFRva2VuKCkpLCAKKwkJCSAgIFN5bWJvbFRlcm0ubWFrZVN5bWJvbChzdC5uZXh0VG9rZW4oKSl9OworCSAgICByZXR1cm4gbmV3IFN0cnVjdHVyZVRlcm0oU3ltYm9sVGVybS5tYWtlU3ltYm9sKCI6IiwgMiksIGFyZ3MpOworCX0gZWxzZSB7CisJICAgIHJldHVybiBudWxsOworCX0KKyAgICB9CisKKyAgICAvKiogU2hvd3MgdXNhZ2UgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgdXNhZ2UoKSB7CisJU3RyaW5nIHMgPSAiVXNhZ2U6XG4iOworCXMgKz0gImphdmEgLWNwICRQTENBRkVESVIvcGxjYWZlLmphciI7CisJcyArPSAiIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy5Qcm9sb2dNYWluIHBhY2thZ2U6cHJlZGljYXRlXG4iOworCXMgKz0gImphdmEgLWNwICRQTENBRkVESVIvcGxjYWZlLmphciI7CisJcyArPSAiIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZy5Qcm9sb2dNYWluIHByZWRpY2F0ZVxuIjsKKwlzICs9ICIgICAgcGFja2FnZTogICAgICAgIHBhY2thZ2UgbmFtZVxuIjsKKwlzICs9ICIgICAgcHJlZGljYXRlOiAgICAgIHByZWRpY2F0ZSBuYW1lIChvbmx5IGF0b20pIjsKKwlTeXN0ZW0ub3V0LnByaW50bG4ocyk7CisgICAgfQorCisgICAgLyoKKyAgICBwdWJsaWMgc3RhdGljIFRlcm0gbWFrZUxpc3QoaW50IG4peworCVRlcm0gdCA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgiW10iKTsKKwlmb3IgKGludCBpPW47IGk+MDsgaS0tKXsKKwkgICAgdCA9IG5ldyBMaXN0VGVybShuZXcgSW50ZWdlclRlcm0oaSksIHQpOworCX0KKwlyZXR1cm4gdDsKKyAgICB9CisgICAgKi8KK30KKwpkaWZmIC0tZ2l0IGEvc3JjL2xhbmcvUHVzaERvd25MaXN0LmphdmEgYi9zcmMvbGFuZy9QdXNoRG93bkxpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDc3NDFmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xhbmcvUHVzaERvd25MaXN0LmphdmEKQEAgLTAsMCArMSw5NCBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmc7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisvKioKKyAqIFB1c2ggZG93biBMaXN0Ljxicj4KKyAqIFRoZSBjbGFzcyA8Y29kZT5QdXNoRG93bkxpc3Q8L2NvZGU+IHJlcHJlc2VudHMgYSBwdXNoIGRvd24gbGlzdC48YnI+CisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjEKKyAqLworcHVibGljIGNsYXNzIFB1c2hEb3duTGlzdCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgLyoqIE1heGltdW0gc2l6ZSBvZiBlbnRpZXMuIEluaXRpYWwgc2l6ZSBpcyA8Y29kZT4xMDAwMDwvY29kZT4uICovCisgICAgcHJvdGVjdGVkIGludCBtYXhDb250ZW50cyA9IDEwMDA7CisKKyAgICAvKiogQW4gYXJyYXkgb2YgPGNvZGU+VGVybTwvY29kZT4gZW50cmllcy4gKi8KKyAgICBwcm90ZWN0ZWQgVGVybVtdIGJ1ZmZlcjsKKworICAgIC8qKiB0aGUgdG9wIGluZGV4IG9mIHRoaXMgPGNvZGU+UHVzaERvd25MaXN0PC9jb2RlPi4gKi8KKyAgICBwcm90ZWN0ZWQgaW50IHRvcDsKKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgbmV3IHBkbC4gKi8KKyAgICBwdWJsaWMgUHVzaERvd25MaXN0KCkgeworCWJ1ZmZlciA9IG5ldyBUZXJtW21heENvbnRlbnRzXTsKKwl0b3AgPSAtMTsKKyAgICB9CisKKyAgICAvKiogQ29uc3RydWN0cyBhIG5ldyBwZGwgd2l0aCB0aGUgZ2l2ZW4gc2l6ZS4gKi8KKyAgICBwdWJsaWMgUHVzaERvd25MaXN0KGludCBuKSB7CisJbWF4Q29udGVudHMgPSBuOworCWJ1ZmZlciA9IG5ldyBUZXJtW21heENvbnRlbnRzXTsKKwl0b3AgPSAtMTsKKyAgICB9CisKKyAgICAvKiogRGlzY2FyZHMgYWxsIGVudHJpZXMuICovCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHsgZGVsZXRlQWxsKCk7IH0KKworICAgIC8qKiBQdXNocyBhbiBlbnRyeSB0byB0aGlzIDxjb2RlPlB1c2hEb3duTGlzdDwvY29kZT4uICovCisgICAgcHVibGljIHZvaWQgcHVzaChUZXJtIHQpIHsKKwl0cnkgeworCSAgICBidWZmZXJbKyt0b3BdID0gdDsKKwl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIntleHBhbmRpbmcgcGRsLi4ufSIpOworCSAgICBpbnQgbGVuID0gYnVmZmVyLmxlbmd0aDsKKwkgICAgVGVybVtdIG5ld19idWZmZXIgPSBuZXcgVGVybVtsZW4rMTAwMDBdOworCSAgICBmb3IoaW50IGk9MDsgaTxsZW47IGkrKyl7CisJCW5ld19idWZmZXJbaV0gPSBidWZmZXJbaV07CisJICAgIH0KKwkgICAgYnVmZmVyID0gbmV3X2J1ZmZlcjsKKwkgICAgYnVmZmVyW3RvcF0gPSB0OworCSAgICBtYXhDb250ZW50cyA9IGxlbisxMDAwMDsKKwl9CisgICAgfQorCisgICAgLyoqIFBvcHMgYW4gZW50cnkgZnJvbSB0aGlzIDxjb2RlPlB1c2hEb3duTGlzdDwvY29kZT4uICovCisgICAgcHVibGljIFRlcm0gcG9wKCkgeworCVRlcm0gdCA9IGJ1ZmZlclt0b3BdOworCWJ1ZmZlclt0b3AtLV0gPSBudWxsOworCXJldHVybiB0OworICAgIH0KKworICAgIC8qKiBEaXNjYXJkcyBhbGwgZW50cmllcy4gKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZWxldGVBbGwoKSB7CisJd2hpbGUgKCEgZW1wdHkoKSkgeworCSAgICBidWZmZXJbdG9wLS1dID0gbnVsbDsKKwl9CQorICAgIH0KKworICAgIC8qKiBUZXN0cyBpZiB0aGlzIHBkbCBoYXMgbm8gZW50cnkuICovCisgICAgcHVibGljIGJvb2xlYW4gZW1wdHkoKSB7CisJcmV0dXJuIHRvcCA9PSAtMTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgb2YgPGNvZGU+bWF4Q29udGVudHM8L2NvZGU+LiAKKyAgICAgKiBAc2VlICNtYXhDb250ZW50cworICAgICAqLworICAgIHB1YmxpYyBpbnQgbWF4KCkgeyByZXR1cm4gbWF4Q29udGVudHM7IH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiA8Y29kZT50b3A8L2NvZGU+LiAKKyAgICAgKiBAc2VlICN0b3AKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHRvcCgpIHsgcmV0dXJuIHRvcDsgfQorCisgICAgLyoqIFNob3dzIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlB1c2hEb3duTGlzdDwvY29kZT4uICovCisgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKwlpZiAoZW1wdHkoKSkgeworCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIntwZGwgaXMgZW1wdHkhfSIpOworCSAgICByZXR1cm47CisJfQorCWZvciAoaW50IGk9MDsgaTw9dG9wOyBpKyspIHsKKwkgICAgU3lzdGVtLm91dC5wcmludCgicGRsWyIgKyBpICsgIl06ICIpOworCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oYnVmZmVyW2ldKTsKKwl9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zcmMvbGFuZy9SZXByZXNlbnRhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvc3JjL2xhbmcvUmVwcmVzZW50YXRpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjMyYjIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xhbmcvUmVwcmVzZW50YXRpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDU0IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZzsKKy8qKgorICogUmVwcmVzZW50YXRpb24gZXJyb3IuPGJyPgorICogVGhlcmUgd2lsbCBiZSBhIHJlcHJlc2VudGF0aW9uIGVycm9yIHdoZW4gYW4gaW1wbGVtZW50YXRpb24KKyAqIGRlZmluZWQgbGltaXQgaGFzIGJlZW4gYnJlYWNoZWQuCisgKgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBSZXByZXNlbnRhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEJ1aWx0aW5FeGNlcHRpb24geworICAgIC8qKiBBIGZ1bmN0b3Igc3ltYm9sIG9mIDxjb2RlPnJlcHJlc2VudGF0aW9uX2Vycm9yLzM8L2NvZGU+LiAqLworICAgIHB1YmxpYyBzdGF0aWMgU3ltYm9sVGVybSBSRVBSRVNFTlRBVElPTl9FUlJPUiA9IFN5bWJvbFRlcm0ubWFrZVN5bWJvbCgicmVwcmVzZW50YXRpb25fZXJyb3IiLCAzKTsKKworICAgIC8qCisgICAgICBmbGFnIDo6PSBjaGFyYWN0ZXIgfCBjaGFyYWN0ZXJfY29kZSB8IGluX2NoYXJhY3Rlcl9jb2RlIHwgCisgICAgICAgICAgICAgICBtYXhfYXJpdHkgfCBtYXhfaW50ZWdlciB8IG1pbl9pbnRlZ2VyCisgICAgKi8KKyAgICAvKiogSG9sZHMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZmxhZy4gKi8KKyAgICBwdWJsaWMgU3RyaW5nIGZsYWc7CisKKyAgICAvKiogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5SZXByZXNlbnRhdGlvbkV4Y2VwdGlvbjwvY29kZT4gd2l0aCBhIGZsYWcuICovCisgICAgcHVibGljIFJlcHJlc2VudGF0aW9uRXhjZXB0aW9uKFN0cmluZyBfZmxhZykgeworCWZsYWcgICAgPSBfZmxhZzsKKyAgICB9CisKKyAgICAvKiogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5SZXByZXNlbnRhdGlvbkV4Y2VwdGlvbjwvY29kZT4gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiAqLworICAgIHB1YmxpYyBSZXByZXNlbnRhdGlvbkV4Y2VwdGlvbihQcmVkaWNhdGUgX2dvYWwsIGludCBfYXJnTm8sIFN0cmluZyBfZmxhZykgeworCXRoaXMuZ29hbCAgICA9IF9nb2FsOworCXRoaXMuYXJnTm8gICA9IF9hcmdObzsKKwlmbGFnICAgID0gX2ZsYWc7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgYSB0ZXJtIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgPGNvZGU+UmVwcmVzZW50YXRpb25FeGNlcHRpb248L2NvZGU+OgorICAgICAqIDxjb2RlPnJlcHJlc2VudGF0aW9uX2Vycm9yKGdvYWwsYXJnTm8sZmxhZyk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBUZXJtIGdldE1lc3NhZ2VUZXJtKCkgeworCVRlcm1bXSBhcmdzID0geworCSAgICBuZXcgSmF2YU9iamVjdFRlcm0oZ29hbCksIAorCSAgICBuZXcgSW50ZWdlclRlcm0oYXJnTm8pLCAKKwkgICAgU3ltYm9sVGVybS5tYWtlU3ltYm9sKGZsYWcpfTsKKwlyZXR1cm4gbmV3IFN0cnVjdHVyZVRlcm0oUkVQUkVTRU5UQVRJT05fRVJST1IsIGFyZ3MpOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgPGNvZGU+UmVwcmVzZW50YXRpb25FeGNlcHRpb248L2NvZGU+LiAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJU3RyaW5nIHMgPSAie1JFUFJFU0VOVEFUSU9OIEVSUk9SOiAiICsgZ29hbC50b1N0cmluZygpOworCWlmIChhcmdObyA+IDApCisJICAgIHMgKz0gIiAtIGFyZyAiICsgYXJnTm87CisJcyArPSAiOiBsaW1pdCBvZiAiICsgZmxhZyArICAiIGlzIGJyZWFjaGVkIjsKKwlzICs9ICJ9IjsKKwlyZXR1cm4gczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbGFuZy9TdHJ1Y3R1cmVUZXJtLmphdmEgYi9zcmMvbGFuZy9TdHJ1Y3R1cmVUZXJtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0NWEwNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sYW5nL1N0cnVjdHVyZVRlcm0uamF2YQpAQCAtMCwwICsxLDIxOSBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmc7CisvKioKKyAqIENvbXBvdW5kIHRlcm0uIDxicj4KKyAqIFRoZSA8Y29kZT5TdHJ1Y3R1cmVUZXJtPC9jb2RlPiBjbGFzcyByZXByZXNlbnRzIGEgY29tcG91bmQgdGVybSBidXQgbGlzdC48YnI+CisgKgorICogPHByZT4KKyAqICAlIGZhdGhlcihhYnJhaGFtLCBYKQorICogIFRlcm0gYTEgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woImFicmFoYW0iKTsKKyAqICBUZXJtIGEyID0gbmV3IFZhcmlhYmxlVGVybSgpOworICogIFRlcm1bXSBhMyA9IHthMSwgYTJ9OworICogIFRlcm0gYTQgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woImZhdGhlciIsIDIpOworICogIFRlcm0gIHQgPSBuZXcgU3RydWN0dXJlVGVybShhNCwgYTMpOworICogIAorICogIFRlcm0gZnVuY3RvciA9ICgoU3RydWN0dXJlVGVybSl0KS5mdW5jdG9yKCk7CisgKiAgVGVybVtdICBhcmdzID0gKChTdHJ1Y3R1cmVUZXJtKXQpLmFyZ3MoKTsKKyAqICBpbnQgICAgYXJpdHkgPSAoKFN0cnVjdHVyZVRlcm0pdCkuYXJpdHkoKTsKKyAqIDwvcHJlPgorICoKKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgU3RydWN0dXJlVGVybSBleHRlbmRzIFRlcm0geworICAgIC8qKiBIb2xkcyB0aGUgZnVuY3RvciBzeW1ib2wgb2YgdGhpcyA8Y29kZT5TdHJ1Y3R1cmVUZXJtPC9jb2RlPi4gKi8KKyAgICBwcm90ZWN0ZWQgU3ltYm9sVGVybSBmdW5jdG9yOworCisgICAgLyoqIEhvbGRzIHRoZSBhcmd1bWVudCB0ZXJtcyBvZiB0aGlzIDxjb2RlPlN0cnVjdHVyZVRlcm08L2NvZGU+LiAqLworICAgIHByb3RlY3RlZCBUZXJtW10gYXJnczsKKworICAgIC8qKiBIb2xkcyB0aGUgYXJpdHkgb2YgdGhpcyA8Y29kZT5TdHJ1Y3R1cmVUZXJtPC9jb2RlPi4gKi8KKyAgICBwcm90ZWN0ZWQgaW50IGFyaXR5OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBQcm9sb2cgY29tcG91bmQgdGVybQorICAgICAqIHN1Y2ggdGhhdCA8Y29kZT5fZnVuY3RvcjwvY29kZT4gaXMgdGhlIGZ1bmN0b3Igc3ltYm9sLCBhbmQgCisgICAgICogPGNvZGU+X2FyZ3M8L2NvZGU+IGlzIHRoZSBhcmd1bWVudCB0ZXJtcyByZXNwZWN0aXZlbHkuCisgICAgICovCisgICAgcHVibGljIFN0cnVjdHVyZVRlcm0oU3ltYm9sVGVybSBfZnVuY3RvciwgVGVybVtdIF9hcmdzKXsKKwlmdW5jdG9yID0gX2Z1bmN0b3I7CisJYXJpdHkgPSBmdW5jdG9yLmFyaXR5KCk7CisJYXJncyA9IF9hcmdzOworCWlmIChhcml0eSAhPSBhcmdzLmxlbmd0aCkKKwkgICAgdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCJJbnZhbGlkIGFyZ3VtZW50IGxlbmd0aCBpbiBTdHJ1Y3R1cmVUZXJtIik7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdGhlIGZ1bmN0b3Igc3ltYm9sIG9mIHRoaXMgPGNvZGU+U3RydWN0dXJlVGVybTwvY29kZT4uCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgPGNvZGU+ZnVuY3RvcjwvY29kZT4uCisgICAgICogQHNlZSAjZnVuY3RvcgorICAgICAqLworICAgIHB1YmxpYyBTeW1ib2xUZXJtIGZ1bmN0b3IoKXsgcmV0dXJuIGZ1bmN0b3I7IH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSBhcml0eSBvZiB0aGlzIDxjb2RlPlN0cnVjdHVyZVRlcm08L2NvZGU+LgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIDxjb2RlPmFyaXR5PC9jb2RlPi4KKyAgICAgKiBAc2VlICNhcml0eQorICAgICAqLworICAgIHB1YmxpYyBpbnQgYXJpdHkoKXsgcmV0dXJuIGFyaXR5OyB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgYXJndW1lbnQgdGVybXMgb2YgdGhpcyA8Y29kZT5TdHJ1Y3R1cmVUZXJtPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiA8Y29kZT5hcmdzPC9jb2RlPi4KKyAgICAgKiBAc2VlICNhcmdzCisgICAgICovCisgICAgcHVibGljIFRlcm1bXSBhcmdzKCl7IHJldHVybiBhcmdzOyB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGZ1bmN0b3Igc3ltYm9sIG9mIHRoaXMgPGNvZGU+U3RydWN0dXJlVGVybTwvY29kZT4uCisgICAgICogQHJldHVybiBhIDxjb2RlPlN0cmluZzwvY29kZT4gd2hvc2UgdmFsdWUgaXMgPGNvZGU+ZnVuY3Rvci5uYW1lKCk8L2NvZGU+LgorICAgICAqIEBzZWUgI2Z1bmN0b3IKKyAgICAgKiBAc2VlIFN5bWJvbFRlcm0jbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpeyByZXR1cm4gZnVuY3Rvci5uYW1lKCk7IH0KKworICAgIC8qIFRlcm0KKyAgICBwdWJsaWMgYm9vbGVhbiB1bmlmeShUZXJtIHQsIFRyYWlsIHRyYWlsKSB7CisJaWYgKHQuaXNWYXJpYWJsZSgpKQorCSAgICByZXR1cm4gdC51bmlmeSh0aGlzLCB0cmFpbCk7CisJaWYgKCEgdC5pc1N0cnVjdHVyZSgpKQorCSAgICByZXR1cm4gZmFsc2U7CisJaWYgKCEgZnVuY3Rvci5lcXVhbHMoKChTdHJ1Y3R1cmVUZXJtKXQpLmZ1bmN0b3IoKSkpCisJICAgIHJldHVybiBmYWxzZTsKKwlmb3IgKGludCBpPTA7IGk8YXJpdHk7IGkrKykgeworCSAgICBpZiAoISBhcmdzW2ldLnVuaWZ5KCgoU3RydWN0dXJlVGVybSl0KS5hcmdzW2ldLCB0cmFpbCkpCisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7CisgICAgfSAqLworCisKKyAgICBwdWJsaWMgYm9vbGVhbiB1bmlmeShUZXJtIHQsIFRyYWlsIHRyYWlsKSB7CisJdCA9IHQuZGVyZWZlcmVuY2UoKTsKKwlpZiAodC5pc1ZhcmlhYmxlKCkpIHsKKwkgICAgKChWYXJpYWJsZVRlcm0pIHQpLmJpbmQodGhpcywgdHJhaWwpOworCSAgICByZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKCEgdC5pc1N0cnVjdHVyZSgpKQorCSAgICByZXR1cm4gZmFsc2U7CisJaWYgKCEgZnVuY3Rvci5lcXVhbHMoKChTdHJ1Y3R1cmVUZXJtKXQpLmZ1bmN0b3IoKSkpCisJICAgIHJldHVybiBmYWxzZTsKKwlmb3IgKGludCBpPTA7IGk8YXJpdHk7IGkrKykgeworCSAgICBpZiAoISBhcmdzW2ldLnVuaWZ5KCgoU3RydWN0dXJlVGVybSl0KS5hcmdzW2ldLCB0cmFpbCkpCisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gICAgcHVibGljIGJvb2xlYW4gdW5pZnkoVGVybSB0LCBUcmFpbCB0cmFpbCkgeworICAgIC8vCXJldHVybiB0cmFpbC5lbmdpbmUudW5pZnkodGhpcywgdCk7CisgICAgLy8gICAgfQorCisKKyAgICBwcm90ZWN0ZWQgVGVybSBjb3B5KFByb2xvZyBlbmdpbmUpIHsKKwlUZXJtW10gYSA9IG5ldyBUZXJtW2FyaXR5XTsKKwlmb3IgKGludCBpPTA7IGk8YXJpdHk7IGkrKykKKwkgICAgYVtpXSA9IGFyZ3NbaV0uY29weShlbmdpbmUpOworCXJldHVybiBuZXcgU3RydWN0dXJlVGVybShmdW5jdG9yLCBhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0dyb3VuZCgpIHsKKwlmb3IgKGludCBpPTA7IGk8YXJpdHk7IGkrKykgeworCSAgICBpZiAoISBhcmdzW2ldLmlzR3JvdW5kKCkpCisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1F1b3RlZFN0cmluZygpIHsKKwlTdHJpbmcgZGVsaW0gPSAiIjsKKwlTdHJpbmcgcyA9IGZ1bmN0b3IudG9RdW90ZWRTdHJpbmcoKSArICIoIjsKKwlmb3IgKGludCBpPTA7IGk8YXJpdHk7IGkrKykgeworCSAgICBzICs9IGRlbGltICsgYXJnc1tpXS50b1F1b3RlZFN0cmluZygpOworCSAgICBkZWxpbSA9ICIsIjsKKwl9CisJcyArPSAiKSI7CisJcmV0dXJuIHM7CisgICAgfQorCisgICAgLyogT2JqZWN0ICovCisgICAgLyoqCisgICAgICogQ2hlY2tzIDxlbT50ZXJtIGVxdWFsaXR5PC9lbT4gb2YgdHdvIHRlcm1zLgorICAgICAqIFRoZSByZXN1bHQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW5kIG9ubHkgaWYgdGhlIGFyZ3VtZW50IGlzIGFuIGluc3RhbmNlIG9mCisgICAgICogPGNvZGU+U3RydWN0dXJlVGVybTwvY29kZT4sIGhhcyB0aGUgc2FtZSBmdW5jdG9yIHN5bWJvbCBhbmQgYXJpdHksIGFuZAorICAgICAqIGFsbCBjb3JyZXNwb25kaW5nIHBhaXJzIG9mIGFyZ3VtZW50cyBpbiB0aGUgdHdvIGNvbXBvdW5kIHRlcm1zIGFyZSA8ZW0+dGVybS1lcXVhbDwvZW0+LgorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGguIFRoaXMgbXVzdCBiZSBkZXJlZmVyZW5jZWQuCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gb2JqZWN0IHJlcHJlc2VudHMgYSBQcm9sb2cgY29tcG91bmQgdGVybQorICAgICAqIGVxdWl2YWxlbnQgdG8gdGhpcyA8Y29kZT5TdHJ1Y3R1cmVUZXJtPC9jb2RlPiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBzZWUgI2NvbXBhcmVUbworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJaWYgKCEgKG9iaiBpbnN0YW5jZW9mIFN0cnVjdHVyZVRlcm0pKQorCSAgICByZXR1cm4gZmFsc2U7CisJaWYgKCEgZnVuY3Rvci5lcXVhbHMoKChTdHJ1Y3R1cmVUZXJtKW9iaikuZnVuY3RvcigpKSkKKwkgICAgcmV0dXJuIGZhbHNlOworCWZvciAoaW50IGk9MDsgaTxhcml0eTsgaSsrKSB7CisJICAgIGlmICghIGFyZ3NbaV0uZXF1YWxzKCgoU3RydWN0dXJlVGVybSlvYmopLmFyZ3NbaV0uZGVyZWZlcmVuY2UoKSkpCisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwlpbnQgaCA9IDE7CisJaCA9IDMxKmggKyBmdW5jdG9yLmhhc2hDb2RlKCk7CisJZm9yKGludCBpPTA7IGk8YXJpdHk7IGkrKykKKwkgICAgaCA9IDMxKmggKyBhcmdzW2ldLmRlcmVmZXJlbmNlKCkuaGFzaENvZGUoKTsKKwlyZXR1cm4gaDsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPlN0cnVjdHVyZVRlcm08L2NvZGU+LiAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJU3RyaW5nIGRlbGltID0gIiI7CisJU3RyaW5nIHMgPSBmdW5jdG9yLnRvU3RyaW5nKCkgKyAiKCI7CisJZm9yIChpbnQgaT0wOyBpPGFyaXR5OyBpKyspIHsKKwkgICAgcyArPSBkZWxpbSArIGFyZ3NbaV0udG9TdHJpbmcoKTsKKwkgICAgZGVsaW0gPSAiLCI7CisJfQorCXMgKz0gIikiOworCXJldHVybiBzOworICAgIH0KKworICAgIC8qIENvbXBhcmFibGUgKi8KKyAgICAvKiogCisgICAgICogQ29tcGFyZXMgdHdvIHRlcm1zIGluIDxlbT5Qcm9sb2cgc3RhbmRhcmQgb3JkZXIgb2YgdGVybXM8L2VtPi48YnI+CisgICAgICogSXQgaXMgbm90ZWQgdGhhdCA8Y29kZT50MS5jb21wYXJlVG8odDIpID09IDA8L2NvZGU+IGhhcyB0aGUgc2FtZQorICAgICAqIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGFzIDxjb2RlPnQxLmVxdWFscyh0Mik8L2NvZGU+LgorICAgICAqIEBwYXJhbSBhbm90aGVyVGVybSB0aGUgdGVybSB0byBjb21wYXJlZCB3aXRoLiBJdCBtdXN0IGJlIGRlcmVmZXJlbmNlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSA8Y29kZT4wPC9jb2RlPiBpZiB0d28gdGVybXMgYXJlIGlkZW50aWNhbDsgCisgICAgICogYSB2YWx1ZSBsZXNzIHRoYW4gPGNvZGU+MDwvY29kZT4gaWYgdGhpcyB0ZXJtIGlzIDxlbT5iZWZvcmU8L2VtPiB0aGUgPGNvZGU+YW5vdGhlclRlcm08L2NvZGU+OworICAgICAqIGFuZCBhIHZhbHVlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiBpZiB0aGlzIHRlcm0gaXMgPGVtPmFmdGVyPC9lbT4gdGhlIDxjb2RlPmFub3RoZXJUZXJtPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhUZXJtIGFub3RoZXJUZXJtKSB7IC8vIGFub3RoZXJUZXJtIG11c3QgYmUgZGVyZWZlcmVuY2VkLgorCVN5bWJvbFRlcm0gZnVuY3RvcjI7CisJVGVybVtdIGFyZ3MyOworCWludCBhcml0eTIsIHJjOworCisJaWYgKGFub3RoZXJUZXJtLmlzVmFyaWFibGUoKSB8fCBhbm90aGVyVGVybS5pc051bWJlcigpIHx8IGFub3RoZXJUZXJtLmlzU3ltYm9sKCkpCisJICAgIHJldHVybiBBRlRFUjsKKwlpZiAoYW5vdGhlclRlcm0uaXNMaXN0KCkpIHsKKwkgICAgZnVuY3RvcjIgPSBMaXN0VGVybS5TWU1fRE9UOworCSAgICBhcmdzMiAgICA9IG5ldyBUZXJtWzJdOworCSAgICBhcmdzMlswXSA9ICgoTGlzdFRlcm0pYW5vdGhlclRlcm0pLmNhcigpOworCSAgICBhcmdzMlsxXSA9ICgoTGlzdFRlcm0pYW5vdGhlclRlcm0pLmNkcigpOworCSAgICBhcml0eTIgICA9IDI7CisJfSBlbHNlIGlmIChhbm90aGVyVGVybS5pc1N0cnVjdHVyZSgpKSB7CisJICAgIGZ1bmN0b3IyID0gKChTdHJ1Y3R1cmVUZXJtKWFub3RoZXJUZXJtKS5mdW5jdG9yKCk7CisJICAgIGFyZ3MyICAgID0gKChTdHJ1Y3R1cmVUZXJtKWFub3RoZXJUZXJtKS5hcmdzKCk7CisJICAgIGFyaXR5MiAgID0gKChTdHJ1Y3R1cmVUZXJtKWFub3RoZXJUZXJtKS5hcml0eSgpOworCX0gZWxzZSB7CisJICAgIHJldHVybiBCRUZPUkU7CisJfQorCWlmIChhcml0eSAhPSBhcml0eTIpCisJICAgIHJldHVybiAoYXJpdHkgLSBhcml0eTIpOworCWlmICghIGZ1bmN0b3IuZXF1YWxzKGZ1bmN0b3IyKSkKKwkgICAgcmV0dXJuIGZ1bmN0b3IuY29tcGFyZVRvKGZ1bmN0b3IyKTsKKwlmb3IgKGludCBpPTA7IGk8YXJpdHk7IGkrKykgeworCSAgICByYyA9IGFyZ3NbaV0uY29tcGFyZVRvKGFyZ3MyW2ldLmRlcmVmZXJlbmNlKCkpOworCSAgICBpZiAocmMgIT0gRVFVQUwpIAorCQlyZXR1cm4gcmM7CisJfQorCXJldHVybiBFUVVBTDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbGFuZy9TdWNjZXNzLmphdmEgYi9zcmMvbGFuZy9TdWNjZXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzODVjYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sYW5nL1N1Y2Nlc3MuamF2YQpAQCAtMCwwICsxLDQwIEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZzsKKy8qKgorICogSW5pdGlhbCBjb250aW51YXRpb24gZ29hbC48YnI+CisgKiBUaGF0IGlzIHRvIHNheSwgdGhpcyA8Y29kZT5TdWNjZXNzPC9jb2RlPiB3aWxsIGJlIGV4ZWN1dGVkIAorICogZXZlcnkgdGltZSB0aGUgUHJvbG9nIENhZmUgc3lzdGVtIGZpbmRzIGFuIGFuc3dlci4KKyAqCisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIFN1Y2Nlc3MgZXh0ZW5kcyBQcmVkaWNhdGUgeworICAgIC8qKiBQcm9sb2cgdGhyZWFkIHRoYXQgdGhpcyA8Y29kZT5TdWNjZXNzPC9jb2RlPiBiZWxvbmdzIHRvLiAqLworICAgIHB1YmxpYyBQcm9sb2dDb250cm9sIGM7CisKKyAgICAvKiogQ29uc3RydWN0cyBhIG5ldyBpbml0aWFsIGNvbnRpbnVhdGlvbiBnb2FsLiAqLworICAgIHB1YmxpYyBTdWNjZXNzKCl7fQorCisgICAgLyoqIENvbnN0cnVjdHMgYSBuZXcgaW5pdGlhbCBjb250aW51YXRpb24gZ29hbCB3aXRoIGdpdmVuIFByb2xvZyB0aHJlYWQuICovCisgICAgcHVibGljIFN1Y2Nlc3MoUHJvbG9nQ29udHJvbCBjKSB7CisJdGhpcy5jID0gYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYWNrdHJhY2tzIGFuZCByZXR1cm5zIGEgbmV4dCBjbGF1c2UKKyAgICAgKiBhZnRlciBpbnZva2luZyB0aGUgPGNvZGU+UHJvbG9nQ29udHJvbC5zdWNjZXNzKCk8L2NvZGU+LgorICAgICAqIEBwYXJhbSBlbmdpbmUgUHJvbG9nIGVuZ2luZQorICAgICAqIEBzZWUgUHJvbG9nQ29udHJvbCNzdWNjZXNzCisgICAgICovCisgICAgcHVibGljIFByZWRpY2F0ZSBleGVjKFByb2xvZyBlbmdpbmUpIHsKKwljLnN1Y2Nlc3MoKTsKKwlyZXR1cm4gZW5naW5lLmZhaWwoKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPlN1Y2Nlc3M8L2NvZGU+LiAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsgcmV0dXJuICJTdWNjZXNzIjsgfQorCisgICAgLyoqIFJldHVybnMgPGNvZGU+MDwvY29kZT4uICovCisgICAgcHVibGljIGludCBhcml0eSgpIHsgcmV0dXJuIDA7IH0KK30KKwpkaWZmIC0tZ2l0IGEvc3JjL2xhbmcvU3ltYm9sVGVybS5qYXZhIGIvc3JjL2xhbmcvU3ltYm9sVGVybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZmQ4ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGFuZy9TeW1ib2xUZXJtLmphdmEKQEAgLTAsMCArMSwxMjEgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisvKioKKyAqIEF0b20uPGJyPgorICogVGhlIDxjb2RlPlN5bWJvbFRlcm08L2NvZGU+IGNsYXNzIHJlcHJlc2VudHMgYSBQcm9sb2cgYXRvbS48YnI+CisgKgorICogPHByZT4KKyAqICAgVGVybSB0ID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJrb2JlIik7CisgKiAgIFN0cmluZyBuYW1lID0gKChTeW1ib2xUZXJtKXQpLm5hbWUoKTsKKyAqIDwvcHJlPgorICoKKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgU3ltYm9sVGVybSBleHRlbmRzIFRlcm0geworCisgICAgLyoqIFN5bWJvbCB0YWJsZS4gKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIEhhc2h0YWJsZTxTdHJpbmcsU3ltYm9sVGVybT4gU1lNQk9MX1RBQkxFID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsU3ltYm9sVGVybT4oKTsKKworICAgIC8qKiBIb2xkcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPlN5bWJvbFRlcm08L2NvZGU+LiAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKKworICAgIC8qKiBIb2xkcyB0aGUgYXJpdHkgb2YgdGhpcyA8Y29kZT5TeW1ib2xUZXJtPC9jb2RlPi4gKi8KKyAgICBwcm90ZWN0ZWQgaW50IGFyaXR5OworCisgICAgLyoqIFJldHVybnMgYSBQcm9sb2cgYXRvbSBmb3IgdGhlIGdpdmVuIG5hbWUuICovCisgICAgcHVibGljIHN0YXRpYyBTeW1ib2xUZXJtIG1ha2VTeW1ib2woU3RyaW5nIF9uYW1lKSB7CisJcmV0dXJuIG1ha2VTeW1ib2woX25hbWUsIDApOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIGEgUHJvbG9nIGZ1bmN0b3IgZm9yIHRoZSBnaXZlbiBuYW1lIGFuZCBhcml0eS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFRlcm0gbWFrZVN5bWJvbChTdHJpbmcgX25hbWUsIGludCBfYXJpdHkpIHsKKwlTdHJpbmcga2V5ID0gX25hbWUgKyAiLyIgKyBfYXJpdHk7CisJU3ltYm9sVGVybSBzeW07CisKKwlzeW5jaHJvbml6ZWQgKFNZTUJPTF9UQUJMRSkgeworCSAgICBzeW0gPSBTWU1CT0xfVEFCTEUuZ2V0KGtleSk7CisJICAgIGlmIChzeW0gPT0gbnVsbCkgeworCQlzeW0gPSBuZXcgU3ltYm9sVGVybShfbmFtZSwgX2FyaXR5KTsKKwkJU1lNQk9MX1RBQkxFLnB1dChrZXksIHN5bSk7CisJICAgIH0KKwl9CisJcmV0dXJuIHN5bTsKKyAgICB9CisKKyAgICAvKiogQ29uc3RydWN0cyBhIG5ldyBQcm9sb2cgYXRvbSAob3IgZnVuY3Rvcikgd2l0aCB0aGUgZ2l2ZW4gc3ltYm9sIG5hbWUgYW5kIGFyaXR5LiAqLworICAgIHByb3RlY3RlZCBTeW1ib2xUZXJtKFN0cmluZyBfbmFtZSwgaW50IF9hcml0eSkgeyAKKwluYW1lICA9IF9uYW1lOyAKKwlhcml0eSA9IF9hcml0eTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgYXJpdHkgb2YgdGhpcyA8Y29kZT5TeW1ib2xUZXJtPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiA8Y29kZT5hcml0eTwvY29kZT4uCisgICAgICogQHNlZSAjYXJpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGFyaXR5KCkgeyByZXR1cm4gYXJpdHk7IH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyA8Y29kZT5TeW1ib2xUZXJtPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiA8Y29kZT5uYW1lPC9jb2RlPi4KKyAgICAgKiBAc2VlICNuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBuYW1lKCkgeyByZXR1cm4gbmFtZTsgfQorCisgICAgLyogVGVybSAqLworICAgIHB1YmxpYyBib29sZWFuIHVuaWZ5KFRlcm0gdCwgVHJhaWwgdHJhaWwpIHsKKwl0ID0gdC5kZXJlZmVyZW5jZSgpOworCWlmICh0LmlzVmFyaWFibGUoKSkgeworCSAgICAoKFZhcmlhYmxlVGVybSkgdCkuYmluZCh0aGlzLCB0cmFpbCk7CisJICAgIHJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gdGhpcyA9PSB0OworCS8vCXJldHVybiBuYW1lLmVxdWFscygoKFN5bWJvbFRlcm0pdCkubmFtZSgpKTsKKyAgICB9CisKKyAgICAvKiogCisgICAgICogQHJldHVybiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gd2hvc2UgdmFsdWUgaXMKKyAgICAgKiA8Y29kZT5jb252ZXJ0aWJsZShTdHJpbmcuY2xhc3MsIHR5cGUpPC9jb2RlPi4KKyAgICAgKiBAc2VlIFRlcm0jY29udmVydGlibGUoQ2xhc3MsIENsYXNzKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnZlcnRpYmxlKENsYXNzIHR5cGUpIHsgcmV0dXJuIGNvbnZlcnRpYmxlKFN0cmluZy5jbGFzcywgdHlwZSk7IH0KKworICAgIC8qKiAKKyAgICAgKiBSZXR1cm5zIGEgPGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT4gY29ycmVzcG9uZHMgdG8gdGhpcyA8Y29kZT5TeW1ib2xUZXJtPC9jb2RlPgorICAgICAqIGFjY29yZGluZyB0byA8ZW0+UHJvbG9nIENhZmUgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIEphdmE8L2VtPi4KKyAgICAgKiBAcmV0dXJuIGEgPGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT4gb2JqZWN0IGVxdWl2YWxlbnQgdG8KKyAgICAgKiB0aGlzIDxjb2RlPlN5bWJvbFRlcm08L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgdG9KYXZhKCkgeyByZXR1cm4gbmFtZTsgfQorCisgICAgcHVibGljIFN0cmluZyB0b1F1b3RlZFN0cmluZygpIHsgcmV0dXJuIFRva2VuLnRvUXVvdGVkU3RyaW5nKG5hbWUpOyB9CisKKyAgICAvKiogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPlN5bWJvbFRlcm08L2NvZGU+LiAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiBuYW1lOyB9CisKKyAgICAvKiBDb21wYXJhYmxlICovCisgICAgLyoqIAorICAgICAqIENvbXBhcmVzIHR3byB0ZXJtcyBpbiA8ZW0+UHJvbG9nIHN0YW5kYXJkIG9yZGVyIG9mIHRlcm1zPC9lbT4uPGJyPgorICAgICAqIEl0IGlzIG5vdGVkIHRoYXQgPGNvZGU+dDEuY29tcGFyZVRvKHQyKSA9PSAwPC9jb2RlPiBoYXMgdGhlIHNhbWUKKyAgICAgKiA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBhcyA8Y29kZT50MS5lcXVhbHModDIpPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gYW5vdGhlclRlcm0gdGhlIHRlcm0gdG8gY29tcGFyZWQgd2l0aC4gSXQgbXVzdCBiZSBkZXJlZmVyZW5jZWQuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgPGNvZGU+MDwvY29kZT4gaWYgdHdvIHRlcm1zIGFyZSBpZGVudGljYWw7IAorICAgICAqIGEgdmFsdWUgbGVzcyB0aGFuIDxjb2RlPjA8L2NvZGU+IGlmIHRoaXMgdGVybSBpcyA8ZW0+YmVmb3JlPC9lbT4gdGhlIDxjb2RlPmFub3RoZXJUZXJtPC9jb2RlPjsKKyAgICAgKiBhbmQgYSB2YWx1ZSBncmVhdGVyIHRoYW4gPGNvZGU+MDwvY29kZT4gaWYgdGhpcyB0ZXJtIGlzIDxlbT5hZnRlcjwvZW0+IHRoZSA8Y29kZT5hbm90aGVyVGVybTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIGludCBjb21wYXJlVG8oVGVybSBhbm90aGVyVGVybSkgeyAvLyBhbm90aGVyVGVybSBtdXN0IGJlIGRlcmVmZXJlbmNlZC4KKwlpZiAoYW5vdGhlclRlcm0uaXNWYXJpYWJsZSgpIHx8IGFub3RoZXJUZXJtLmlzTnVtYmVyKCkpCisJICAgIHJldHVybiBBRlRFUjsKKwlpZiAoISBhbm90aGVyVGVybS5pc1N5bWJvbCgpKQorCSAgICByZXR1cm4gQkVGT1JFOworCWlmICh0aGlzID09IGFub3RoZXJUZXJtKSAKKwkgICAgcmV0dXJuIEVRVUFMOworCWludCB4ID0gbmFtZS5jb21wYXJlVG8oKChTeW1ib2xUZXJtKWFub3RoZXJUZXJtKS5uYW1lKCkpOworCWlmICh4ICE9IDApCisJICAgIHJldHVybiB4OworCWludCB5ID0gdGhpcy5hcml0eSAtICgoU3ltYm9sVGVybSlhbm90aGVyVGVybSkuYXJpdHkoKTsKKwlpZiAoeSAhPSAwKQorCSAgICByZXR1cm4geTsKKwl0aHJvdyBuZXcgSW50ZXJuYWxFeGNlcHRpb24oIlN5bWJvbFRlcm0gaXMgbm90IHVuaXF1ZSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9sYW5nL1N5bnRheEV4Y2VwdGlvbi5qYXZhIGIvc3JjL2xhbmcvU3ludGF4RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmOWEyZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sYW5nL1N5bnRheEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKK3BhY2thZ2UganAuYWMua29iZV91LmNzLnByb2xvZy5sYW5nOworLyoqCisgKiBTeW50YXggZXJyb3IuPGJyPgorICogVGhlcmUgd2lsbCBiZSBhIHN5bnRheCBlcnJvciB3aGVuIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycworICogd2hpY2ggYXJlIGJlaW5nIGlucHV0IGFzIHJlYWQtdGVybSBkbyBub3QgY29uZm9ybSB0byB0aGUgc3ludGF4LgorICoKKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgU3ludGF4RXhjZXB0aW9uIGV4dGVuZHMgQnVpbHRpbkV4Y2VwdGlvbiB7CisgICAgLyoqIEEgZnVuY3RvciBzeW1ib2wgb2YgPGNvZGU+c3ludGF4X2Vycm9yLzU8L2NvZGU+LiAqLworICAgIHB1YmxpYyBzdGF0aWMgU3ltYm9sVGVybSBTWU5UQVhfRVJST1IgPSBTeW1ib2xUZXJtLm1ha2VTeW1ib2woInN5bnRheF9lcnJvciIsIDUpOworCisgICAgLyoqIEhvbGRzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHZhbGlkIHR5cGUuICovCisgICAgcHVibGljIFN0cmluZyB0eXBlOworCisgICAgLyoqIEhvbGRzIHRoZSBhcmd1bWVudCBvciBvbmUgb2YgaXRzIGNvbXBvbmVudHMgd2hpY2ggY2F1c2VkIHRoZSBlcnJvci4gKi8KKyAgICBwdWJsaWMgVGVybSBjdWxwcml0OworCisgICAgLyoqIEhvbGRzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGRldGFpbCBtZXNzYWdlLiAqLworICAgIHB1YmxpYyBTdHJpbmcgbWVzc2FnZTsKKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPlN5bnRheEV4Y2VwdGlvbjwvY29kZT4gCisgICAgICogd2l0aCBhIHZhbGlkIHR5cGUsIGl0cyBjdWxwcml0LCBhbmQgbWVzc2FnZS4gKi8KKyAgICBwdWJsaWMgU3ludGF4RXhjZXB0aW9uKFN0cmluZyBfdHlwZSwgVGVybSBfY3VscHJpdCwgU3RyaW5nIF9tZXNzYWdlKSB7CisJdHlwZSAgICAgICA9IF90eXBlOworCWN1bHByaXQgICAgPSBfY3VscHJpdDsKKwltZXNzYWdlICAgID0gX21lc3NhZ2U7CisgICAgfQorCisgICAgLyoqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+U3ludGF4RXhjZXB0aW9uPC9jb2RlPiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuICovCisgICAgcHVibGljIFN5bnRheEV4Y2VwdGlvbihQcmVkaWNhdGUgX2dvYWwsIGludCBfYXJnTm8sIFN0cmluZyBfdHlwZSwgVGVybSBfY3VscHJpdCwgU3RyaW5nIF9tZXNzYWdlKSB7CisJdGhpcy5nb2FsICA9IF9nb2FsOworCXRoaXMuYXJnTm8gPSBfYXJnTm87CisJdHlwZSAgICAgICA9IF90eXBlOworCWN1bHByaXQgICAgPSBfY3VscHJpdDsKKwltZXNzYWdlICAgID0gX21lc3NhZ2U7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgYSB0ZXJtIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgPGNvZGU+U3ludGF4RXhjZXB0aW9uPC9jb2RlPjoKKyAgICAgKiA8Y29kZT5zeW50YXhfZXJyb3IoZ29hbCxhcmdObyx0eXBlLGN1bHByaXQsbWVzc2FnZSk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBUZXJtIGdldE1lc3NhZ2VUZXJtKCkgeworCVRlcm1bXSBhcmdzID0geworCSAgICBuZXcgSmF2YU9iamVjdFRlcm0oZ29hbCksIAorCSAgICBuZXcgSW50ZWdlclRlcm0oYXJnTm8pLCAKKwkgICAgU3ltYm9sVGVybS5tYWtlU3ltYm9sKHR5cGUpLAorCSAgICBjdWxwcml0LAorCSAgICBTeW1ib2xUZXJtLm1ha2VTeW1ib2wobWVzc2FnZSkgfTsKKwlyZXR1cm4gbmV3IFN0cnVjdHVyZVRlcm0oU1lOVEFYX0VSUk9SLCBhcmdzKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPlN5bnRheEV4Y2VwdGlvbjwvY29kZT4uICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmcgcyA9ICJ7U1lOVEFYIEVSUk9SOiAiICsgZ29hbC50b1N0cmluZygpOworCWlmIChhcmdObyA+IDApCisJICAgIHMgKz0gIiAtIGFyZyAiICsgYXJnTm87CisJcyArPSAiOiBleHBlY3RlZCAiICsgdHlwZTsKKwlzICs9ICIsIGZvdW5kICIgKyBjdWxwcml0LnRvU3RyaW5nKCk7CisJcyArPSAifSI7CisJcmV0dXJuIHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2xhbmcvU3lzdGVtRXhjZXB0aW9uLmphdmEgYi9zcmMvbGFuZy9TeXN0ZW1FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2E2ZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xhbmcvU3lzdGVtRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzNSBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmc7CisvKioKKyAqIFN5c3RlbSBlcnJvci48YnI+CisgKgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBTeXN0ZW1FeGNlcHRpb24gZXh0ZW5kcyBQcm9sb2dFeGNlcHRpb24geworICAgIC8qKiBBIGZ1bmN0b3Igc3ltYm9sIG9mIDxjb2RlPnN5c3RlbV9lcnJvci8xPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgc3RhdGljIFN5bWJvbFRlcm0gU1lTVEVNX0VSUk9SID0gU3ltYm9sVGVybS5tYWtlU3ltYm9sKCJzeXN0ZW1fZXJyb3IiLCAxKTsKKworICAgIC8qKiBIb2xkcyBhIG1lc3NhZ2UuICovCisgICAgcHVibGljIFN0cmluZyBtZXNzYWdlOworCisgICAgLyoqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+U3lzdGVtRXhjZXB0aW9uPC9jb2RlPiB3aXRoIGEgbWVzc2FnZS4gKi8KKyAgICBwdWJsaWMgU3lzdGVtRXhjZXB0aW9uKFN0cmluZyBfbWVzc2FnZSkgeworCW1lc3NhZ2UgPSBfbWVzc2FnZTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyBhIHRlcm0gcmVwcmVzZW50YXRpb24gb2YgdGhpcyA8Y29kZT5TeXN0ZW1FeGNlcHRpb248L2NvZGU+OgorICAgICAqIDxjb2RlPnN5c3RlbV9lcnJvcihtZXNzYWdlKTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFRlcm0gZ2V0TWVzc2FnZVRlcm0oKSB7CisJVGVybVtdIGFyZ3MgPSB7U3ltYm9sVGVybS5tYWtlU3ltYm9sKG1lc3NhZ2UpfTsKKwlyZXR1cm4gbmV3IFN0cnVjdHVyZVRlcm0oU1lTVEVNX0VSUk9SLCBhcmdzKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPlN5c3RlbUV4Y2VwdGlvbjwvY29kZT4uICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwlTdHJpbmcgcyA9ICJ7U1lTVEVNIEVSUk9SOiAiICsgbWVzc2FnZTsKKwlzICs9ICJ9IjsKKwlyZXR1cm4gczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbGFuZy9UZXJtLmphdmEgYi9zcmMvbGFuZy9UZXJtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE1NmIyZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sYW5nL1Rlcm0uamF2YQpAQCAtMCwwICsxLDIwMCBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmc7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisvKioKKyAqIFRoZSBzdXBlcmNsYXNzIG9mIGNsYXNzZXMgZm9yIHRlcm0gc3RydWN0dXJlcy4KKyAqIFRoZSBzdWJjbGFzc2VzIG9mIDxjb2RlPlRlcm08L2NvZGU+IG11c3Qgb3ZlcnJpZGUKKyAqIHRoZSA8Y29kZT51bmlmeTwvY29kZT4gbWV0aG9kLgorICogCisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRlcm0gaW1wbGVtZW50cyBTZXJpYWxpemFibGUsQ29tcGFyYWJsZTxUZXJtPiB7CisKKyAgICAvKiogSG9sZHMgYW4gaW50ZWdlciB2YWx1ZSA8Y29kZT4wPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBFUVVBTCAgPSAgMDsKKyAgICAvKiogSG9sZHMgYW4gaW50ZWdlciB2YWx1ZSA8Y29kZT4xPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBBRlRFUiAgPSAgMTsKKyAgICAvKiogSG9sZHMgYW4gaW50ZWdlciB2YWx1ZSA8Y29kZT4tMTwvY29kZT4uICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgQkVGT1JFID0gLTE7CisKKyAgICAvKiogCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGFyZ3VtZW50IHRlcm0gaXMgdW5pZmllZCB3aXRoIHRoaXMgb25lLgorICAgICAqIEBwYXJhbSB0IHRoZSB0ZXJtIHRvIGJlIHVuaWZpZWQgd2l0aC4KKyAgICAgKiBAcGFyYW0gdHJhaWwgVHJhaWwgU3RhY2suCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdWNjZWVkcywgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgYm9vbGVhbiB1bmlmeShUZXJtIHQsIFRyYWlsIHRyYWlsKTsKKworICAgIC8qKiAKKyAgICAgKiBDaGVjayB3aGV0aGVyIHRoaXMgdGVybSBpcyBhIGxvZ2ljYWwgdmFyaWFibGUuCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT50aGlzIGluc3RhbmNlb2YgVmFyaWFibGVUZXJtPC9jb2RlPiwgCisgICAgICogb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiBAc2VlIFZhcmlhYmxlVGVybQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVmFyaWFibGUoKSB7IHJldHVybiB0aGlzIGluc3RhbmNlb2YgVmFyaWFibGVUZXJtOyB9CisKKyAgICAvKiogCisgICAgICogQ2hlY2sgd2hldGhlciB0aGlzIHRlcm0gaXMgYW4gaW50ZWdlci4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPnRoaXMgaW5zdGFuY2VvZiBJbnRlZ2VyVGVybTwvY29kZT4sIAorICAgICAqIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICogQHNlZSBJbnRlZ2VyVGVybQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSW50ZWdlcigpIHsgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBJbnRlZ2VyVGVybTsgfQorCisgICAgLyoqIAorICAgICAqIENoZWNrIHdoZXRoZXIgdGhpcyB0ZXJtIGlzIGEgZmxvYXQuCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT50aGlzIGluc3RhbmNlb2YgRG91YmxlVGVybTwvY29kZT4sCisgICAgICogb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiBAc2VlIERvdWJsZVRlcm0KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RvdWJsZSgpIHsgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBEb3VibGVUZXJtOyB9CisKKyAgICAvKiogCisgICAgICogQ2hlY2sgd2hldGhlciB0aGlzIHRlcm0gaXMgYSBudW1iZXIuCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT50aGlzIGluc3RhbmNlb2YgSW50ZWdlclRlcm0gfHwgdGhpcyBpbnN0YW5jZW9mIERvdWJsZVRlcm08L2NvZGU+LCAKKyAgICAgKiBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqIEBzZWUgSW50ZWdlclRlcm0KKyAgICAgKiBAc2VlIERvdWJsZVRlcm0KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc051bWJlcigpIHsgcmV0dXJuICgodGhpcyBpbnN0YW5jZW9mIEludGVnZXJUZXJtKSB8fCAodGhpcyBpbnN0YW5jZW9mIERvdWJsZVRlcm0pKTsgfQorCisgICAgLyoqIAorICAgICAqIENoZWNrIHdoZXRoZXIgdGhpcyB0ZXJtIGlzIGFuIGF0b20uCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT50aGlzIGluc3RhbmNlb2YgU3ltYm9sVGVybTwvY29kZT4sCisgICAgICogb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiBAc2VlIFN5bWJvbFRlcm0KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N5bWJvbCgpIHsgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBTeW1ib2xUZXJtOyB9CisKKyAgICAvKiogQ2hlY2sgd2hldGhlciB0aGlzIHRlcm0gaXMgYW4gZW1wdHkgbGlzdC4gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc05pbCgpIHsgcmV0dXJuIFByb2xvZy5OaWwuZXF1YWxzKHRoaXMpOyB9CisKKyAgICAvKiogCisgICAgICogQ2hlY2sgd2hldGhlciB0aGlzIHRlcm0gaXMgYSBsaXN0IHN0cnVjdHVyZS4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPnRoaXMgaW5zdGFuY2VvZiBMaXN0VGVybTwvY29kZT4sCisgICAgICogb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiBAc2VlIExpc3RUZXJtCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNMaXN0KCkgeyByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIExpc3RUZXJtOyB9CisKKyAgICAvKiogCisgICAgICogQ2hlY2sgd2hldGhlciB0aGlzIHRlcm0gaXMgYSBjb21wb3VuZCB0ZXJtLgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+dGhpcyBpbnN0YW5jZW9mIFN0cnVjdHVyZVRlcm08L2NvZGU+LAorICAgICAqIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICogQHNlZSBTdHJ1Y3R1cmVUZXJtCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTdHJ1Y3R1cmUoKSB7IHJldHVybiB0aGlzIGluc3RhbmNlb2YgU3RydWN0dXJlVGVybTsgfQorCisgICAgLyoqIAorICAgICAqIENoZWNrIHdoZXRoZXIgdGhpcyB0ZXJtIGlzIGEgamF2YSB0ZXJtLgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+dGhpcyBpbnN0YW5jZW9mIEphdmFPYmplY3RUZXJtPC9jb2RlPiwKKyAgICAgKiBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqIEBzZWUgSmF2YU9iamVjdFRlcm0KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0phdmFPYmplY3QoKSB7IHJldHVybiB0aGlzIGluc3RhbmNlb2YgSmF2YU9iamVjdFRlcm07IH0KKworICAgIC8qKiAKKyAgICAgKiBDaGVjayB3aGV0aGVyIHRoaXMgdGVybSBpcyBhIGNsb3N1cmUgdGVybS4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPnRoaXMgaW5zdGFuY2VvZiBDbG9zdXJlVGVybTwvY29kZT4sCisgICAgICogb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiBAc2VlIENsb3N1cmVUZXJtCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDbG9zdXJlKCkgeyByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIENsb3N1cmVUZXJtOyB9CisKKyAgICAvKiogCisgICAgICogQ2hlY2sgd2hldGhlciB0aGlzIG9iamVjdCBpcyBjb252ZXJ0aWJsZSB3aXRoIHRoZSBnaXZlbiBKYXZhIGNsYXNzIHR5cGUuCisgICAgICogQHBhcmFtIHR5cGUgdGhlIEphdmEgY2xhc3MgdHlwZSB0byBjb21wYXJlIHdpdGguCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGNvbnZlcnRpYmxlIHdpdGggCisgICAgICogPGNvZGU+dHlwZTwvY29kZT4uIE90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICogQHNlZSAjY29udmVydGlibGUoQ2xhc3MsIENsYXNzKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnZlcnRpYmxlKENsYXNzIHR5cGUpIHsgcmV0dXJuIGNvbnZlcnRpYmxlKGdldENsYXNzKCksIHR5cGUpOyB9CisKKyAgICAvKiogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBvYmplY3QuICovCisgICAgcHJvdGVjdGVkIFRlcm0gY29weShQcm9sb2cgZW5naW5lKSB7IHJldHVybiB0aGlzOyB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgZGVyZWZlcmVuY2UgdmFsdWUgb2YgdGhpcyB0ZXJtLiAqLworICAgIHB1YmxpYyBUZXJtICAgIGRlcmVmZXJlbmNlKCkgeyByZXR1cm4gdGhpczsgfQorCisgICAgLyoqIAorICAgICAqIENoZWNrIHdoZXRoZXIgdGhpcyB0ZXJtIGlzIGEgZ3JvdW5kIHRlcm0uCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBncm91bmQsIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNHcm91bmQoKSB7IHJldHVybiB0cnVlOyB9CisKKyAgICAvKiogCisgICAgICogUmV0dXJucyBhIEphdmEgb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyB0ZXJtIAorICAgICAqIGlmIGRlZmluZWQgaW4gPGVtPlByb2xvZyBDYWZlIGludGVyb3BlcmFiaWxpdHkgd2l0aCBKYXZhPC9lbT4uCisgICAgICogT3RoZXJ3aXNlLCByZXR1cm5zIDxjb2RlPnRoaXM8L2NvZGU+LgorICAgICAqIEByZXR1cm4gYSBKYXZhIG9iamVjdCBpZiBkZWZpbmVkIGluIDxlbT5Qcm9sb2cgQ2FmZSBpbnRlcm9wZXJhYmlsaXR5IHdpdGggSmF2YTwvZW0+LAorICAgICAqIG90aGVyd2lzZSA8Y29kZT50aGlzPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0ICB0b0phdmEoKSB7IAorCXJldHVybiB0aGlzOworICAgIH0gCisKKyAgICAvKiogUmV0dXJucyBhIHF1b3RlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0ZXJtLiAqLworICAgIHB1YmxpYyBTdHJpbmcgIHRvUXVvdGVkU3RyaW5nKCkgeyByZXR1cm4gdGhpcy50b1N0cmluZygpOyB9CisKKyAgICAvKiogCisgICAgICogQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIHdpZGVuaW5nIGNvbnZlcnNpb24gZnJvbSA8Y29kZT5mcm9tPC9jb2RlPiB0byA8Y29kZT50bzwvY29kZT4uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGNvbnZlcnRpYmxlKENsYXNzIGZyb20sIENsYXNzPD8+IHRvKSB7CisJaWYgKGZyb20gPT0gbnVsbCkKKwkgICAgcmV0dXJuICEgdG8uaXNQcmltaXRpdmUoKTsKKwlpZiAodG8uaXNBc3NpZ25hYmxlRnJvbShmcm9tKSkgeworCSAgICByZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgaWYgKHRvLmlzUHJpbWl0aXZlKCkpIHsKKwkgICAgaWYgKGZyb20uZXF1YWxzKEJvb2xlYW4uY2xhc3MpKSB7CisJCXJldHVybiB0by5lcXVhbHMoQm9vbGVhbi5UWVBFKTsKKwkgICAgfSBlbHNlIGlmIChmcm9tLmVxdWFscyhCeXRlLmNsYXNzKSkgeworCQlyZXR1cm4gdG8uZXF1YWxzKEJ5dGUuVFlQRSkKKwkJICAgIHx8IHRvLmVxdWFscyhTaG9ydC5UWVBFKQorCQkgICAgfHwgdG8uZXF1YWxzKEludGVnZXIuVFlQRSkKKwkJICAgIHx8IHRvLmVxdWFscyhMb25nLlRZUEUpCisJCSAgICB8fCB0by5lcXVhbHMoRmxvYXQuVFlQRSkKKwkJICAgIHx8IHRvLmVxdWFscyhEb3VibGUuVFlQRSk7CisJICAgIH0gZWxzZSBpZiAoZnJvbS5lcXVhbHMoU2hvcnQuY2xhc3MpKSB7CisJCXJldHVybiB0by5lcXVhbHMoU2hvcnQuVFlQRSkKKwkJICAgIHx8IHRvLmVxdWFscyhJbnRlZ2VyLlRZUEUpCisJCSAgICB8fCB0by5lcXVhbHMoTG9uZy5UWVBFKQorCQkgICAgfHwgdG8uZXF1YWxzKEZsb2F0LlRZUEUpCisJCSAgICB8fCB0by5lcXVhbHMoRG91YmxlLlRZUEUpOworCSAgICB9IGVsc2UgaWYgKGZyb20uZXF1YWxzKENoYXJhY3Rlci5jbGFzcykpIHsKKwkJcmV0dXJuIHRvLmVxdWFscyhDaGFyYWN0ZXIuVFlQRSkKKwkJICAgIHx8IHRvLmVxdWFscyhJbnRlZ2VyLlRZUEUpCisJCSAgICB8fCB0by5lcXVhbHMoTG9uZy5UWVBFKQorCQkgICAgfHwgdG8uZXF1YWxzKEZsb2F0LlRZUEUpCisJCSAgICB8fCB0by5lcXVhbHMoRG91YmxlLlRZUEUpOworCSAgICB9IGVsc2UgaWYgKGZyb20uZXF1YWxzKEludGVnZXIuY2xhc3MpKSB7CisJCXJldHVybiB0by5lcXVhbHMoSW50ZWdlci5UWVBFKQorCQkgICAgfHwgdG8uZXF1YWxzKExvbmcuVFlQRSkKKwkJICAgIHx8IHRvLmVxdWFscyhGbG9hdC5UWVBFKQorCQkgICAgfHwgdG8uZXF1YWxzKERvdWJsZS5UWVBFKTsKKwkgICAgfSBlbHNlIGlmIChmcm9tLmVxdWFscyhMb25nLmNsYXNzKSkgeworCQlyZXR1cm4gdG8uZXF1YWxzKExvbmcuVFlQRSkKKwkJICAgIHx8IHRvLmVxdWFscyhGbG9hdC5UWVBFKQorCQkgICAgfHwgdG8uZXF1YWxzKERvdWJsZS5UWVBFKTsKKwkgICAgfSBlbHNlIGlmIChmcm9tLmVxdWFscyhGbG9hdC5jbGFzcykpIHsKKwkJcmV0dXJuIHRvLmVxdWFscyhGbG9hdC5UWVBFKQorCQkgICAgfHwgdG8uZXF1YWxzKERvdWJsZS5UWVBFKTsKKwkgICAgfSBlbHNlIGlmIChmcm9tLmVxdWFscyhEb3VibGUuY2xhc3MpKSB7CisJCXJldHVybiB0by5lcXVhbHMoRG91YmxlLlRZUEUpOworCSAgICB9CisJfQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKiogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgUHJvbG9nIHRlcm0uICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGluc3RhbmNlT2ZUZXJtKE9iamVjdCBvYmopIHsKKwlyZXR1cm4gb2JqIGluc3RhbmNlb2YgVmFyaWFibGVUZXJtIHx8IAorCSAgICBvYmogaW5zdGFuY2VvZiBJbnRlZ2VyVGVybSB8fAorCSAgICBvYmogaW5zdGFuY2VvZiBEb3VibGVUZXJtIHx8CisJICAgIG9iaiBpbnN0YW5jZW9mIFN5bWJvbFRlcm0gfHwKKwkgICAgb2JqIGluc3RhbmNlb2YgTGlzdFRlcm0gfHwKKwkgICAgb2JqIGluc3RhbmNlb2YgU3RydWN0dXJlVGVybSB8fAorCSAgICBvYmogaW5zdGFuY2VvZiBKYXZhT2JqZWN0VGVybSB8fAorCSAgICBvYmogaW5zdGFuY2VvZiBDbG9zdXJlVGVybTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbGFuZy9UZXJtRXhjZXB0aW9uLmphdmEgYi9zcmMvbGFuZy9UZXJtRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4MmVjYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sYW5nL1Rlcm1FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZzsKKy8qKgorICogVXNlci1kZWZpbmVkIGV4Y2VwdGlvbi48YnI+CisgKgorICogVGhpcyA8Y29kZT5UZXJtRXhjZXB0aW9uPC9jb2RlPiBpcyB1c2VkIHRvIGltcGxlbWVudAorICogYnVpbHQtaW4gcHJlZGljYXRlIDxjb2RlPnRocm93LzE8L2NvZGU+LgorICoKKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgVGVybUV4Y2VwdGlvbiBleHRlbmRzIFByb2xvZ0V4Y2VwdGlvbiB7CisgICAgLyoqIE1lc3NhZ2UgYXMgdGVybS4gKi8KKyAgICBUZXJtIG1lc3NhZ2U7CisKKyAgICAvKiogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5UZXJtRXhjZXB0aW9uPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgVGVybUV4Y2VwdGlvbigpe30KKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPlRlcm1FeGNlcHRpb248L2NvZGU+IHdpdGggYSBnaXZlbiBtZXNzYWdlIHRlcm0uICovCisgICAgcHVibGljIFRlcm1FeGNlcHRpb24oVGVybSBfbWVzc2FnZSl7CisJbWVzc2FnZSA9IF9tZXNzYWdlOworICAgIH0KKworICAgIHB1YmxpYyBUZXJtIGdldE1lc3NhZ2VUZXJtKCkgeworCXJldHVybiBtZXNzYWdlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9sYW5nL1Rva2VuLmphdmEgYi9zcmMvbGFuZy9Ub2tlbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMDZkMTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGFuZy9Ub2tlbi5qYXZhCkBAIC0wLDAgKzEsNDQ2IEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZzsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLmlvLio7CisvKioKKyAqIFRoZSA8Y29kZT5Ub2tlbjwvY29kZT4gY2xhc3MgY29udGFpbnMgbWV0aG9kcworICogZm9yIGNoYXJhY3RlciBpbnB1dC9vdXRwdXQuPGJyPgorICogPGZvbnQgY29sb3I9InJlZCI+VGhpcyBkb2N1bWVudCBpcyB1bmRlciBjb25zdHJ1Y3Rpb24uPC9mb250PgorICoKKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMi41CisgKi8KK3B1YmxpYyBjbGFzcyBUb2tlbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTb2xvKGludCBjKSB7CisJcmV0dXJuIChjID09JyEnIHx8IGMgPT0nOycpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N5bWJvbChpbnQgYykgeworCXN3aXRjaCAoYykgeworCWNhc2UgJysnOgorCWNhc2UgJy0nOgorCWNhc2UgJyonOgorCWNhc2UgJy8nOgorCWNhc2UgJ1xcJzoKKwljYXNlICdeJzoKKwljYXNlICc8JzoKKwljYXNlICc+JzoKKwljYXNlICc9JzoKKwljYXNlICdgJzoKKwljYXNlICd+JzoKKwljYXNlICc6JzoKKwljYXNlICcuJzoKKwljYXNlICc/JzoKKwljYXNlICdAJzoKKwljYXNlICcjJzoKKwljYXNlICckJzoKKwljYXNlICcmJzoKKwkgICAgcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICAgcHVibGljIHN0YXRpYyBpbnQgcmVhZF90b2tlbihTdHJpbmdCdWZmZXIgcywgUHVzaGJhY2tSZWFkZXIgaW4pIAorCisgICAgICBUaGlzIG1ldGhvZCByZWFkcyBvbmUgdG9rZW4gZnJvbSB0aGUgaW5wdXQgImluIiwgc2V0cyB0aGUgc3RyaW5nLCAKKyAgICAgIGFuZCByZXR1cm5zIHRoZSB0b2tlbiB0eXBlLgorICAgICAgCisgICAgICBUeXBlCQlTdHJpbmcKKyAgICAgIC0yCQkiZXJyb3IgbWVzc2FnZSIKKyAgICAgIC0xCQkiZW5kX29mX2ZpbGUiCisgICAgICAnLicJCSIuIgkJZnVsbCBzdG9wCisgICAgICAnICcJCSIgIgkJc3BhY2Ugb3IgY29tbWVudCBvciB1bmtub3duIGNoYXJzCisgICAgICAnLCcJCSIsIgorICAgICAgJygnCQkiKCIKKyAgICAgICcpJwkJIikiCisgICAgICAnWycJCSJbIgorICAgICAgJ10nCQkiXSIKKyAgICAgICd7JwkJInsiCisgICAgICAnfScJCSJ9IgorICAgICAgJywnCQkiLCIKKyAgICAgICd8JwkJInwiCisgICAgICAnSScJCSJkZWNpbWFsIglwb3NpdGl2ZSBpbnRlZ2VyCisgICAgICAnRCcJCSJkZWNpbWFsIglwb3NpdGl2ZSBkb3VibGUgCisgICAgICAnQScJCSJhdG9tIG5hbWUiCisgICAgICAnVicJCSJ2YXJpYWJsZSBuYW1lIgorICAgICAgJ1MnCQkic3RyaW5nIgorICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgcmVhZF90b2tlbihTdHJpbmdCdWZmZXIgcywgUHVzaGJhY2tSZWFkZXIgaW4pIAorCXRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwlpbnQgYywgYzE7CisJaW50IHJjOworCisJYyA9IGluLnJlYWQoKTsgLy8gZ2V0IDFzdC4gY2hhcgorCWlmKGMgPT0gLTEpIHsKKwkgICAgcy5hcHBlbmQoImVuZF9vZl9maWxlIik7CisJICAgIHJldHVybiAtMTsKKwl9CisJaWYgKENoYXJhY3Rlci5pc0RpZ2l0KChjaGFyKWMpKSB7CisJICAgIHJjID0gcmVhZF9udW1iZXIoYywgcywgaW4pOworCSAgICBpZiAocmMgPT0gMSkgCisJCXJjID0gJ0knOworCSAgICBlbHNlIGlmIChyYyA9PSAyKSAKKwkJcmMgPSAnRCc7CisJICAgIHJldHVybiByYzsKKwl9CisJaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZSgoY2hhciljKSkgeworCSAgICByYyA9IHJlYWRfd29yZChjLCBzLCBpbik7CisJICAgIGlmIChyYyA+IDApCisJCXJjID0gJ0EnOworCSAgICByZXR1cm4gcmM7CisJfQorCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2UoKGNoYXIpIGMpIHx8IGMgPT0gJ18nKSB7CisJICAgIHJjID0gcmVhZF93b3JkKGMsIHMsIGluKTsKKwkgICAgaWYgKHJjID4gMCkKKwkJcmMgPSAnVic7CisJICAgIHJldHVybiByYzsKKwl9CisJc3dpdGNoIChjKSB7CisJY2FzZSAnKCc6CisJY2FzZSAnKSc6CisJY2FzZSAnWyc6CisJY2FzZSAnXSc6CisJY2FzZSAneyc6CisJY2FzZSAnfSc6CisJY2FzZSAnLCc6CisJY2FzZSAnfCc6CisJICAgIHMuYXBwZW5kKChjaGFyKWMpOworCSAgICByZXR1cm4gYzsKKwljYXNlICcuJzoJCS8qIGZ1bGwgc3RvcCBvciBzeW1ib2wgKi8KKwkgICAgYzEgPSBpbi5yZWFkKCk7CisJICAgIGlmIChjMSA9PSAtMSB8fCBjMSA8PSAnICcpIHsKKwkJcy5hcHBlbmQoIi4iKTsKKwkJcmV0dXJuICcuJzsKKwkgICAgfQorCSAgICBpbi51bnJlYWQoYzEpOworCSAgICBicmVhazsKKwljYXNlICclJzoJCS8qIG9uZSBsaW5lIGNvbW1lbnQgKi8KKwkgICAgcy5hcHBlbmQoIiAiKTsKKwkgICAgd2hpbGUgKChjMSA9IGluLnJlYWQoKSkgIT0gJ1xuJykgeworCQlpZiAoYzEgPT0gLTEpCisJCSAgICByZXR1cm4gJyAnOworCSAgICB9CisJICAgIHJldHVybiAnICc7CisJY2FzZSAnLyc6CQkvKiBzdGFydCBvZiBjb21tZW50IG9yIHN5bWJvbCAqLworCSAgICBpZiAoKGMxID0gaW4ucmVhZCgpKSA9PSAnKicpIHsKKwkJcy5hcHBlbmQoIiAiKTsKKwkJd2hpbGUgKHRydWUpIHsKKwkJICAgIHdoaWxlICgoYzEgPSBpbi5yZWFkKCkpICE9ICcqJykgeworCQkJaWYoYzEgPT0gLTEpIHsKKwkJCSAgICBzLmFwcGVuZCgidW5leHBlY3RlZCBlbmRfb2ZfZmlsZSIpOworCQkJICAgIHJldHVybiAtMjsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGlmICgoYzEgPSBpbi5yZWFkKCkpID09ICcvJykKKwkJCXJldHVybiAnICc7CisJCSAgICBpbi51bnJlYWQoYzEpOworCQl9CisJICAgIH0KKwkgICAgaW4udW5yZWFkKGMxKTsKKwkgICAgYnJlYWs7CisJY2FzZSAnXCcnOgorCSAgICByYyA9IHJlYWRfcXVvdGVkKGMsIHMsIGluKTsKKwkgICAgaWYgKHJjID4gMCkKKwkJcmMgPSAnQSc7CisJICAgIHJldHVybiByYzsKKwljYXNlICciJzoKKwkgICAgcmMgPSByZWFkX3F1b3RlZChjLCBzLCBpbik7CisJICAgIGlmIChyYyA+IDApCisJCXJjID0gJ1MnOworCSAgICByZXR1cm4gcmM7CisJZGVmYXVsdDoKKwkgICAgYnJlYWs7CisJfQorCWlmIChpc1NvbG8oYykpIHsKKwkgICAgcy5hcHBlbmQoKGNoYXIpYyk7CisJICAgIHJldHVybiAnQSc7CisJfQorCWlmIChpc1N5bWJvbChjKSkgeworCSAgICByYyA9IHJlYWRfc3ltYm9sKGMsIHMsIGluKTsKKwkgICAgaWYgKHJjID4gMCkKKwkJcmMgPSAnQSc7CisJICAgIHJldHVybiByYzsKKwl9CisJcy5hcHBlbmQoIiAiKTsKKwlyZXR1cm4gJyAnOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IHJlYWRfbnVtYmVyKGludCBjLCBTdHJpbmdCdWZmZXIgcywgUHVzaGJhY2tSZWFkZXIgaW4pIAorCXRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwlpbnQgYzEsIGMyLCBjMzsKKwlpbi51bnJlYWQoYyk7CisJZm9yICg7OykgeworCSAgICBjMSA9IGluLnJlYWQoKTsKKwkgICAgaWYgKCEgQ2hhcmFjdGVyLmlzRGlnaXQoKGNoYXIpYzEpKQorCQlicmVhazsKKwkgICAgcy5hcHBlbmQoKGNoYXIpIGMxKTsKKwl9CisJaWYgKGMxICE9ICcuJyl7CisJICAgIGluLnVucmVhZChjMSk7CisJICAgIHJldHVybiAxOworCX0KKwljMiA9IGluLnJlYWQoKTsKKwlpZiAoISBDaGFyYWN0ZXIuaXNEaWdpdCgoY2hhciljMikpeworCSAgICBpbi51bnJlYWQoYzIpOworCSAgICBpbi51bnJlYWQoYzEpOworCSAgICByZXR1cm4gMTsKKwl9CisJcy5hcHBlbmQoKGNoYXIpYzEpOworCWluLnVucmVhZChjMik7CisJZm9yICg7OykgeworCSAgICBjMSA9IGluLnJlYWQoKTsKKwkgICAgaWYgKCEgQ2hhcmFjdGVyLmlzRGlnaXQoKGNoYXIpIGMxKSkKKwkJYnJlYWs7CisJICAgIHMuYXBwZW5kKChjaGFyKSBjMSk7CisJfQorCS8vCWluLnVucmVhZChjMSk7CisJLy8JcmV0dXJuIDI7CisJaWYgKGMxICE9ICdFJyAmJiBjMSAhPSAnZScpeworCSAgICBpbi51bnJlYWQoYzEpOworCSAgICByZXR1cm4gMjsKKwl9CisJYzIgPSBpbi5yZWFkKCk7CisJaWYgKGMyID09ICctJyB8fCBjMiA9PSAnKycpIHsKKwkgICAgYzMgPSBpbi5yZWFkKCk7CisJICAgIGlmICghIENoYXJhY3Rlci5pc0RpZ2l0KChjaGFyKWMzKSl7CisJCWluLnVucmVhZChjMyk7CisJCWluLnVucmVhZChjMik7CisJCWluLnVucmVhZChjMSk7CisJCXJldHVybiAyOworCSAgICB9CisJICAgIHMuYXBwZW5kKChjaGFyKWMxKTsKKwkgICAgcy5hcHBlbmQoKGNoYXIpYzIpOworCSAgICBpbi51bnJlYWQoYzMpOworCX0gZWxzZSBpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoKGNoYXIpYzIpKXsKKwkgICAgcy5hcHBlbmQoKGNoYXIpYzEpOworCSAgICBpbi51bnJlYWQoYzIpOworCX0gZWxzZSB7CisJICAgIGluLnVucmVhZChjMik7CisJICAgIGluLnVucmVhZChjMSk7CisJICAgIHJldHVybiAyOworCX0KKwlmb3IgKDs7KSB7CisJICAgIGMxID0gaW4ucmVhZCgpOworCSAgICBpZiAoISBDaGFyYWN0ZXIuaXNEaWdpdCgoY2hhcikgYzEpKQorCQlicmVhazsKKwkgICAgcy5hcHBlbmQoKGNoYXIpIGMxKTsKKwl9CisJaW4udW5yZWFkKGMxKTsKKwlyZXR1cm4gMjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCByZWFkX3dvcmQoaW50IGMsIFN0cmluZ0J1ZmZlciBzLCBQdXNoYmFja1JlYWRlciBpbikKKwl0aHJvd3MgSU9FeGNlcHRpb24geworCWludCBjMTsKKwkKKwlpbi51bnJlYWQoYyk7CisJZm9yICg7OykgeworCSAgICBjMSA9IGluLnJlYWQoKTsKKwkgICAgaWYgKCEgQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdCgoY2hhciljMSkgJiYgYzEgIT0gJ18nKQorCQlicmVhazsKKwkgICAgcy5hcHBlbmQoKGNoYXIpYzEpOworCX0KKwlpbi51bnJlYWQoYzEpOworCXJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IHJlYWRfcXVvdGVkKGludCBxdW90ZSwgU3RyaW5nQnVmZmVyIHMsIFB1c2hiYWNrUmVhZGVyIGluKSAKKwl0aHJvd3MgSU9FeGNlcHRpb24geworCWludCByYzsKKwlpbnQgYzE7CisJCisJZm9yICg7OykgeworCSAgICBjMSA9IGluLnJlYWQoKTsKKwkgICAgaWYgKGMxID09IC0xIHx8IGMxID09ICdcbicpIHsKKwkJaW4udW5yZWFkKGMxKTsKKwkJcmV0dXJuIC0yOworCSAgICB9IGVsc2UgaWYgKGMxID09IHF1b3RlKXsKKwkJYzEgPSBpbi5yZWFkKCk7CisJCWlmIChjMSAhPSBxdW90ZSkgeworCQkgICAgaW4udW5yZWFkKGMxKTsKKwkJICAgIHJldHVybiAxOworCQl9CisJCWMxID0gcXVvdGU7CisJICAgIH0gCisJICAgIGVsc2UgaWYgKGMxID09ICdcXCcpIHsKKwkJcmMgPSBlc2NhcGVTZXF1ZW5jZXMoYzEsIHMsIGluKTsKKwkJaWYgKHJjID4gMCkKKwkJICAgIGNvbnRpbnVlOworCQllbHNlCisJCSAgICByZXR1cm4gLTI7CisJICAgIH0KKwkgICAgcy5hcHBlbmQoKGNoYXIpYzEpOworCX0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBlc2NhcGVTZXF1ZW5jZXMoaW50IGJhY2tzbGFzaCwgU3RyaW5nQnVmZmVyIHMsIFB1c2hiYWNrUmVhZGVyIGluKQkKKwl0aHJvd3MgSU9FeGNlcHRpb24geworCisJaW50IGM7CisJYyA9IGluLnJlYWQoKTsKKwlzd2l0Y2ggKGMpIHsKKwljYXNlICdiJzogLy8gYmFja3NwYWNlCisJICAgIHMuYXBwZW5kKChjaGFyKSA4KTsgYnJlYWs7IAorCWNhc2UgJ3QnOiAvLyBob3Jpem9udGFsIHRhYiAKKwkgICAgcy5hcHBlbmQoKGNoYXIpIDkpOyBicmVhazsKKwljYXNlICduJzogLy8gbmV3bGluZQorCSAgICBzLmFwcGVuZCgoY2hhcikxMCk7IGJyZWFrOworCWNhc2UgJ3YnOiAvLyB2ZXJ0aWNhbCB0YWIKKwkgICAgcy5hcHBlbmQoKGNoYXIpMTEpOyBicmVhazsKKwljYXNlICdmJzogLy8gZm9ybSBmZWVkCisJICAgIHMuYXBwZW5kKChjaGFyKTEyKTsgYnJlYWs7CisJY2FzZSAncic6IC8vIGNhcnJpYWdlIHJldHVybgorCSAgICBzLmFwcGVuZCgoY2hhcikxMyk7IGJyZWFrOworCWNhc2UgJ2UnOiAvLyBlc2NhcGUKKwkgICAgcy5hcHBlbmQoKGNoYXIpMjcpOyBicmVhazsKKwljYXNlICdkJzogIC8vIGRlbGV0ZQorCSAgICBzLmFwcGVuZCgoY2hhcikxMjcpOyBicmVhazsKKwljYXNlICdhJzogLy8gYWxhcm0KKwkgICAgcy5hcHBlbmQoKGNoYXIpNyk7IGJyZWFrOworCWRlZmF1bHQ6CisJICAgIHMuYXBwZW5kKChjaGFyKWMpOyAKKwkgICAgcmV0dXJuIDI7CisJfQorCXJldHVybiAxOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBpbnQgcmVhZF9zeW1ib2woaW50IGMsIFN0cmluZ0J1ZmZlciBzLCBQdXNoYmFja1JlYWRlciBpbikgCisJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlpbnQgYzE7CisJcy5hcHBlbmQoKGNoYXIpYyk7CisJLy8JaW4udW5yZWFkKGMpOyAKKwlmb3IgKDs7KSB7CisJICAgIGMxID0gaW4ucmVhZCgpOworCSAgICBpZiAoISBpc1N5bWJvbChjMSkpCisJCWJyZWFrOworCSAgICBzLmFwcGVuZCgoY2hhciljMSk7CisJfQorCWluLnVucmVhZChjMSk7CisJcmV0dXJuIDE7CisgICAgfQorCisKKyAgICAvKiBXcml0ZSAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZV9zdHJpbmcoU3RyaW5nIHMsIFByaW50V3JpdGVyIG91dCkgeworCW91dC5wcmludChzKTsgCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlcV9zdHJpbmcoU3RyaW5nIHMsIFByaW50V3JpdGVyIG91dCkgeworCWNoYXJbXSBjaDsKKworCWNoID0gcy50b0NoYXJBcnJheSgpOworCWlmICgoZ2V0U3RyaW5nVHlwZShzKSA9PSAzKSl7CisJICAgIG91dC5wcmludCgiXCciKTsKKwkgICAgZm9yIChpbnQgaT0wOyBpPGNoLmxlbmd0aDsgaSsrKSB7CisJCWlmIChjaFtpXSA9PSAnXCcnKQorCQkgICAgb3V0LnByaW50KCJcXFwnIik7CisJCWVsc2UgaWYgKGNoW2ldID09ICdcXCcpCisJCSAgICBvdXQucHJpbnQoIlxcXFwiKTsKKwkJZWxzZSBpZiAoY2hbaV0gPT0gOCkgIC8vIGJhY2tzcGFjZQorCQkgICAgb3V0LnByaW50KCJcXGIiKTsKKwkJZWxzZSBpZiAoY2hbaV0gPT0gOSkgIC8vIGhvcml6b250YWwgdGFiIAorCQkgICAgb3V0LnByaW50KCJcXHQiKTsKKwkJZWxzZSBpZiAoY2hbaV0gPT0gMTApIC8vIG5ld2xpbmUKKwkJICAgIG91dC5wcmludCgiXFxuIik7CisJCWVsc2UgaWYgKGNoW2ldID09IDExKSAvLyB2ZXJ0aWNhbCB0YWIKKwkJICAgIG91dC5wcmludCgiXFx2Iik7CisJCWVsc2UgaWYgKGNoW2ldID09IDEyKSAvLyBmb3JtIGZlZWQKKwkJICAgIG91dC5wcmludCgiXFxmIik7CisJCWVsc2UgaWYgKGNoW2ldID09IDEzKSAvLyBjYXJyaWFnZSByZXR1cm4KKwkJICAgIG91dC5wcmludCgiXFxyIik7CisJCWVsc2UgaWYgKGNoW2ldID09IDI3KSAvLyBlc2NhcGUKKwkJICAgIG91dC5wcmludCgiXFxlIik7CisJCWVsc2UgaWYgKGNoW2ldID09IDEyNykgLy8gZGVsZXRlCisJCSAgICBvdXQucHJpbnQoIlxcZCIpOworCQllbHNlIGlmIChjaFtpXSA9PSA3KSAvLyBhbGFybQorCQkgICAgb3V0LnByaW50KCJcXGEiKTsKKwkJZWxzZSAKKwkJICAgIG91dC5wcmludChjaFtpXSk7CisJICAgIH0KKwkgICAgb3V0LnByaW50KCJcJyIpOworCX0gZWxzZSB7CisJICAgIHdyaXRlX3N0cmluZyhzLCBvdXQpOworCX0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1F1b3RlZFN0cmluZyhTdHJpbmcgcykgeworCVN0cmluZ0J1ZmZlciBxdW90ZWQgPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkgKiAyKTsKKwljaGFyW10gY2g7CisKKwljaCA9IHMudG9DaGFyQXJyYXkoKTsKKwlpZiAoKGdldFN0cmluZ1R5cGUocykgPT0gMykpeworCSAgICBxdW90ZWQuYXBwZW5kKCJcJyIpOworCSAgICBmb3IgKGludCBpPTA7IGk8Y2gubGVuZ3RoOyBpKyspIHsKKwkJaWYgKGNoW2ldID09ICdcJycpCisJCSAgICBxdW90ZWQuYXBwZW5kKCJcXFwnIik7CisJCWVsc2UgaWYgKGNoW2ldID09ICdcXCcpCisJCSAgICBxdW90ZWQuYXBwZW5kKCJcXFxcIik7CisJCWVsc2UgaWYgKGNoW2ldID09IDgpICAvLyBiYWNrc3BhY2UKKwkJICAgIHF1b3RlZC5hcHBlbmQoIlxcYiIpOworCQllbHNlIGlmIChjaFtpXSA9PSA5KSAgLy8gaG9yaXpvbnRhbCB0YWIgCisJCSAgICBxdW90ZWQuYXBwZW5kKCJcXHQiKTsKKwkJZWxzZSBpZiAoY2hbaV0gPT0gMTApIC8vIG5ld2xpbmUKKwkJICAgIHF1b3RlZC5hcHBlbmQoIlxcbiIpOworCQllbHNlIGlmIChjaFtpXSA9PSAxMSkgLy8gdmVydGljYWwgdGFiCisJCSAgICBxdW90ZWQuYXBwZW5kKCJcXHYiKTsKKwkJZWxzZSBpZiAoY2hbaV0gPT0gMTIpIC8vIGZvcm0gZmVlZAorCQkgICAgcXVvdGVkLmFwcGVuZCgiXFxmIik7CisJCWVsc2UgaWYgKGNoW2ldID09IDEzKSAvLyBjYXJyaWFnZSByZXR1cm4KKwkJICAgIHF1b3RlZC5hcHBlbmQoIlxcciIpOworCQllbHNlIGlmIChjaFtpXSA9PSAyNykgLy8gZXNjYXBlCisJCSAgICBxdW90ZWQuYXBwZW5kKCJcXGUiKTsKKwkJZWxzZSBpZiAoY2hbaV0gPT0gMTI3KSAvLyBkZWxldGUKKwkJICAgIHF1b3RlZC5hcHBlbmQoIlxcZCIpOworCQllbHNlIGlmIChjaFtpXSA9PSA3KSAvLyBhbGFybQorCQkgICAgcXVvdGVkLmFwcGVuZCgiXFxhIik7CisJCWVsc2UgCisJCSAgICBxdW90ZWQuYXBwZW5kKGNoW2ldKTsKKwkgICAgfQorCSAgICBxdW90ZWQuYXBwZW5kKCJcJyIpOworCSAgICByZXR1cm4gcXVvdGVkLnRvU3RyaW5nKCk7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIHM7CisJfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiByZXR1cm4gdmFsdWU6CisgICAgICogICAwIDogaWYgc3RyaW5nIGlzIGEgbG93ZXIgY2FzZSBhbHBobnVtCisgICAgICogICAxIDogaWYgc3RyaW5nIGlzIGEgc3ltYm9sCisgICAgICogICAyIDogaWYgc3RyaW5nIGlzIGEgc29sbworICAgICAqICAgMyA6IG90aGVycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN0cmluZ1R5cGUoU3RyaW5nIHMpIHsKKwljaGFyW10gcDsKKworCWlmIChzLmVxdWFscygiW10iKSB8fCBzLmVxdWFscygie30iKSkgCisJICAgIHJldHVybiAwOworCWlmIChzLmVxdWFscygiIikgICB8fCBzLmVxdWFscygiLiIpKQorCSAgICByZXR1cm4gMzsKKwlpZiAocy5lcXVhbHMoIiEiKSAgfHwgcy5lcXVhbHMoIjsiKSkKKwkgICAgcmV0dXJuIDI7CisJcCA9IHMudG9DaGFyQXJyYXkoKTsgLy8gc3RyaW5nIC0tPiBjaGFyc1tdCisJaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShwWzBdKSl7CisJICAgIGZvciAoaW50IGk9MTsgaTxwLmxlbmd0aDsgaSsrKXsKKwkJaWYgKCEgQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChwW2ldKSAmJiAoKGludClwW2ldKSAhPSAnXycpCisJCSAgICByZXR1cm4gMzsKKwkgICAgfQorCSAgICByZXR1cm4gMDsKKwl9CisJaWYgKGlzU3ltYm9sKChpbnQpIHBbMF0pKXsKKwkgICAgZm9yIChpbnQgaT0xOyBpPHAubGVuZ3RoOyBpKyspeworCQlpZiAoISBpc1N5bWJvbCgoaW50KSBwW2ldKSkKKwkJICAgIHJldHVybiAzOworCSAgICB9CisJICAgIHJldHVybiAxOworCX0KKwlyZXR1cm4gMzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbGFuZy9Ub2tlbi5qYXZhLmJhayBiL3NyYy9sYW5nL1Rva2VuLmphdmEuYmFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMGE3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGFuZy9Ub2tlbi5qYXZhLmJhawpAQCAtMCwwICsxLDQxNCBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmc7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS5pby4qOworLyoqCisgKiBUaGUgPGNvZGU+VG9rZW48L2NvZGU+IGNsYXNzIGNvbnRhaW5zIG1ldGhvZHMKKyAqIGZvciBjaGFyYWN0ZXIgaW5wdXQvb3V0cHV0Ljxicj4KKyAqIDxmb250IGNvbG9yPSJyZWQiPlRoaXMgZG9jdW1lbnQgaXMgdW5kZXIgY29uc3RydWN0aW9uLjwvZm9udD4KKyAqCisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjIKKyAqLworcHVibGljIGNsYXNzIFRva2VuIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NvbG8oaW50IGMpIHsKKwlyZXR1cm4gKGMgPT0nIScgfHwgYyA9PSc7Jyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3ltYm9sKGludCBjKSB7CisJc3dpdGNoIChjKSB7CisJY2FzZSAnKyc6CisJY2FzZSAnLSc6CisJY2FzZSAnKic6CisJY2FzZSAnLyc6CisJY2FzZSAnXFwnOgorCWNhc2UgJ14nOgorCWNhc2UgJzwnOgorCWNhc2UgJz4nOgorCWNhc2UgJz0nOgorCWNhc2UgJ2AnOgorCWNhc2UgJ34nOgorCWNhc2UgJzonOgorCWNhc2UgJy4nOgorCWNhc2UgJz8nOgorCWNhc2UgJ0AnOgorCWNhc2UgJyMnOgorCWNhc2UgJyQnOgorCWNhc2UgJyYnOgorCSAgICByZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICBwdWJsaWMgc3RhdGljIGludCByZWFkX3Rva2VuKFN0cmluZ0J1ZmZlciBzLCBQdXNoYmFja1JlYWRlciBpbikgCisKKyAgICAgIFRoaXMgbWV0aG9kIHJlYWRzIG9uZSB0b2tlbiBmcm9tIHRoZSBpbnB1dCAiaW4iLCBzZXRzIHRoZSBzdHJpbmcsIAorICAgICAgYW5kIHJldHVybnMgdGhlIHRva2VuIHR5cGUuCisgICAgICAKKyAgICAgIFR5cGUJCVN0cmluZworICAgICAgLTIJCSJlcnJvciBtZXNzYWdlIgorICAgICAgLTEJCSJlbmRfb2ZfZmlsZSIKKyAgICAgICcuJwkJIi4iCQlmdWxsIHN0b3AKKyAgICAgICcgJwkJIiAiCQlzcGFjZSBvciBjb21tZW50IG9yIHVua25vd24gY2hhcnMKKyAgICAgICcsJwkJIiwiCisgICAgICAnKCcJCSIoIgorICAgICAgJyknCQkiKSIKKyAgICAgICdbJwkJIlsiCisgICAgICAnXScJCSJdIgorICAgICAgJ3snCQkieyIKKyAgICAgICd9JwkJIn0iCisgICAgICAnLCcJCSIsIgorICAgICAgJ3wnCQkifCIKKyAgICAgICdJJwkJImRlY2ltYWwiCXBvc2l0aXZlIGludGVnZXIKKyAgICAgICdEJwkJImRlY2ltYWwiCXBvc2l0aXZlIGRvdWJsZSAKKyAgICAgICdBJwkJImF0b20gbmFtZSIKKyAgICAgICdWJwkJInZhcmlhYmxlIG5hbWUiCisgICAgICAnUycJCSJzdHJpbmciCisgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCByZWFkX3Rva2VuKFN0cmluZ0J1ZmZlciBzLCBQdXNoYmFja1JlYWRlciBpbikgCisJdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCWludCBjLCBjMTsKKwlpbnQgcmM7CisKKwljID0gaW4ucmVhZCgpOyAvLyBnZXQgMXN0LiBjaGFyCisJaWYoYyA9PSAtMSkgeworCSAgICBzLmFwcGVuZCgiZW5kX29mX2ZpbGUiKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKwlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoKGNoYXIpYykpIHsKKwkgICAgcmMgPSByZWFkX251bWJlcihjLCBzLCBpbik7CisJICAgIGlmIChyYyA9PSAxKSAKKwkJcmMgPSAnSSc7CisJICAgIGVsc2UgaWYgKHJjID09IDIpIAorCQlyYyA9ICdEJzsKKwkgICAgcmV0dXJuIHJjOworCX0KKwlpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKChjaGFyKWMpKSB7CisJICAgIHJjID0gcmVhZF93b3JkKGMsIHMsIGluKTsKKwkgICAgaWYgKHJjID4gMCkKKwkJcmMgPSAnQSc7CisJICAgIHJldHVybiByYzsKKwl9CisJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZSgoY2hhcikgYykgfHwgYyA9PSAnXycpIHsKKwkgICAgcmMgPSByZWFkX3dvcmQoYywgcywgaW4pOworCSAgICBpZiAocmMgPiAwKQorCQlyYyA9ICdWJzsKKwkgICAgcmV0dXJuIHJjOworCX0KKwlzd2l0Y2ggKGMpIHsKKwljYXNlICcoJzoKKwljYXNlICcpJzoKKwljYXNlICdbJzoKKwljYXNlICddJzoKKwljYXNlICd7JzoKKwljYXNlICd9JzoKKwljYXNlICcsJzoKKwljYXNlICd8JzoKKwkgICAgcy5hcHBlbmQoKGNoYXIpYyk7CisJICAgIHJldHVybiBjOworCWNhc2UgJy4nOgkJLyogZnVsbCBzdG9wIG9yIHN5bWJvbCAqLworCSAgICBjMSA9IGluLnJlYWQoKTsKKwkgICAgaWYgKGMxID09IC0xIHx8IGMxIDw9ICcgJykgeworCQlzLmFwcGVuZCgiLiIpOworCQlyZXR1cm4gJy4nOworCSAgICB9CisJICAgIGluLnVucmVhZChjMSk7CisJICAgIGJyZWFrOworCWNhc2UgJyUnOgkJLyogb25lIGxpbmUgY29tbWVudCAqLworCSAgICBzLmFwcGVuZCgiICIpOworCSAgICB3aGlsZSAoKGMxID0gaW4ucmVhZCgpKSAhPSAnXG4nKSB7CisJCWlmIChjMSA9PSAtMSkKKwkJICAgIHJldHVybiAnICc7CisJICAgIH0KKwkgICAgcmV0dXJuICcgJzsKKwljYXNlICcvJzoJCS8qIHN0YXJ0IG9mIGNvbW1lbnQgb3Igc3ltYm9sICovCisJICAgIGlmICgoYzEgPSBpbi5yZWFkKCkpID09ICcqJykgeworCQlzLmFwcGVuZCgiICIpOworCQl3aGlsZSAodHJ1ZSkgeworCQkgICAgd2hpbGUgKChjMSA9IGluLnJlYWQoKSkgIT0gJyonKSB7CisJCQlpZihjMSA9PSAtMSkgeworCQkJICAgIHMuYXBwZW5kKCJ1bmV4cGVjdGVkIGVuZF9vZl9maWxlIik7CisJCQkgICAgcmV0dXJuIC0yOworCQkJfQorCQkgICAgfQorCQkgICAgaWYgKChjMSA9IGluLnJlYWQoKSkgPT0gJy8nKQorCQkJcmV0dXJuICcgJzsKKwkJICAgIGluLnVucmVhZChjMSk7CisJCX0KKwkgICAgfQorCSAgICBpbi51bnJlYWQoYzEpOworCSAgICBicmVhazsKKwljYXNlICdcJyc6CisJICAgIHJjID0gcmVhZF9xdW90ZWQoYywgcywgaW4pOworCSAgICBpZiAocmMgPiAwKQorCQlyYyA9ICdBJzsKKwkgICAgcmV0dXJuIHJjOworCWNhc2UgJyInOgorCSAgICByYyA9IHJlYWRfcXVvdGVkKGMsIHMsIGluKTsKKwkgICAgaWYgKHJjID4gMCkKKwkJcmMgPSAnUyc7CisJICAgIHJldHVybiByYzsKKwlkZWZhdWx0OgorCSAgICBicmVhazsKKwl9CisJaWYgKGlzU29sbyhjKSkgeworCSAgICBzLmFwcGVuZCgoY2hhciljKTsKKwkgICAgcmV0dXJuICdBJzsKKwl9CisJaWYgKGlzU3ltYm9sKGMpKSB7CisJICAgIHJjID0gcmVhZF9zeW1ib2woYywgcywgaW4pOworCSAgICBpZiAocmMgPiAwKQorCQlyYyA9ICdBJzsKKwkgICAgcmV0dXJuIHJjOworCX0KKwlzLmFwcGVuZCgiICIpOworCXJldHVybiAnICc7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgcmVhZF9udW1iZXIoaW50IGMsIFN0cmluZ0J1ZmZlciBzLCBQdXNoYmFja1JlYWRlciBpbikgCisJdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCWludCBjMSwgYzI7CisJaW4udW5yZWFkKGMpOworCWZvciAoOzspIHsKKwkgICAgYzEgPSBpbi5yZWFkKCk7CisJICAgIGlmICghIENoYXJhY3Rlci5pc0RpZ2l0KChjaGFyKWMxKSkKKwkJYnJlYWs7CisJICAgIHMuYXBwZW5kKChjaGFyKSBjMSk7CisJfQorCWlmIChjMSAhPSAnLicpeworCSAgICBpbi51bnJlYWQoYzEpOworCSAgICByZXR1cm4gMTsKKwl9CisJYzIgPSBpbi5yZWFkKCk7CisJaWYgKCEgQ2hhcmFjdGVyLmlzRGlnaXQoKGNoYXIpYzIpKXsKKwkgICAgaW4udW5yZWFkKGMyKTsKKwkgICAgaW4udW5yZWFkKGMxKTsKKwkgICAgcmV0dXJuIDE7CisJfQorCXMuYXBwZW5kKChjaGFyKWMxKTsKKwlpbi51bnJlYWQoYzIpOworCWZvciAoOzspIHsKKwkgICAgYzEgPSBpbi5yZWFkKCk7CisJICAgIGlmICghIENoYXJhY3Rlci5pc0RpZ2l0KChjaGFyKSBjMSkpCisJCWJyZWFrOworCSAgICBzLmFwcGVuZCgoY2hhcikgYzEpOworCX0KKwlpbi51bnJlYWQoYzEpOworCXJldHVybiAyOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IHJlYWRfd29yZChpbnQgYywgU3RyaW5nQnVmZmVyIHMsIFB1c2hiYWNrUmVhZGVyIGluKQorCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJaW50IGMxOworCQorCWluLnVucmVhZChjKTsKKwlmb3IgKDs7KSB7CisJICAgIGMxID0gaW4ucmVhZCgpOworCSAgICBpZiAoISBDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KChjaGFyKWMxKSAmJiBjMSAhPSAnXycpCisJCWJyZWFrOworCSAgICBzLmFwcGVuZCgoY2hhciljMSk7CisJfQorCWluLnVucmVhZChjMSk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgcmVhZF9xdW90ZWQoaW50IHF1b3RlLCBTdHJpbmdCdWZmZXIgcywgUHVzaGJhY2tSZWFkZXIgaW4pIAorCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJaW50IHJjOworCWludCBjMTsKKwkKKwlmb3IgKDs7KSB7CisJICAgIGMxID0gaW4ucmVhZCgpOworCSAgICBpZiAoYzEgPT0gLTEgfHwgYzEgPT0gJ1xuJykgeworCQlpbi51bnJlYWQoYzEpOworCQlyZXR1cm4gLTI7CisJICAgIH0gZWxzZSBpZiAoYzEgPT0gcXVvdGUpeworCQljMSA9IGluLnJlYWQoKTsKKwkJaWYgKGMxICE9IHF1b3RlKSB7CisJCSAgICBpbi51bnJlYWQoYzEpOworCQkgICAgcmV0dXJuIDE7CisJCX0KKwkJYzEgPSBxdW90ZTsKKwkgICAgfSAKKwkgICAgZWxzZSBpZiAoYzEgPT0gJ1xcJykgeworCQlyYyA9IGVzY2FwZVNlcXVlbmNlcyhjMSwgcywgaW4pOworCQlpZiAocmMgPiAwKQorCQkgICAgY29udGludWU7CisJCWVsc2UKKwkJICAgIHJldHVybiAtMjsKKwkgICAgfQorCSAgICBzLmFwcGVuZCgoY2hhciljMSk7CisJfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGVzY2FwZVNlcXVlbmNlcyhpbnQgYmFja3NsYXNoLCBTdHJpbmdCdWZmZXIgcywgUHVzaGJhY2tSZWFkZXIgaW4pCQorCXRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwlpbnQgYzsKKwljID0gaW4ucmVhZCgpOworCXN3aXRjaCAoYykgeworCWNhc2UgJ2InOiAvLyBiYWNrc3BhY2UKKwkgICAgcy5hcHBlbmQoKGNoYXIpIDgpOyBicmVhazsgCisJY2FzZSAndCc6IC8vIGhvcml6b250YWwgdGFiIAorCSAgICBzLmFwcGVuZCgoY2hhcikgOSk7IGJyZWFrOworCWNhc2UgJ24nOiAvLyBuZXdsaW5lCisJICAgIHMuYXBwZW5kKChjaGFyKTEwKTsgYnJlYWs7CisJY2FzZSAndic6IC8vIHZlcnRpY2FsIHRhYgorCSAgICBzLmFwcGVuZCgoY2hhcikxMSk7IGJyZWFrOworCWNhc2UgJ2YnOiAvLyBmb3JtIGZlZWQKKwkgICAgcy5hcHBlbmQoKGNoYXIpMTIpOyBicmVhazsKKwljYXNlICdyJzogLy8gY2FycmlhZ2UgcmV0dXJuCisJICAgIHMuYXBwZW5kKChjaGFyKTEzKTsgYnJlYWs7CisJY2FzZSAnZSc6IC8vIGVzY2FwZQorCSAgICBzLmFwcGVuZCgoY2hhcikyNyk7IGJyZWFrOworCWNhc2UgJ2QnOiAgLy8gZGVsZXRlCisJICAgIHMuYXBwZW5kKChjaGFyKTEyNyk7IGJyZWFrOworCWNhc2UgJ2EnOiAvLyBhbGFybQorCSAgICBzLmFwcGVuZCgoY2hhcik3KTsgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgcy5hcHBlbmQoKGNoYXIpYyk7IAorCSAgICByZXR1cm4gMjsKKwl9CisJcmV0dXJuIDE7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGludCByZWFkX3N5bWJvbChpbnQgYywgU3RyaW5nQnVmZmVyIHMsIFB1c2hiYWNrUmVhZGVyIGluKSAKKwl0aHJvd3MgSU9FeGNlcHRpb24geworCWludCBjMTsKKwlzLmFwcGVuZCgoY2hhciljKTsKKwkvLwlpbi51bnJlYWQoYyk7IAorCWZvciAoOzspIHsKKwkgICAgYzEgPSBpbi5yZWFkKCk7CisJICAgIGlmICghIGlzU3ltYm9sKGMxKSkKKwkJYnJlYWs7CisJICAgIHMuYXBwZW5kKChjaGFyKWMxKTsKKwl9CisJaW4udW5yZWFkKGMxKTsKKwlyZXR1cm4gMTsKKyAgICB9CisKKworICAgIC8qIFdyaXRlICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlX3N0cmluZyhTdHJpbmcgcywgUHJpbnRXcml0ZXIgb3V0KSB7CisJb3V0LnByaW50KHMpOyAKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVxX3N0cmluZyhTdHJpbmcgcywgUHJpbnRXcml0ZXIgb3V0KSB7CisJY2hhcltdIGNoOworCisJY2ggPSBzLnRvQ2hhckFycmF5KCk7CisJaWYgKChnZXRTdHJpbmdUeXBlKHMpID09IDMpKXsKKwkgICAgb3V0LnByaW50KCJcJyIpOworCSAgICBmb3IgKGludCBpPTA7IGk8Y2gubGVuZ3RoOyBpKyspIHsKKwkJaWYgKGNoW2ldID09ICdcJycpCisJCSAgICBvdXQucHJpbnQoIlxcXCciKTsKKwkJZWxzZSBpZiAoY2hbaV0gPT0gJ1xcJykKKwkJICAgIG91dC5wcmludCgiXFxcXCIpOworCQllbHNlIGlmIChjaFtpXSA9PSA4KSAgLy8gYmFja3NwYWNlCisJCSAgICBvdXQucHJpbnQoIlxcYiIpOworCQllbHNlIGlmIChjaFtpXSA9PSA5KSAgLy8gaG9yaXpvbnRhbCB0YWIgCisJCSAgICBvdXQucHJpbnQoIlxcdCIpOworCQllbHNlIGlmIChjaFtpXSA9PSAxMCkgLy8gbmV3bGluZQorCQkgICAgb3V0LnByaW50KCJcXG4iKTsKKwkJZWxzZSBpZiAoY2hbaV0gPT0gMTEpIC8vIHZlcnRpY2FsIHRhYgorCQkgICAgb3V0LnByaW50KCJcXHYiKTsKKwkJZWxzZSBpZiAoY2hbaV0gPT0gMTIpIC8vIGZvcm0gZmVlZAorCQkgICAgb3V0LnByaW50KCJcXGYiKTsKKwkJZWxzZSBpZiAoY2hbaV0gPT0gMTMpIC8vIGNhcnJpYWdlIHJldHVybgorCQkgICAgb3V0LnByaW50KCJcXHIiKTsKKwkJZWxzZSBpZiAoY2hbaV0gPT0gMjcpIC8vIGVzY2FwZQorCQkgICAgb3V0LnByaW50KCJcXGUiKTsKKwkJZWxzZSBpZiAoY2hbaV0gPT0gMTI3KSAvLyBkZWxldGUKKwkJICAgIG91dC5wcmludCgiXFxkIik7CisJCWVsc2UgaWYgKGNoW2ldID09IDcpIC8vIGFsYXJtCisJCSAgICBvdXQucHJpbnQoIlxcYSIpOworCQllbHNlIAorCQkgICAgb3V0LnByaW50KGNoW2ldKTsKKwkgICAgfQorCSAgICBvdXQucHJpbnQoIlwnIik7CisJfSBlbHNlIHsKKwkgICAgd3JpdGVfc3RyaW5nKHMsIG91dCk7CisJfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvUXVvdGVkU3RyaW5nKFN0cmluZyBzKSB7CisJU3RyaW5nQnVmZmVyIHF1b3RlZCA9IG5ldyBTdHJpbmdCdWZmZXIocy5sZW5ndGgoKSAqIDIpOworCWNoYXJbXSBjaDsKKworCWNoID0gcy50b0NoYXJBcnJheSgpOworCWlmICgoZ2V0U3RyaW5nVHlwZShzKSA9PSAzKSl7CisJICAgIHF1b3RlZC5hcHBlbmQoIlwnIik7CisJICAgIGZvciAoaW50IGk9MDsgaTxjaC5sZW5ndGg7IGkrKykgeworCQlpZiAoY2hbaV0gPT0gJ1wnJykKKwkJICAgIHF1b3RlZC5hcHBlbmQoIlxcXCciKTsKKwkJZWxzZSBpZiAoY2hbaV0gPT0gJ1xcJykKKwkJICAgIHF1b3RlZC5hcHBlbmQoIlxcXFwiKTsKKwkJZWxzZSBpZiAoY2hbaV0gPT0gOCkgIC8vIGJhY2tzcGFjZQorCQkgICAgcXVvdGVkLmFwcGVuZCgiXFxiIik7CisJCWVsc2UgaWYgKGNoW2ldID09IDkpICAvLyBob3Jpem9udGFsIHRhYiAKKwkJICAgIHF1b3RlZC5hcHBlbmQoIlxcdCIpOworCQllbHNlIGlmIChjaFtpXSA9PSAxMCkgLy8gbmV3bGluZQorCQkgICAgcXVvdGVkLmFwcGVuZCgiXFxuIik7CisJCWVsc2UgaWYgKGNoW2ldID09IDExKSAvLyB2ZXJ0aWNhbCB0YWIKKwkJICAgIHF1b3RlZC5hcHBlbmQoIlxcdiIpOworCQllbHNlIGlmIChjaFtpXSA9PSAxMikgLy8gZm9ybSBmZWVkCisJCSAgICBxdW90ZWQuYXBwZW5kKCJcXGYiKTsKKwkJZWxzZSBpZiAoY2hbaV0gPT0gMTMpIC8vIGNhcnJpYWdlIHJldHVybgorCQkgICAgcXVvdGVkLmFwcGVuZCgiXFxyIik7CisJCWVsc2UgaWYgKGNoW2ldID09IDI3KSAvLyBlc2NhcGUKKwkJICAgIHF1b3RlZC5hcHBlbmQoIlxcZSIpOworCQllbHNlIGlmIChjaFtpXSA9PSAxMjcpIC8vIGRlbGV0ZQorCQkgICAgcXVvdGVkLmFwcGVuZCgiXFxkIik7CisJCWVsc2UgaWYgKGNoW2ldID09IDcpIC8vIGFsYXJtCisJCSAgICBxdW90ZWQuYXBwZW5kKCJcXGEiKTsKKwkJZWxzZSAKKwkJICAgIHF1b3RlZC5hcHBlbmQoY2hbaV0pOworCSAgICB9CisJICAgIHF1b3RlZC5hcHBlbmQoIlwnIik7CisJICAgIHJldHVybiBxdW90ZWQudG9TdHJpbmcoKTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gczsKKwl9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIHJldHVybiB2YWx1ZToKKyAgICAgKiAgIDAgOiBpZiBzdHJpbmcgaXMgYSBsb3dlciBjYXNlIGFscGhudW0KKyAgICAgKiAgIDEgOiBpZiBzdHJpbmcgaXMgYSBzeW1ib2wKKyAgICAgKiAgIDIgOiBpZiBzdHJpbmcgaXMgYSBzb2xvCisgICAgICogICAzIDogb3RoZXJzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0U3RyaW5nVHlwZShTdHJpbmcgcykgeworCWNoYXJbXSBwOworCisJaWYgKHMuZXF1YWxzKCJbXSIpIHx8IHMuZXF1YWxzKCJ7fSIpKSAKKwkgICAgcmV0dXJuIDA7CisJaWYgKHMuZXF1YWxzKCIiKSAgIHx8IHMuZXF1YWxzKCIuIikpCisJICAgIHJldHVybiAzOworCWlmIChzLmVxdWFscygiISIpICB8fCBzLmVxdWFscygiOyIpKQorCSAgICByZXR1cm4gMjsKKwlwID0gcy50b0NoYXJBcnJheSgpOyAvLyBzdHJpbmcgLS0+IGNoYXJzW10KKwlpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHBbMF0pKXsKKwkgICAgZm9yIChpbnQgaT0xOyBpPHAubGVuZ3RoOyBpKyspeworCQlpZiAoISBDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KHBbaV0pICYmICgoaW50KXBbaV0pICE9ICdfJykKKwkJICAgIHJldHVybiAzOworCSAgICB9CisJICAgIHJldHVybiAwOworCX0KKwlpZiAoaXNTeW1ib2woKGludCkgcFswXSkpeworCSAgICBmb3IgKGludCBpPTE7IGk8cC5sZW5ndGg7IGkrKyl7CisJCWlmICghIGlzU3ltYm9sKChpbnQpIHBbaV0pKQorCQkgICAgcmV0dXJuIDM7CisJICAgIH0KKwkgICAgcmV0dXJuIDE7CisJfQorCXJldHVybiAzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9sYW5nL1RyYWlsLmphdmEgYi9zcmMvbGFuZy9UcmFpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMTExZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGFuZy9UcmFpbC5qYXZhCkBAIC0wLDAgKzEsMTExIEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZzsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKy8qKgorICogVHJhaWwgc3RhY2suPGJyPgorICogVGhlIGNsYXNzIDxjb2RlPlRyYWlsPC9jb2RlPiByZXByZXNlbnRzIGEgdHJhaWwgc3RhY2suPGJyPgorICogRW50cmllcyBwdXNoZWQgdG8gdGhpcyB0cmFpbCBzdGFjayBtdXN0IGltcGxlbWVudAorICogdGhlIDxjb2RlPlVuZG9hYmxlPC9jb2RlPiBpbnRlcmZhY2UuCisgKiBAc2VlIFVuZG9hYmxlCisgKiBAYXV0aG9yIE11dHN1bm9yaSBCYW5iYXJhIChiYW5iYXJhQGtvYmUtdS5hYy5qcCkKKyAqIEBhdXRob3IgTmFveXVraSBUYW11cmEgKHRhbXVyYUBrb2JlLXUuYWMuanApCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIFRyYWlsIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICAvKiogTWF4aW11bSBzaXplIG9mIGVudGllcy4gSW5pdGlhbCBzaXplIGlzIDxjb2RlPjIwMDAwPC9jb2RlPi4gKi8KKyAgICBwcm90ZWN0ZWQgaW50IG1heENvbnRlbnRzID0gMjAwMDA7CisKKyAgICAvKiogQW4gYXJyYXkgb2YgPGNvZGU+VW5kb2FibGU8L2NvZGU+IGVudHJpZXMuICovCisgICAgcHJvdGVjdGVkIFVuZG9hYmxlW10gYnVmZmVyOworCisgICAgLyoqIHRoZSB0b3AgaW5kZXggb2YgdGhpcyA8Y29kZT5UcmFpbDwvY29kZT4uICovCisgICAgcHJvdGVjdGVkIGludCB0b3A7CisKKyAgICAvKiogSG9sZHMgdGhlIFByb2xvZyBlbmdpbmUgdGhhdCB0aGlzIDxjb2RlPlRyYWlsPC9jb2RlPiBiZWxvbmdzIHRvLiAqLworICAgIHByb3RlY3RlZCBQcm9sb2cgZW5naW5lOworCQorICAgIC8qKiBDb25zdHJ1Y3RzIGEgbmV3IHRyYWlsIHN0YWNrLiAqLworICAgIHB1YmxpYyBUcmFpbChQcm9sb2cgX2VuZ2luZSkgeworCWVuZ2luZSA9IF9lbmdpbmU7CisJYnVmZmVyID0gbmV3IFVuZG9hYmxlW21heENvbnRlbnRzXTsKKwl0b3AgPSAtMTsKKyAgICB9CisKKyAgICAvKiogQ29uc3RydWN0cyBhIG5ldyB0cmFpbCBzdGFjayB3aXRoIHRoZSBnaXZlbiBzaXplLiAqLworICAgIHB1YmxpYyBUcmFpbChQcm9sb2cgX2VuZ2luZSwgaW50IG4pIHsKKwllbmdpbmUgPSBfZW5naW5lOworCW1heENvbnRlbnRzID0gbjsKKwlidWZmZXIgPSBuZXcgVW5kb2FibGVbbWF4Q29udGVudHNdOworCXRvcCA9IC0xOworICAgIH0KKworICAgIC8qKiBEaXNjYXJkcyBhbGwgZW50cmllcy4gKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgeyBkZWxldGVBbGwoKTsgfQorCisgICAgLyoqIFB1c2hzIGFuIGVudHJ5IHRvIHRoaXMgPGNvZGU+VHJhaWw8L2NvZGU+LiAqLworICAgIHB1YmxpYyB2b2lkIHB1c2goVW5kb2FibGUgdCkgeworCXRyeSB7CisJICAgIGJ1ZmZlclsrK3RvcF0gPSB0OworCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJICAgIFN5c3RlbS5vdXQucHJpbnRsbigie2V4cGFuZGluZyB0cmFpbC4uLn0iKTsKKwkgICAgaW50IGxlbiA9IGJ1ZmZlci5sZW5ndGg7CisJICAgIFVuZG9hYmxlW10gbmV3X2J1ZmZlciA9IG5ldyBVbmRvYWJsZVtsZW4rMjAwMDBdOworCSAgICBmb3IoaW50IGk9MDsgaTxsZW47IGkrKyl7CisJCW5ld19idWZmZXJbaV0gPSBidWZmZXJbaV07CisJICAgIH0KKwkgICAgYnVmZmVyID0gbmV3X2J1ZmZlcjsKKwkgICAgYnVmZmVyW3RvcF0gPSB0OworCSAgICBtYXhDb250ZW50cyA9IGxlbisyMDAwMDsKKwl9CisgICAgfQorCisgICAgLyoqIFBvcHMgYW4gZW50cnkgZnJvbSB0aGlzIDxjb2RlPlRyYWlsPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgVW5kb2FibGUgcG9wKCkgeworCVVuZG9hYmxlIHQgPSBidWZmZXJbdG9wXTsKKwlidWZmZXJbdG9wLS1dID0gbnVsbDsKKwlyZXR1cm4gdDsKKyAgICB9CisKKyAgICAvKiogRGlzY2FyZHMgYWxsIGVudHJpZXMuICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGVsZXRlQWxsKCkgeworCXdoaWxlICghIGVtcHR5KCkpIHsKKwkgICAgYnVmZmVyW3RvcC0tXSA9IG51bGw7CisJfQkKKyAgICB9CisKKyAgICAvKiogVGVzdHMgaWYgdGhpcyBzdGFjayBoYXMgbm8gZW50cnkuICovCisgICAgcHVibGljIGJvb2xlYW4gZW1wdHkoKSB7CisJcmV0dXJuIHRvcCA9PSAtMTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgdmFsdWUgb2YgPGNvZGU+bWF4Q29udGVudHM8L2NvZGU+LiAKKyAgICAgKiBAc2VlICNtYXhDb250ZW50cworICAgICAqLworICAgIHB1YmxpYyBpbnQgbWF4KCkgeyByZXR1cm4gbWF4Q29udGVudHM7IH0KKworICAgIC8qKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiA8Y29kZT50b3A8L2NvZGU+LiAKKyAgICAgKiBAc2VlICN0b3AKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHRvcCgpIHsgcmV0dXJuIHRvcDsgfQorCisgICAgLyoqIFVud2luZHMgYWxsIGVudHJpZXMgYWZ0ZXIgdGhlIHZhbHVlIG9mIDxjb2RlPmk8L2NvZGU+LiAqLworICAgIHB1YmxpYyB2b2lkIHVud2luZChpbnQgaSkgeworCVVuZG9hYmxlIHQ7CisJd2hpbGUgKHRvcCA+IGkpIHsKKwkgICAgdCA9IHBvcCgpOworCSAgICB0LnVuZG8oKTsKKwl9CisgICAgfQorCisgICAgLyoqIFNob3dzIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlRyYWlsPC9jb2RlPi4gKi8KKyAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworCWlmIChlbXB0eSgpKSB7CisJICAgIFN5c3RlbS5vdXQucHJpbnRsbigie3RyYWlsIHN0YWNrIGlzIGVtcHR5IX0iKTsKKwkgICAgcmV0dXJuOworCX0KKwlmb3IgKGludCBpPTA7IGk8PXRvcDsgaSsrKSB7CisJICAgIFN5c3RlbS5vdXQucHJpbnQoInRyYWlsWyIgKyBpICsgIl06ICIpOworCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oYnVmZmVyW2ldKTsKKwl9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zcmMvbGFuZy9VbmRvYWJsZS5qYXZhIGIvc3JjL2xhbmcvVW5kb2FibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjhiNzdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xhbmcvVW5kb2FibGUuamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIGpwLmFjLmtvYmVfdS5jcy5wcm9sb2cubGFuZzsKKy8qKgorICogSW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIGFsbG93cyBhbiBvYmplY3QgdG8gYmUgcHVzaGVkIHRvIHRyYWlsIHN0YWNrLjxicj4KKyAqIEBzZWUgVHJhaWwKKyAqIEBhdXRob3IgTXV0c3Vub3JpIEJhbmJhcmEgKGJhbmJhcmFAa29iZS11LmFjLmpwKQorICogQGF1dGhvciBOYW95dWtpIFRhbXVyYSAodGFtdXJhQGtvYmUtdS5hYy5qcCkKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIFVuZG9hYmxlIHsKKyAgICAvKiogCisgICAgICogVW5kb2VzIHRoaXMgb2JqZWN0Ljxicj4gCisgICAgICogQHNlZSBUcmFpbCN1bndpbmQoaW50KSAKKyAgICAqLworICAgIHB1YmxpYyB2b2lkIHVuZG8oKTsKK30KKworCisKKworCmRpZmYgLS1naXQgYS9zcmMvbGFuZy9WYXJpYWJsZVRlcm0uamF2YSBiL3NyYy9sYW5nL1ZhcmlhYmxlVGVybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MDg1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGFuZy9WYXJpYWJsZVRlcm0uamF2YQpAQCAtMCwwICsxLDIxNyBAQAorcGFja2FnZSBqcC5hYy5rb2JlX3UuY3MucHJvbG9nLmxhbmc7CisvKioKKyAqIFZhcmlhYmxlLjxicj4KKyAqIFRoZSA8Y29kZT5WYXJpYWJsZVRlcm08L2NvZGU+IGNsYXNzIHJlcHJlc2VudHMgYSBsb2dpY2FsIHZhcmlhYmxlLjxicj4KKyAqIEZvciBleGFtcGxlLAorICogPHByZT4KKyAqICAgVGVybSB0ID0gbmV3IFZhcmlhYmxlVGVybSgpOworICogPC9wcmU+CisgKgorICogQGF1dGhvciBNdXRzdW5vcmkgQmFuYmFyYSAoYmFuYmFyYUBrb2JlLXUuYWMuanApCisgKiBAYXV0aG9yIE5hb3l1a2kgVGFtdXJhICh0YW11cmFAa29iZS11LmFjLmpwKQorICogQHZlcnNpb24gMS4wCisgKi8KK3B1YmxpYyBjbGFzcyBWYXJpYWJsZVRlcm0gZXh0ZW5kcyBUZXJtIGltcGxlbWVudHMgVW5kb2FibGUgeworICAgIC8qKiBIb2xkcyBhIHRlcm0gdG8gd2hpY2ggdGhpcyB2YXJpYWJsZSBpcyBib3VuZC4gSW5pdGlhbCB2YWx1ZSBpcyA8Y29kZT50aGlzPC9jb2RlPiAoc2VsZi1yZWZlcmVuY2UpLiAqLworICAgIHByb3RlY3RlZCBUZXJtIHZhbDsKKyAgICAvKiogQSBDUEYgdGltZSBzdGFtcCB3aGVuIHRoaXMgb2JqZWN0IGlzIG5ld2x5IGNvbnN0cnVjdGVkLiAqLworICAgIHByb3RlY3RlZCBsb25nIHRpbWVTdGFtcDsKKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgbmV3IGxvZ2ljYWwgdmFyaWFibGUgc28gdGhhdAorICAgICAqIHRoZSA8Y29kZT50aW1lU3RhbXA8L2NvZGU+IGZpZWxkIGlzIHNldCB0byA8Y29kZT5Mb25nLk1JTl9WQUxVRTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFZhcmlhYmxlVGVybSgpIHsKKwl2YWwgPSB0aGlzOworICAgIAl0aW1lU3RhbXAgPSBMb25nLk1JTl9WQUxVRTsKKyAgICB9CisKKyAgICAvKiogQ29uc3RydWN0cyBhIG5ldyBsb2dpY2FsIHZhcmlhYmxlIHNvIHRoYXQKKyAgICAgKiB0aGUgPGNvZGU+dGltZVN0YW1wPC9jb2RlPiBmaWVsZCBpcyBzZXQgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YKKyAgICAgKiA8Y29kZT5DUEZUaW1lU3RhbXA8L2NvZGU+IG9mIHRoZSBzcGVjaWZpZWQgUHJvbG9nIGVuZ2luZS4KKyAgICAgKiBAcGFyYW0gZW5naW5lIEN1cnJlbnQgUHJvbG9nIGVuZ2luZS4KKyAgICAgKiBAc2VlIFByb2xvZyNnZXRDUEZUaW1lU3RhbXAKKyAgICAgKi8KKyAgICBwdWJsaWMgVmFyaWFibGVUZXJtKFByb2xvZyBlbmdpbmUpIHsKKwl2YWwgPSB0aGlzOworCXRpbWVTdGFtcCA9IGVuZ2luZS5nZXRDUEZUaW1lU3RhbXAoKTsKKyAgICB9CisKKyAgICAvKiogCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgPGNvZGU+dGltZVN0YW1wPC9jb2RlPi4KKyAgICAgKiBAc2VlICN0aW1lU3RhbXAKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyB0aW1lU3RhbXAoKSB7IHJldHVybiB0aW1lU3RhbXA7IH0KKworICAgIC8qKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LiovCisgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lKCkgeyByZXR1cm4gIl8iICsgSW50ZWdlci50b0hleFN0cmluZyhoYXNoQ29kZSgpKS50b1VwcGVyQ2FzZSgpOyB9CisKKyAgICAvKiBUZXJtICovCisgICAgLyoqIAorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBhcmd1bWVudCB0ZXJtIGlzIHVuaWZpZWQgd2l0aCB0aGlzIG9uZS4KKyAgICAgKiBJZiB0aGlzIGlzIGFuIHVuYm91bmQgdmFyaWFibGUsIHRoZSA8Y29kZT51bmlmeTwvY29kZT4gbWV0aG9kIGJpbmRzIHRoaXMgdG8gCisgICAgICogdGhlIGRlcmVmZXJlbmNlZCB2YWx1ZSBvZiBhcmd1bWVudCB0ZXJtOiA8Y29kZT5iaW5kKHQuZGVyZWZlcmVuY2UoKSwgdHJhaWwpPC9jb2RlPiwKKyAgICAgKiBhbmQgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgKiBPdGhlcndpc2UsIGl0IHJldHVybnMgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB3aG9zZSB2YWx1ZSBpcyA8Y29kZT52YWwudW5pZnkodCwgdHJhaWwpPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gdCB0aGUgdGVybSB0byBiZSB1bmlmaWVkIHdpdGguCisgICAgICogQHBhcmFtIHRyYWlsIFRyYWlsIFN0YWNrLgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3VjY2VlZHMsIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICogQHNlZSAjdmFsCisgICAgICogQHNlZSAjYmluZChUZXJtLFRyYWlsKQorICAgICAqIEBzZWUgVHJhaWwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiB1bmlmeShUZXJtIHQsIFRyYWlsIHRyYWlsKSB7CisJaWYgKHZhbCAhPSB0aGlzKQorCSAgICByZXR1cm4gdmFsLnVuaWZ5KHQsIHRyYWlsKTsKKwl0ID0gdC5kZXJlZmVyZW5jZSgpOworCWlmICh0aGlzICE9IHQpCisJICAgIGJpbmQodCwgdHJhaWwpOworCXJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBCaW5kcyB0aGlzIHZhcmlhYmxlIHRvIGEgZ2l2ZW4gdGVybS4gCisgICAgICogQW5kIHB1c2hzIHRoaXMgdmFyaWFibGUgdG8gdHJhaWwgc3RhY2sgaWYgbmVjZXNzYXJ5LiAKKyAgICAgKiBAcGFyYW0gdCBhIHRlcm0gdG8gYmUgYm91bmQuCisgICAgICogQHBhcmFtIHRyYWlsIFRyYWlsIFN0YWNrCisgICAgICogQHNlZSBUcmFpbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJpbmQoVGVybSB0LCBUcmFpbCB0cmFpbCkgeworCWlmICh0LmlzVmFyaWFibGUoKSAmJiAoKFZhcmlhYmxlVGVybSl0KS50aW1lU3RhbXAoKSA+PSB0aGlzLnRpbWVTdGFtcCkgeworCSAgICAoKFZhcmlhYmxlVGVybSl0KS52YWwgPSB0aGlzOworCSAgICBpZiAoKChWYXJpYWJsZVRlcm0pdCkudGltZVN0YW1wKCkgPCB0cmFpbC5lbmdpbmUuc3RhY2suZ2V0VGltZVN0YW1wKCkpCisJCXRyYWlsLnB1c2goKFZhcmlhYmxlVGVybSl0KTsKKwl9IGVsc2UgeworCSAgICB0aGlzLnZhbCA9IHQ7CisJICAgIGlmICh0aGlzLnRpbWVTdGFtcCgpIDwgdHJhaWwuZW5naW5lLnN0YWNrLmdldFRpbWVTdGFtcCgpKQorCQl0cmFpbC5wdXNoKHRoaXMpOworCX0KKyAgICB9CisKKyAgICAvKiogCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBvYmplY3QgaXMgY29udmVydGlibGUgd2l0aCB0aGUgZ2l2ZW4gSmF2YSBjbGFzcyB0eXBlIAorICAgICAqIGlmIHRoaXMgdmFyaWFibGUgaXMgdW5ib3VuZC4KKyAgICAgKiBPdGhlcndpc2UsIHJldHVybnMgdGhlIHZhbHVlIG9mIDxjb2RlPnZhbC5jb252ZXJ0aWJsZSh0eXBlKTwvY29kZT4uCisgICAgICogQHBhcmFtIHR5cGUgdGhlIEphdmEgY2xhc3MgdHlwZSB0byBjb21wYXJlIHdpdGguCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIChvciBkZXJlZmVyZW5jZWQgdGVybSkgaXMgCisgICAgICogY29udmVydGlibGUgd2l0aCA8Y29kZT50eXBlPC9jb2RlPi4gT3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiBAc2VlICN2YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb252ZXJ0aWJsZShDbGFzcyB0eXBlKSB7CisJaWYgKHZhbCAhPSB0aGlzKQorCSAgICByZXR1cm4gdmFsLmNvbnZlcnRpYmxlKHR5cGUpOworCXJldHVybiBjb252ZXJ0aWJsZSh0aGlzLmdldENsYXNzKCksIHR5cGUpOworICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIG9iamVjdCBpZiB1bmJvdW5kIHZhcmlhYmxlLgorICAgICAqIE90aGVyd2lzZSwgcmV0dXJucyB0aGUgdmFsdWUgb2YgPGNvZGU+dmFsLmNvcHkoZW5naW5lKTwvY29kZT4uCisgICAgICogQHNlZSAjdmFsCisgICAgICovCisgICAgcHJvdGVjdGVkIFRlcm0gY29weShQcm9sb2cgZW5naW5lKSB7CisJVmFyaWFibGVUZXJtIGNvOworCWlmICh2YWwgIT0gdGhpcykKKwkgICAgcmV0dXJuIHZhbC5jb3B5KGVuZ2luZSk7CisJY28gPSBlbmdpbmUuY29weUhhc2guZ2V0KHRoaXMpOworCWlmIChjbyA9PSBudWxsKSB7CisJICAgIC8vCSAgICBjbyA9IG5ldyBWYXJpYWJsZVRlcm0oZW5naW5lKTsKKwkgICAgY28gPSBuZXcgVmFyaWFibGVUZXJtKCk7CisJICAgIGVuZ2luZS5jb3B5SGFzaC5wdXQodGhpcywgY28pOworCX0KKwlyZXR1cm4gY287CisgICAgfQorCisgICAgcHVibGljIFRlcm0gZGVyZWZlcmVuY2UoKSB7CisJaWYgKHZhbCA9PSB0aGlzKQorCSAgICByZXR1cm4gdGhpczsKKwlyZXR1cm4gdmFsLmRlcmVmZXJlbmNlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNHcm91bmQoKSB7CisJaWYgKHZhbCAhPSB0aGlzKQorCSAgICByZXR1cm4gdmFsLmlzR3JvdW5kKCk7CisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBSZXR1cm5zIDxjb2RlPnRoaXM8L2NvZGU+IGlmIHRoaXMgdmFyaWFibGUgaXMgdW5ib3VuZC4KKyAgICAgKiBPdGhlcndpc2UsIHJldHVybnMgYSBKYXZhIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBkZXJlZmVyZW5jZWQgdGVybToKKyAgICAgKiA8Y29kZT52YWwudG9KYXZhKCk8L2NvZGU+LgorICAgICAqIEByZXR1cm4gYSBKYXZhIG9iamVjdCBkZWZpbmVkIGluIDxlbT5Qcm9sb2cgQ2FmZSBpbnRlcm9wZXJhYmlsaXR5IHdpdGggSmF2YTwvZW0+LgorICAgICAqIEBzZWUgI3ZhbAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgdG9KYXZhKCkgeyAKKwlpZiAodmFsICE9IHRoaXMpCisJICAgIHJldHVybiB2YWwudG9KYXZhKCk7CisJcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHF1b3RlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0ZXJtIGlmIHVuYm91bmQuCisgICAgICogT3RoZXJ3aXNlLCByZXR1cm5zIHRoZSB2YWx1ZSBvZiBkZXJlZmVyZW5jZWQgdGVybToKKyAgICAgKiA8Y29kZT52YWwudG9RdW90ZWRTdHJpbmcoKTwvY29kZT4KKyAgICAgKiBAc2VlICN2YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvUXVvdGVkU3RyaW5nKCkgeworCWlmICh2YWwgIT0gdGhpcykKKwkgICAgcmV0dXJuIHZhbC50b1F1b3RlZFN0cmluZygpOworCXJldHVybiBuYW1lKCk7CisgICAgfQorCisgICAgLyogT2JqZWN0ICovCisgICAgLyoqCisgICAgICogQ2hlY2tzIDxlbT50ZXJtIGVxdWFsaXR5PC9lbT4gb2YgdHdvIHRlcm1zLgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB3aG9zZSB2YWx1ZSBpcworICAgICAqICg8Y29kZT50aGlzID09IG9iajwvY29kZT4pIGlmIHRoaXMgdmFyaWFibGUgaXMgdW5ib3VuZC4KKyAgICAgKiBPdGhlcndpc2UsIGl0IHJldHVybnMgdGhlIHZhbHVlIG9mIDxjb2RlPnZhbC5lcXVhbHMob2JqKTwvY29kZT4uCisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aC4gVGhpcyBtdXN0IGJlIGRlcmVmZXJlbmNlZC4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgKG9yIGRlcmVmZXJlbmNlZCB0ZXJtKSBpcyB0aGUgc2FtZSBhcyB0aGUgYXJndW1lbnQ7CisgICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKiBAc2VlICN2YWwKKyAgICAgKiBAc2VlICNjb21wYXJlVG8KKyAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJaWYodmFsICE9IHRoaXMpCisJICAgIHJldHVybiB2YWwuZXF1YWxzKG9iaik7CisJaWYgKCEgKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmxlVGVybSkpIC8vID8/PworCSAgICByZXR1cm4gZmFsc2U7IC8vPz8/CisJcmV0dXJuIHRoaXMgPT0gb2JqOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0ZXJtIGlmIHVuYm91bmQuCisgICAgICogT3RoZXJ3aXNlLCByZXR1cm5zIHRoZSB2YWx1ZSBvZiBkZXJlZmVyZW5jZWQgdGVybToKKyAgICAgKiA8Y29kZT52YWwudG9TdHJpbmcoKTwvY29kZT4KKyAgICAgKiBAc2VlICN2YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCWlmICh2YWwgIT0gdGhpcykKKwkgICAgcmV0dXJuIHZhbC50b1N0cmluZygpOworCXJldHVybiBuYW1lKCk7CisgICAgfQorCisgICAgLyogVW5kb2FibGUgKi8KKyAgICBwdWJsaWMgdm9pZCB1bmRvKCkgeyB2YWwgPSB0aGlzOyB9CisKKyAgICAvKiBDb21wYXJhYmxlICovCisgICAgLyoqIAorICAgICAqIENvbXBhcmVzIHR3byB0ZXJtcyBpbiA8ZW0+UHJvbG9nIHN0YW5kYXJkIG9yZGVyIG9mIHRlcm1zPC9lbT4uPGJyPgorICAgICAqIEl0IGlzIG5vdGVkIHRoYXQgPGNvZGU+dDEuY29tcGFyZVRvKHQyKSA9PSAwPC9jb2RlPiBoYXMgdGhlIHNhbWUKKyAgICAgKiA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBhcyA8Y29kZT50MS5lcXVhbHModDIpPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gYW5vdGhlclRlcm0gdGhlIHRlcm0gdG8gY29tcGFyZSB3aXRoLiBJdCBtdXN0IGJlIGRlcmVmZXJlbmNlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSA8Y29kZT4wPC9jb2RlPiBpZiB0d28gdGVybXMgYXJlIGlkZW50aWNhbDsgCisgICAgICogYSB2YWx1ZSBsZXNzIHRoYW4gPGNvZGU+MDwvY29kZT4gaWYgdGhpcyB0ZXJtIGlzIDxlbT5iZWZvcmU8L2VtPiB0aGUgPGNvZGU+YW5vdGhlclRlcm08L2NvZGU+OworICAgICAqIGFuZCBhIHZhbHVlIGdyZWF0ZXIgdGhhbiA8Y29kZT4wPC9jb2RlPiBpZiB0aGlzIHRlcm0gaXMgPGVtPmFmdGVyPC9lbT4gdGhlIDxjb2RlPmFub3RoZXJUZXJtPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhUZXJtIGFub3RoZXJUZXJtKSB7IC8vIGFub3RoZXJUZXJtIG11c3QgYmUgZGVyZWZlcmVuY2VkLgorCWlmKHZhbCAhPSB0aGlzKQorCSAgICByZXR1cm4gdmFsLmNvbXBhcmVUbyhhbm90aGVyVGVybSk7CisJaWYgKCEgYW5vdGhlclRlcm0uaXNWYXJpYWJsZSgpKQorCSAgICByZXR1cm4gQkVGT1JFOworCWlmICh0aGlzID09IGFub3RoZXJUZXJtKSAKKwkgICAgcmV0dXJuIEVRVUFMOworCWludCB4ID0gdGhpcy5oYXNoQ29kZSgpIC0gKChWYXJpYWJsZVRlcm0pYW5vdGhlclRlcm0pLmhhc2hDb2RlKCk7CisJaWYgKHggIT0gMCkKKwkgICAgcmV0dXJuIHg7CisJdGhyb3cgbmV3IEludGVybmFsRXhjZXB0aW9uKCJWYXJpYWJsZVRlcm0gaXMgbm90IHVuaXF1ZSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9sYW5nL3BhY2thZ2UuaHRtbCBiL3NyYy9sYW5nL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjlmZWUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xhbmcvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMTIgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1FVUMtSlAiPgorPHRpdGxlPjwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIj4KK1Byb3ZpZGVzIGNsYXNzZXMgdGhhdCBhcmUgZnVuZGFtZW50YWwgdG8gdGhlIGRlc2lnbiBvZiB0aGUgUHJvbG9nIENhZmUKK3N5c3RlbS48YnI+CitBbGwgb2YgdGhlIHNvdXJjZSBjb2RlIGlzIGxvY2F0ZWQgPGNvZGU+JFBMQ0FGRURJUi9zcmMvbGFuZzwvY29kZT4uCis8L2JvZHk+Cis8L2h0bWw+Cg==