LyoKICogQ29weXJpZ2h0IDIwMDItMjAwMyBNaWNoYWVsIEf8bm5ld2lnCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCi8qIFRPRE86CiAqICAgLSBzb21lIGltcHJvdmVtZW50cyBwb3NzaWJsZQogKiAgIC0gaW1wbGVtZW50IERlY29tcHJlc3NTZXRQYWxldHRlPyAtLSBkb2VzIHdlIG5lZWQgaXQgZm9yIGFueXRoaW5nPwogKi8KCiNpbmNsdWRlIDxhc3NlcnQuaD4KCiNpbmNsdWRlICJtc3JsZV9wcml2YXRlLmgiCgojaW5jbHVkZSAid2lubmxzLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ3aW5kb3dzeC5oIgoKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKG1zcmxlMzIpOwoKc3RhdGljIEhJTlNUQU5DRSBNU1JMRTMyX2hNb2R1bGUgPSAwOwoKI2RlZmluZSBBQlMoYSkgICAgICAgICAgICAgICAgKChhKSA8IDAgPyAtKGEpIDogKGEpKQojZGVmaW5lIFNRUihhKSAgICAgICAgICAgICAgICAoKGEpICogKGEpKQoKI2RlZmluZSBRVUFMSVRZX3RvX0RJU1QocSkgICAgKElDUVVBTElUWV9ISUdIIC0gcSkKaW5saW5lIFdPUkQgQ29sb3JDbXAoV09SRCBjbHIxLCBXT1JEIGNscjIpCnsKICByZWdpc3RlciBVSU5UIGEgPSAoY2xyMS1jbHIyKTsKICByZXR1cm4gU1FSKGEpOwp9CmlubGluZSBXT1JEIEludGVuc2l0eShSR0JRVUFEIGNscikKewogIHJldHVybiAoMzAgKiBjbHIucmdiUmVkICsgNTkgKiBjbHIucmdiR3JlZW4gKyAxMSAqIGNsci5yZ2JCbHVlKS80Owp9CgojZGVmaW5lIEdldFJhd1BpeGVsKGxwYmksbHAseCkgXAogICgobHBiaSktPmJpQml0Q291bnQgPT0gMSA/ICgobHApWyh4KS84XSA+PiAoOCAtICh4KSU4KSkgJiAxIDogXAogICAoKGxwYmkpLT5iaUJpdENvdW50ID09IDQgPyAoKGxwKVsoeCkvMl0gPj4gKDQgKiAoMSAtICh4KSUyKSkpICYgMTUgOiBscFt4XSkpCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiB1dGlsaXR5IGZ1bmN0aW9ucyAqLwpzdGF0aWMgQk9PTCAgICBpc1N1cHBvcnRlZERJQihMUENCSVRNQVBJTkZPSEVBREVSIGxwYmkpOwpzdGF0aWMgQk9PTCAgICBpc1N1cHBvcnRlZE1STEUoTFBDQklUTUFQSU5GT0hFQURFUiBscGJpKTsKc3RhdGljIHZvaWQgICAgTG9hZFdpZGVTdHJpbmcoVUlOVCBpZCwgTFBXU1RSIHN0ciwgSU5UIGxlbik7CnN0YXRpYyBCWVRFICAgIE1TUkxFMzJfR2V0TmVhcmVzdFBhbGV0dGVJbmRleChVSU5UIGNvdW50LCBjb25zdCBSR0JRVUFEICpjbHJzLCBSR0JRVUFEIGNscik7CgovKiBjb21wcmVzc2lvbiBmdW5jdGlvbnMgKi8Kc3RhdGljIHZvaWQgICAgY29tcHV0ZUludGVybmFsRnJhbWUoQ29kZWNJbmZvICpwaSwgTFBDQklUTUFQSU5GT0hFQURFUiBscGJpSW4sIExQQllURSBscEluKTsKc3RhdGljIExPTkcgICAgTVNSTEUzMl9HZXRNYXhDb21wcmVzc2VkU2l6ZShMUENCSVRNQVBJTkZPSEVBREVSIGxwYmkpOwpzdGF0aWMgTFJFU1VMVCBNU1JMRTMyX0NvbXByZXNzUkxFNChDb2RlY0luZm8gKnBpLCBMUEJJVE1BUElORk9IRUFERVIgbHBiaUluLCBMUEJZVEUgbHBJbiwgTFBCSVRNQVBJTkZPSEVBREVSIGxwYmlPdXQsIExQQllURSBscE91dCwgQk9PTCBpc0tleSk7CnN0YXRpYyBMUkVTVUxUIE1TUkxFMzJfQ29tcHJlc3NSTEU4KENvZGVjSW5mbyAqcGksIExQQklUTUFQSU5GT0hFQURFUiBscGJpSW4sIExQQllURSBscEluLCBMUEJJVE1BUElORk9IRUFERVIgbHBiaU91dCwgTFBCWVRFIGxwT3V0LCBCT09MIGlzS2V5KTsKCi8qIGRlY29tcHJlc3Npb24gZnVuY3Rpb25zICovCnN0YXRpYyBMUkVTVUxUIE1TUkxFMzJfRGVjb21wcmVzc1JMRTQoQ29kZWNJbmZvICpwaSwgTFBDQklUTUFQSU5GT0hFQURFUiBscGJpLAoJCQkJICAgICAgTFBCWVRFIGxwSW4sIExQQllURSBscE91dCk7CnN0YXRpYyBMUkVTVUxUIE1TUkxFMzJfRGVjb21wcmVzc1JMRTgoQ29kZWNJbmZvICpwaSwgTFBDQklUTUFQSU5GT0hFQURFUiBscGJpLAoJCQkJICAgICAgTFBCWVRFIGxwSW4sIExQQllURSBscE91dCk7CgovKiBBUEkgZnVuY3Rpb25zICovCnN0YXRpYyBMUkVTVUxUIENvbXByZXNzR2V0Rm9ybWF0KENvZGVjSW5mbyAqcGksIExQQ0JJVE1BUElORk9IRUFERVIgbHBiaUluLAoJCQkJIExQQklUTUFQSU5GT0hFQURFUiBscGJpT3V0KTsKc3RhdGljIExSRVNVTFQgQ29tcHJlc3NHZXRTaXplKENvZGVjSW5mbyAqcGksIExQQ0JJVE1BUElORk9IRUFERVIgbHBiaUluLAoJCQkgICAgICAgTFBDQklUTUFQSU5GT0hFQURFUiBscGJpT3V0KTsKc3RhdGljIExSRVNVTFQgQ29tcHJlc3NRdWVyeShDb2RlY0luZm8gKnBpLCBMUENCSVRNQVBJTkZPSEVBREVSIGxwYmlJbiwKCQkJICAgICBMUENCSVRNQVBJTkZPSEVBREVSIGxwYmlPdXQpOwpzdGF0aWMgTFJFU1VMVCBDb21wcmVzc0JlZ2luKENvZGVjSW5mbyAqcGksIExQQ0JJVE1BUElORk9IRUFERVIgbHBiaUluLAoJCQkgICAgIExQQ0JJVE1BUElORk9IRUFERVIgbHBiaU91dCk7CnN0YXRpYyBMUkVTVUxUIENvbXByZXNzKENvZGVjSW5mbyAqcGksIElDQ09NUFJFU1MqIGxwaWMsIERXT1JEIGR3U2l6ZSk7CnN0YXRpYyBMUkVTVUxUIENvbXByZXNzRW5kKENvZGVjSW5mbyAqcGkpOwoKc3RhdGljIExSRVNVTFQgRGVjb21wcmVzc0dldEZvcm1hdChDb2RlY0luZm8gKnBpLCBMUENCSVRNQVBJTkZPSEVBREVSIGxwYmlJbiwKCQkJCSAgIExQQklUTUFQSU5GT0hFQURFUiBscGJpT3V0KTsKc3RhdGljIExSRVNVTFQgRGVjb21wcmVzc1F1ZXJ5KENvZGVjSW5mbyAqcGksIExQQ0JJVE1BUElORk9IRUFERVIgbHBiaUluLAoJCQkgICAgICAgTFBDQklUTUFQSU5GT0hFQURFUiBscGJpT3V0KTsKc3RhdGljIExSRVNVTFQgRGVjb21wcmVzc0JlZ2luKENvZGVjSW5mbyAqcGksIExQQ0JJVE1BUElORk9IRUFERVIgbHBiaUluLAoJCQkgICAgICAgTFBDQklUTUFQSU5GT0hFQURFUiBscGJpT3V0KTsKc3RhdGljIExSRVNVTFQgRGVjb21wcmVzcyhDb2RlY0luZm8gKnBpLCBJQ0RFQ09NUFJFU1MgKnBpYywgRFdPUkQgZHdTaXplKTsKc3RhdGljIExSRVNVTFQgRGVjb21wcmVzc0VuZChDb2RlY0luZm8gKnBpKTsKc3RhdGljIExSRVNVTFQgRGVjb21wcmVzc0dldFBhbGV0dGUoQ29kZWNJbmZvICpwaSwgTFBDQklUTUFQSU5GT0hFQURFUiBscGJpSW4sCgkJCQkgICAgTFBCSVRNQVBJTkZPSEVBREVSIGxwYmlPdXQpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIHZvaWQgTG9hZFdpZGVTdHJpbmcoVUlOVCBpZCwgTFBXU1RSIHN0ciwgSU5UIGxlbikKewogIGNoYXIgc3pUZW1wWzgwXTsKCiAgTG9hZFN0cmluZ0EoTVNSTEUzMl9oTW9kdWxlLCBpZCwgc3pUZW1wLCBzaXplb2Yoc3pUZW1wKSk7CiAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIHN6VGVtcCwgLTEsIHN0ciwgbGVuKTsKfQoKc3RhdGljIEJPT0wgaXNTdXBwb3J0ZWRNUkxFKExQQ0JJVE1BUElORk9IRUFERVIgbHBiaSkKewogIC8qIHByZS1jb25kaXRpb25zICovCiAgYXNzZXJ0KGxwYmkgIT0gTlVMTCk7CgogIGlmIChscGJpLT5iaVNpemUgPCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikgfHwgXAogICAgICBscGJpLT5iaVBsYW5lcyAhPSAxKQogICAgcmV0dXJuIEZBTFNFOwoKICBpZiAobHBiaS0+YmlDb21wcmVzc2lvbiA9PSBCSV9STEU0KSB7CiAgICBpZiAobHBiaS0+YmlCaXRDb3VudCAhPSA0IHx8IFwKCShscGJpLT5iaVdpZHRoICUgMikgIT0gMCkKICAgICAgcmV0dXJuIEZBTFNFOwogIH0gZWxzZSBpZiAobHBiaS0+YmlDb21wcmVzc2lvbiA9PSBCSV9STEU4KSB7CiAgICBpZiAobHBiaS0+YmlCaXRDb3VudCAhPSA4KQogICAgICByZXR1cm4gRkFMU0U7CiAgfSBlbHNlCiAgICByZXR1cm4gRkFMU0U7CgogIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgQk9PTCAgaXNTdXBwb3J0ZWRESUIoTFBDQklUTUFQSU5GT0hFQURFUiBscGJpKQp7CiAgLyogcHJlLWNvbmRpdGlvbnMgKi8KICBhc3NlcnQobHBiaSAhPSBOVUxMKTsKCiAgLyogY2hlY2sgc3RydWN0dXJlIHZlcnNpb24vcGxhbmVzL2NvbXByZXNzaW9uICovCiAgaWYgKGxwYmktPmJpU2l6ZSA8IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSB8fAogICAgICBscGJpLT5iaVBsYW5lcyAhPSAxKQogICAgcmV0dXJuIEZBTFNFOwogIGlmIChscGJpLT5iaUNvbXByZXNzaW9uICE9IEJJX1JHQiAmJgogICAgICBscGJpLT5iaUNvbXByZXNzaW9uICE9IEJJX0JJVEZJRUxEUykKICAgIHJldHVybiBGQUxTRTsKCiAgLyogY2hlY2sgYml0LWRlcHRoICovCiAgaWYgKGxwYmktPmJpQml0Q291bnQgIT0gMSAmJgogICAgICBscGJpLT5iaUJpdENvdW50ICE9IDQgJiYKICAgICAgbHBiaS0+YmlCaXRDb3VudCAhPSA4ICYmCiAgICAgIGxwYmktPmJpQml0Q291bnQgIT0gMTUgJiYKICAgICAgbHBiaS0+YmlCaXRDb3VudCAhPSAxNiAmJgogICAgICBscGJpLT5iaUJpdENvdW50ICE9IDI0ICYmCiAgICAgIGxwYmktPmJpQml0Q291bnQgIT0gMzIpCiAgICByZXR1cm4gRkFMU0U7CgogIC8qIGNoZWNrIGZvciBzaXplKHMpICovCiAgaWYgKCFscGJpLT5iaVdpZHRoIHx8ICFscGJpLT5iaUhlaWdodCkKICAgIHJldHVybiBGQUxTRTsgLyogaW1hZ2Ugd2l0aCB6ZXJvIHNpemUsIG1ha2VzIG5vIHNlbnNlIHNvIGVycm9yICEgKi8KICBpZiAoRElCV0lEVEhCWVRFUygqbHBiaSkgKiAoRFdPUkQpbHBiaS0+YmlIZWlnaHQgPj0gKDFVTCA8PCAzMSkgLSAxKQogICAgcmV0dXJuIEZBTFNFOyAvKiBpbWFnZSB0b28gYmlnICEgKi8KCiAgLyogY2hlY2sgZm9yIG5vbi1leGlzdGVudCBjb2xvcnRhYmxlIGZvciBoaS0gYW5kIHRydWUtY29sb3IgRElCJ3MgKi8KICBpZiAobHBiaS0+YmlCaXRDb3VudCA+PSAxNSAmJiBscGJpLT5iaUNsclVzZWQgPiAwKQogICAgcmV0dXJuIEZBTFNFOwoKICByZXR1cm4gVFJVRTsKfQoKc3RhdGljIEJZVEUgTVNSTEUzMl9HZXROZWFyZXN0UGFsZXR0ZUluZGV4KFVJTlQgY291bnQsIGNvbnN0IFJHQlFVQUQgKmNscnMsIFJHQlFVQUQgY2xyKQp7CiAgSU5UICBkaWZmID0gMHgwMEZGRkZGRjsKICBVSU5UIGk7CiAgVUlOVCBpZHggPSAwOwoKICAvKiBwcmUtY29uZGl0aW9ucyAqLwogIGFzc2VydChjbHJzICE9IE5VTEwpOwoKICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgaW50IHIgPSAoKGludCljbHJzW2ldLnJnYlJlZCAgIC0gKGludCljbHIucmdiUmVkKTsKICAgIGludCBnID0gKChpbnQpY2xyc1tpXS5yZ2JHcmVlbiAtIChpbnQpY2xyLnJnYkdyZWVuKTsKICAgIGludCBiID0gKChpbnQpY2xyc1tpXS5yZ2JCbHVlICAtIChpbnQpY2xyLnJnYkJsdWUpOwoKICAgIHIgPSByKnIgKyBnKmcgKyBiKmI7CgogICAgaWYgKHIgPCBkaWZmKSB7CiAgICAgIGlkeCAgPSBpOwogICAgICBkaWZmID0gcjsKICAgICAgaWYgKGRpZmYgPT0gMCkKCWJyZWFrOwogICAgfQogIH0KCiAgcmV0dXJuIGlkeDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBjb21wdXRlSW50ZXJuYWxGcmFtZShDb2RlY0luZm8gKnBpLCBMUENCSVRNQVBJTkZPSEVBREVSIGxwYmlJbiwgTFBCWVRFIGxwSW4pCnsKICBXT1JEICAgd0ludGVuc2l0eVRibFsyNTZdOwogIERXT1JEICBsSW5MaW5lLCBsT3V0TGluZTsKICBMUFdPUkQgbHBPdXQ7CiAgVUlOVCAgIGk7CiAgTE9ORyAgIHk7CgogIC8qIHByZS1jb25kaXRpb25zICovCiAgYXNzZXJ0KHBpICE9IE5VTEwgJiYgbHBiaUluICE9IE5VTEwgJiYgbHBJbiAhPSBOVUxMKTsKICBhc3NlcnQocGktPnBDdXJGcmFtZSAhPSBOVUxMKTsKCiAgbEluTGluZSAgPSBESUJXSURUSEJZVEVTKCpscGJpSW4pOwogIGxPdXRMaW5lID0gV0lEVEhCWVRFUygoV09SRClscGJpSW4tPmJpV2lkdGggKiA4dSAqIHNpemVvZihXT1JEKSkgLyAydTsKICBscE91dCAgICA9IHBpLT5wQ3VyRnJhbWU7CgogIGFzc2VydChscGJpSW4tPmJpQ2xyVXNlZCAhPSAwKTsKCiAgewogICAgY29uc3QgUkdCUVVBRCAqbHAgPQogICAgICAoY29uc3QgUkdCUVVBRCAqKSgoY29uc3QgQllURSopbHBiaUluICsgbHBiaUluLT5iaVNpemUpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBscGJpSW4tPmJpQ2xyVXNlZDsgaSsrKQogICAgICB3SW50ZW5zaXR5VGJsW2ldID0gSW50ZW5zaXR5KGxwW2ldKTsKICB9CgogIGZvciAoeSA9IDA7IHkgPCBscGJpSW4tPmJpSGVpZ2h0OyB5KyspIHsKICAgIExPTkcgeDsKCiAgICBzd2l0Y2ggKGxwYmlJbi0+YmlCaXRDb3VudCkgewogICAgY2FzZSAxOgogICAgICBmb3IgKHggPSAwOyB4IDwgbHBiaUluLT5iaVdpZHRoIC8gODsgeCsrKSB7Cglmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQoJICBscE91dFs4ICogeCArIGldID0gd0ludGVuc2l0eVRibFsobHBJblt4XSA+PiAoNyAtIGkpKSAmIDFdOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSA0OgogICAgICBmb3IgKHggPSAwOyB4IDwgbHBiaUluLT5iaVdpZHRoIC8gMjsgeCsrKSB7CglscE91dFsyICogeCArIDBdID0gd0ludGVuc2l0eVRibFsobHBJblt4XSA+PiA0KV07CglscE91dFsyICogeCArIDFdID0gd0ludGVuc2l0eVRibFsobHBJblt4XSAmIDB4MEYpXTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgODoKICAgICAgZm9yICh4ID0gMDsgeCA8IGxwYmlJbi0+YmlXaWR0aDsgeCsrKQoJbHBPdXRbeF0gPSB3SW50ZW5zaXR5VGJsW2xwSW5beF1dOwogICAgICBicmVhazsKICAgIH0KCiAgICBscEluICArPSBsSW5MaW5lOwogICAgbHBPdXQgKz0gbE91dExpbmU7CiAgfQp9CgpzdGF0aWMgTE9ORyBNU1JMRTMyX0dldE1heENvbXByZXNzZWRTaXplKExQQ0JJVE1BUElORk9IRUFERVIgbHBiaSkKewogIExPTkcgYSwgYiwgc2l6ZTsKCiAgLyogcHJlLWNvbmRpdGlvbiAqLwogIGFzc2VydChscGJpICE9IE5VTEwpOwoKICBhID0gbHBiaS0+YmlXaWR0aCAvIDI1NTsKICBiID0gbHBiaS0+YmlXaWR0aCAlIDI1NTsKICBpZiAobHBiaS0+YmlCaXRDb3VudCA8PSA0KSB7CiAgICBhIC89IDI7CiAgICBiIC89IDI7CiAgfQoKICBzaXplID0gKDIgKyBhICogKDIgKyAoKGEgKyAyKSAmIH4yKSkgKyBiICogKDIgKyAoKGIgKyAyKSAmIH4yKSkpOwogIHJldHVybiBzaXplICogbHBiaS0+YmlIZWlnaHQ7Cn0KCi8qIGxwUCA9PiBjdXJyZW50ICBwb3MgaW4gcHJldmlvdXMgZnJhbWUKICogbHBBID0+IHByZXZpb3VzIHBvcyBpbiBjdXJyZW50ICBmcmFtZQogKiBscEIgPT4gY3VycmVudCAgcG9zIGluIGN1cnJlbnQgIGZyYW1lCiAqLwpzdGF0aWMgSU5UIGNvdW50RGlmZlJMRTQoTFBXT1JEIGxwUCwgTFBXT1JEIGxwQSwgTFBXT1JEIGxwQiwgSU5UIHBvcywgTE9ORyBsRGlzdCwgTE9ORyB3aWR0aCkKewogIElOVCAgY291bnQ7CiAgV09SRCBjbHIxLCBjbHIyOwoKICAvKiBwcmUtY29uZGl0aW9ucyAqLwogIGFzc2VydChscEEgJiYgbHBCICYmIGxEaXN0ID49IDAgJiYgd2lkdGggPiAwKTsKCiAgaWYgKHBvcyA+PSB3aWR0aCkKICAgIHJldHVybiAwOwogIGlmIChwb3MrMSA9PSB3aWR0aCkKICAgIHJldHVybiAxOwoKICBjbHIxID0gbHBCW3BvcysrXTsKICBjbHIyID0gbHBCW3Bvc107CgogIGNvdW50ID0gMjsKICB3aGlsZSAocG9zICsgMSA8IHdpZHRoKSB7CiAgICBXT1JEIGNscjMsIGNscjQ7CgogICAgY2xyMyA9IGxwQlsrK3Bvc107CiAgICBpZiAocG9zICsgMSA+PSB3aWR0aCkKICAgICAgcmV0dXJuIGNvdW50ICsgMTsKCiAgICBjbHI0ID0gbHBCWysrcG9zXTsKICAgIGlmIChDb2xvckNtcChjbHIxLCBjbHIzKSA8PSBsRGlzdCAmJgoJQ29sb3JDbXAoY2xyMiwgY2xyNCkgPD0gbERpc3QpIHsKICAgICAgLyogZGlmZiBhdCBlbmQ/IC0tIGxvb2stYWhlYWQgZm9yIGF0IGxlYXN0ID8/IG1vcmUgZW5jb2RhYmxlIHBpeGVscyAqLwogICAgICBpZiAocG9zICsgMiA8IHdpZHRoICYmIENvbG9yQ21wKGNscjEsbHBCW3BvcysxXSkgPD0gbERpc3QgJiYKCSAgQ29sb3JDbXAoY2xyMixscEJbcG9zKzJdKSA8PSBsRGlzdCkgewoJaWYgKHBvcyArIDQgPCB3aWR0aCAmJiBDb2xvckNtcChscEJbcG9zKzFdLGxwQltwb3MrM10pIDw9IGxEaXN0ICYmCgkgICAgQ29sb3JDbXAobHBCW3BvcysyXSxscEJbcG9zKzRdKSA8PSBsRGlzdCkKCSAgcmV0dXJuIGNvdW50IC0gMzsgLyogZm9sbG93ZWQgYnkgYXQgbGVhc3QgNCBlbmNvZGFibGUgcGl4ZWxzICovCglyZXR1cm4gY291bnQgLSAyOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGxwUCAhPSBOVUxMICYmIENvbG9yQ21wKGxwUFtwb3NdLCBscEJbcG9zXSkgPD0gbERpc3QpIHsKICAgICAgLyogJ2NvbXBhcmUnIHdpdGggcHJldmlvdXMgZnJhbWUgZm9yIGVuZCBvZiBkaWZmICovCiAgICAgIElOVCBjb3VudDIgPSAwOwoKICAgICAgLyogRklYTUUgKi8KCiAgICAgIGlmIChjb3VudDIgPj0gOCkKCXJldHVybiBjb3VudDsKCiAgICAgIHBvcyAtPSBjb3VudDI7CiAgICB9CgogICAgY291bnQgKz0gMjsKICAgIGNscjEgPSBjbHIzOwogICAgY2xyMiA9IGNscjQ7CiAgfQoKICByZXR1cm4gY291bnQ7Cn0KCi8qIGxwUCA9PiBjdXJyZW50ICBwb3MgaW4gcHJldmlvdXMgZnJhbWUKICogbHBBID0+IHByZXZpb3VzIHBvcyBpbiBjdXJyZW50ICBmcmFtZQogKiBscEIgPT4gY3VycmVudCAgcG9zIGluIGN1cnJlbnQgIGZyYW1lCiAqLwpzdGF0aWMgSU5UIGNvdW50RGlmZlJMRTgoTFBXT1JEIGxwUCwgTFBXT1JEIGxwQSwgTFBXT1JEIGxwQiwgSU5UIHBvcywgTE9ORyBsRGlzdCwgTE9ORyB3aWR0aCkKewogIElOVCBjb3VudDsKCiAgZm9yIChjb3VudCA9IDA7IHBvcyA8IHdpZHRoOyBwb3MrKywgY291bnQrKykgewogICAgaWYgKENvbG9yQ21wKGxwQVtwb3NdLCBscEJbcG9zXSkgPD0gbERpc3QpIHsKICAgICAgLyogZGlmZiBhdCBlbmQ/IC0tIGxvb2stYWhlYWQgZm9yIHNvbWUgbW9yZSBlbmNvZGFibGUgcGl4ZWwgKi8KICAgICAgaWYgKHBvcyArIDEgPCB3aWR0aCAmJiBDb2xvckNtcChscEJbcG9zXSwgbHBCW3BvcysxXSkgPD0gbERpc3QpCglyZXR1cm4gY291bnQgLSAxOwogICAgICBpZiAocG9zICsgMiA8IHdpZHRoICYmIENvbG9yQ21wKGxwQltwb3MrMV0sIGxwQltwb3MrMl0pIDw9IGxEaXN0KQoJcmV0dXJuIGNvdW50IC0gMTsKICAgIH0gZWxzZSBpZiAobHBQICE9IE5VTEwgJiYgQ29sb3JDbXAobHBQW3Bvc10sIGxwQltwb3NdKSA8PSBsRGlzdCkgewogICAgICAvKiAnY29tcGFyZScgd2l0aCBwcmV2aW91cyBmcmFtZSBmb3IgZW5kIG9mIGRpZmYgKi8KICAgICAgSU5UIGNvdW50MiA9IDA7CgogICAgICBmb3IgKGNvdW50MiA9IDAsIHBvcysrOyBwb3MgPCB3aWR0aCAmJiBjb3VudDIgPD0gNTsgcG9zKyssIGNvdW50MisrKSB7CglpZiAoQ29sb3JDbXAobHBQW3Bvc10sIGxwQltwb3NdKSA+IGxEaXN0KQoJICBicmVhazsKICAgICAgfQogICAgICBpZiAoY291bnQyID4gNCkKCXJldHVybiBjb3VudDsKCiAgICAgIHBvcyAtPSBjb3VudDI7CiAgICB9CiAgfQoKICByZXR1cm4gY291bnQ7Cn0KCnN0YXRpYyBJTlQgTVNSTEUzMl9Db21wcmVzc1JMRTRMaW5lKENvZGVjSW5mbyAqcGksIExQV09SRCBscFAsIExQV09SRCBscEMsIExQQ0JJVE1BUElORk9IRUFERVIgbHBiaSwgQllURSAqbHBJbiwgTE9ORyBsRGlzdCwgSU5UIHgsIExQQllURSAqcHBPdXQsIERXT1JEICpscFNpemVJbWFnZSkKewogIExQQllURSBscE91dCA9ICpwcE91dDsKICBJTlQgICAgY291bnQsIHBvczsKICBXT1JEICAgY2xyMSwgY2xyMjsKCiAgLyogdHJ5IHRvIGVuY29kZSBhcyBtYW55IHBpeGVsIGFzIHBvc3NpYmxlICovCiAgY291bnQgPSAxOwogIHBvcyAgID0geDsKICBjbHIxICA9IGxwQ1twb3MrK107CiAgaWYgKHBvcyA8IGxwYmktPmJpV2lkdGgpIHsKICAgIGNscjIgPSBscENbcG9zXTsKICAgIGZvciAoKytjb3VudDsgcG9zICsgMSA8IGxwYmktPmJpV2lkdGg7ICkgewogICAgICArK3BvczsKICAgICAgaWYgKENvbG9yQ21wKGNscjEsIGxwQ1twb3NdKSA+IGxEaXN0KQoJYnJlYWs7CiAgICAgIGNvdW50Kys7CiAgICAgIGlmIChwb3MgKyAxID49IGxwYmktPmJpV2lkdGgpCglicmVhazsKICAgICAgKytwb3M7CiAgICAgIGlmIChDb2xvckNtcChjbHIyLCBscENbcG9zXSkgPiBsRGlzdCkKCWJyZWFrOwogICAgICBjb3VudCsrOwogICAgfQogIH0KCiAgaWYgKGNvdW50IDwgNCkgewogICAgLyogYWRkIHNvbWUgcGl4ZWwgZm9yIGFic29sdXRpbmcgaWYgcG9zc2libGUgKi8KICAgIGNvdW50ICs9IGNvdW50RGlmZlJMRTQobHBQLCBscEMgLSAxLCBscEMsIHBvcy0xLCBsRGlzdCwgbHBiaS0+YmlXaWR0aCk7CgogICAgYXNzZXJ0KGNvdW50ID4gMCk7CgogICAgLyogY2hlY2sgZm9yIG5lYXIgZW5kIG9mIGxpbmUgKi8KICAgIGlmICh4ICsgY291bnQgPiBscGJpLT5iaVdpZHRoKQogICAgICBjb3VudCA9IGxwYmktPmJpV2lkdGggLSB4OwoKICAgIC8qIGFic29sdXRlIHBpeGVsKHMpIGluIGdyb3VwcyBvZiBhdCBsZWFzdCAzIGFuZCBhdCBtb3N0IDI1NCBwaXhlbHMgKi8KICAgIHdoaWxlIChjb3VudCA+IDIpIHsKICAgICAgSU5UICBpOwogICAgICBJTlQgIHNpemUgICAgICAgPSBtaW4oY291bnQsIDI1NCk7CiAgICAgIGludCAgYnl0ZXMgICAgICA9ICgoc2l6ZSArIDEpICYgKH4xKSkgLyAyOwogICAgICBCT09MIGV4dHJhX2J5dGUgPSBieXRlcyAmIDB4MDE7CgogICAgICAqbHBTaXplSW1hZ2UgKz0gMiArIGJ5dGVzICsgZXh0cmFfYnl0ZTsKICAgICAgYXNzZXJ0KCgoKmxwU2l6ZUltYWdlKSAlIDIpID09IDApOwogICAgICBjb3VudCAtPSBzaXplOwogICAgICAqbHBPdXQrKyA9IDA7CiAgICAgICpscE91dCsrID0gc2l6ZTsKICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gMikgewoJY2xyMSA9IHBpLT5wYWxldHRlX21hcFtHZXRSYXdQaXhlbChscGJpLGxwSW4seCldOwoJeCsrOwoJaWYgKGkgKyAxIDwgc2l6ZSkgewoJICBjbHIyID0gcGktPnBhbGV0dGVfbWFwW0dldFJhd1BpeGVsKGxwYmksbHBJbix4KV07CgkgIHgrKzsKCX0gZWxzZQoJICBjbHIyID0gMDsKCgkqbHBPdXQrKyA9IChjbHIxIDw8IDQpIHwgY2xyMjsKICAgICAgfQogICAgICBpZiAoZXh0cmFfYnl0ZSkKCSpscE91dCsrID0gMDsKICAgIH0KCiAgICBpZiAoY291bnQgPiAwKSB7CiAgICAgIC8qIHRvbyBsaXR0bGUgZm9yIGFic29sdXRpbmcgc28gd2UgbXVzdCBlbmNvZGUgdGhlbSAqLwogICAgICBhc3NlcnQoY291bnQgPD0gMik7CgogICAgICAqbHBTaXplSW1hZ2UgKz0gMjsKICAgICAgY2xyMSA9IHBpLT5wYWxldHRlX21hcFtHZXRSYXdQaXhlbChscGJpLGxwSW4seCldOwogICAgICB4Kys7CiAgICAgIGlmIChjb3VudCA9PSAyKSB7CgljbHIyID0gcGktPnBhbGV0dGVfbWFwW0dldFJhd1BpeGVsKGxwYmksbHBJbix4KV07Cgl4Kys7CiAgICAgIH0gZWxzZQoJY2xyMiA9IDA7CiAgICAgICpscE91dCsrID0gY291bnQ7CiAgICAgICpscE91dCsrID0gKGNscjEgPDwgNCkgfCBjbHIyOwogICAgfQogIH0gZWxzZSB7CiAgICAvKiBlbmNvZGUgY291bnQgcGl4ZWwocykgKi8KICAgIGNscjEgPSAoKHBpLT5wYWxldHRlX21hcFtHZXRSYXdQaXhlbChscGJpLGxwSW4seCldIDw8IDQpIHwKCSAgICBwaS0+cGFsZXR0ZV9tYXBbR2V0UmF3UGl4ZWwobHBiaSxscEluLHggKyAxKV0pOwoKICAgIHggKz0gY291bnQ7CiAgICB3aGlsZSAoY291bnQgPiAwKSB7CiAgICAgIElOVCBzaXplID0gbWluKGNvdW50LCAyNTQpOwoKICAgICAgKmxwU2l6ZUltYWdlICs9IDI7CiAgICAgIGNvdW50ICAgIC09IHNpemU7CiAgICAgICpscE91dCsrICA9IHNpemU7CiAgICAgICpscE91dCsrICA9IGNscjE7CiAgICB9CiAgfQoKICAqcHBPdXQgPSBscE91dDsKCiAgcmV0dXJuIHg7Cn0KCnN0YXRpYyBJTlQgTVNSTEUzMl9Db21wcmVzc1JMRThMaW5lKENvZGVjSW5mbyAqcGksIExQV09SRCBscFAsIExQV09SRCBscEMsIExQQ0JJVE1BUElORk9IRUFERVIgbHBiaSwgQllURSAqbHBJbiwgTE9ORyBsRGlzdCwgSU5UIHgsIExQQllURSAqcHBPdXQsIERXT1JEICpscFNpemVJbWFnZSkKewogIExQQllURSBscE91dCA9ICpwcE91dDsKICBJTlQgICAgY291bnQsIHBvczsKICBXT1JEICAgY2xyOwoKICBhc3NlcnQobHBiaS0+YmlCaXRDb3VudCA8PSA4KTsKICBhc3NlcnQobHBiaS0+YmlDb21wcmVzc2lvbiA9PSBCSV9SR0IpOwoKICAvKiB0cnkgdG8gZW5jb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgKi8KICBwb3MgPSB4OwogIGNsciA9IGxwQ1twb3MrK107CiAgZm9yIChjb3VudCA9IDE7IHBvcyA8IGxwYmktPmJpV2lkdGg7IGNvdW50KyspIHsKICAgIGlmIChDb2xvckNtcChjbHIsIGxwQ1twb3MrK10pID4gbERpc3QpCiAgICAgIGJyZWFrOwogIH0KCiAgaWYgKGNvdW50IDwgMikgewogICAgLyogYWRkIHNvbWUgbW9yZSBwaXhlbHMgZm9yIGFic29sdXRpbmcgaWYgcG9zc2libGUgKi8KICAgIGNvdW50ICs9IGNvdW50RGlmZlJMRTgobHBQLCBscEMgLSAxLCBscEMsIHBvcy0xLCBsRGlzdCwgbHBiaS0+YmlXaWR0aCk7CgogICAgYXNzZXJ0KGNvdW50ID4gMCk7CgogICAgLyogY2hlY2sgZm9yIG92ZXIgZW5kIG9mIGxpbmUgKi8KICAgIGlmICh4ICsgY291bnQgPiBscGJpLT5iaVdpZHRoKQogICAgICBjb3VudCA9IGxwYmktPmJpV2lkdGggLSB4OwoKICAgIC8qIGFic29sdXRlIHBpeGVsKHMpIGluIGdyb3VwcyBvZiBhdCBsZWFzdCAzIGFuZCBhdCBtb3N0IDI1NSBwaXhlbHMgKi8KICAgIHdoaWxlIChjb3VudCA+IDIpIHsKICAgICAgSU5UICBpOwogICAgICBJTlQgIHNpemUgICAgICAgPSBtaW4oY291bnQsIDI1NSk7CiAgICAgIEJPT0wgZXh0cmFfYnl0ZSA9IHNpemUgJSAyOwoKICAgICAgKmxwU2l6ZUltYWdlICs9IDIgKyBzaXplICsgZXh0cmFfYnl0ZTsKICAgICAgY291bnQgLT0gc2l6ZTsKICAgICAgKmxwT3V0KysgPSAwOwogICAgICAqbHBPdXQrKyA9IHNpemU7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCSpscE91dCsrID0gcGktPnBhbGV0dGVfbWFwW0dldFJhd1BpeGVsKGxwYmksbHBJbix4KV07Cgl4Kys7CiAgICAgIH0KICAgICAgaWYgKGV4dHJhX2J5dGUpCgkqbHBPdXQrKyA9IDA7CiAgICB9CiAgICBpZiAoY291bnQgPiAwKSB7CiAgICAgIC8qIHRvbyBsaXR0bGUgZm9yIGFic29sdXRpbmcgc28gd2UgbXVzdCBlbmNvZGUgdGhlbSBldmVuIGlmIGl0J3MgZXhwZW5zaXZlISAqLwogICAgICBhc3NlcnQoY291bnQgPD0gMik7CgogICAgICAqbHBTaXplSW1hZ2UgKz0gMiAqIGNvdW50OwogICAgICAqbHBPdXQrKyA9IDE7CiAgICAgICpscE91dCsrID0gcGktPnBhbGV0dGVfbWFwW0dldFJhd1BpeGVsKGxwYmksbHBJbix4KV07CiAgICAgIHgrKzsKCiAgICAgIGlmIChjb3VudCA9PSAyKSB7CgkqbHBPdXQrKyA9IDE7CgkqbHBPdXQrKyA9IHBpLT5wYWxldHRlX21hcFtHZXRSYXdQaXhlbChscGJpLGxwSW4seCldOwoJeCsrOwogICAgICB9CiAgICB9CiAgfSBlbHNlIHsKICAgIC8qIGVuY29kZSBjb3VudCBwaXhlbChzKSAqLwogICAgY2xyID0gcGktPnBhbGV0dGVfbWFwW0dldFJhd1BpeGVsKGxwYmksbHBJbix4KV07CgogICAgLyogb3B0aW1pemUgZW5kIG9mIGxpbmUgKi8KICAgIGlmICh4ICsgY291bnQgKyAxID09IGxwYmktPmJpV2lkdGgpCiAgICAgIGNvdW50Kys7CgogICAgeCArPSBjb3VudDsKICAgIHdoaWxlIChjb3VudCA+IDApIHsKICAgICAgSU5UIHNpemUgPSBtaW4oY291bnQsIDI1NSk7CgogICAgICAqbHBTaXplSW1hZ2UgKz0gMjsKICAgICAgY291bnQgICAgLT0gc2l6ZTsKICAgICAgKmxwT3V0KysgID0gc2l6ZTsKICAgICAgKmxwT3V0KysgID0gY2xyOwogICAgfQogIH0KCiAgKnBwT3V0ID0gbHBPdXQ7CgogIHJldHVybiB4Owp9CgpMUkVTVUxUIE1TUkxFMzJfQ29tcHJlc3NSTEU0KENvZGVjSW5mbyAqcGksIExQQklUTUFQSU5GT0hFQURFUiBscGJpSW4sIExQQllURSBscEluLCBMUEJJVE1BUElORk9IRUFERVIgbHBiaU91dCwgTFBCWVRFIGxwT3V0LCBCT09MIGlzS2V5KQp7CiAgTFBXT1JEIGxwQzsKICBMT05HICAgbExpbmUsIGxJbkxpbmUsIGxEaXN0OwogIExQQllURSBscE91dFN0YXJ0ID0gbHBPdXQ7CgogIC8qIHByZS1jb25kaXRpb25zICovCiAgYXNzZXJ0KHBpICE9IE5VTEwgJiYgbHBiaU91dCAhPSBOVUxMKTsKICBhc3NlcnQobHBJbiAhPSBOVUxMICYmIGxwT3V0ICE9IE5VTEwpOwogIGFzc2VydChwaS0+cEN1ckZyYW1lICE9IE5VTEwpOwoKICBscEMgICAgICA9IHBpLT5wQ3VyRnJhbWU7CiAgbERpc3QgICAgPSBRVUFMSVRZX3RvX0RJU1QocGktPmR3UXVhbGl0eSk7CiAgbEluTGluZSAgPSBESUJXSURUSEJZVEVTKCpscGJpSW4pOwogIGxMaW5lICAgID0gV0lEVEhCWVRFUyhscGJpT3V0LT5iaVdpZHRoICogMTYpIC8gMjsKCiAgbHBiaU91dC0+YmlTaXplSW1hZ2UgPSAwOwogIGlmIChpc0tleSkgewogICAgLyoga2V5ZnJhbWUgLS0gY29udmVydCBpbnRlcm5hbCBmcmFtZSB0byBvdXRwdXQgZm9ybWF0ICovCiAgICBJTlQgeCwgeTsKCiAgICBmb3IgKHkgPSAwOyB5IDwgbHBiaU91dC0+YmlIZWlnaHQ7IHkrKykgewogICAgICB4ID0gMDsKCiAgICAgIGRvIHsKCXggPSBNU1JMRTMyX0NvbXByZXNzUkxFNExpbmUocGksIE5VTEwsIGxwQywgbHBiaUluLCBscEluLCBsRGlzdCwgeCwKCQkJCSAgICAgJmxwT3V0LCAmbHBiaU91dC0+YmlTaXplSW1hZ2UpOwogICAgICB9IHdoaWxlICh4IDwgbHBiaU91dC0+YmlXaWR0aCk7CgogICAgICBscEMgICArPSBsTGluZTsKICAgICAgbHBJbiAgKz0gbEluTGluZTsKCiAgICAgIC8qIGFkZCBFT0wgLS0gZW5kIG9mIGxpbmUgKi8KICAgICAgbHBiaU91dC0+YmlTaXplSW1hZ2UgKz0gMjsKICAgICAgKihMUFdPUkQpbHBPdXQgPSAwOwogICAgICBscE91dCArPSBzaXplb2YoV09SRCk7CiAgICAgIGFzc2VydChscE91dCA9PSAobHBPdXRTdGFydCArIGxwYmlPdXQtPmJpU2l6ZUltYWdlKSk7CiAgICB9CiAgfSBlbHNlIHsKICAgIC8qIGRlbHRhLWZyYW1lIC0tIGNvbXB1dGUgZGVsdGEgYmV0d2VlbiBsYXN0IGFuZCB0aGlzIGludGVybmFsIGZyYW1lICovCiAgICBMUFdPUkQgbHBQOwogICAgSU5UICAgIHgsIHk7CiAgICBJTlQgICAganVtcHgsIGp1bXB5OwoKICAgIGFzc2VydChwaS0+cFByZXZGcmFtZSAhPSBOVUxMKTsKCiAgICBscFAgICA9IHBpLT5wUHJldkZyYW1lOwogICAganVtcHkgPSAwOwogICAganVtcHggPSAtMTsKCiAgICBmb3IgKHkgPSAwOyB5IDwgbHBiaU91dC0+YmlIZWlnaHQ7IHkrKykgewogICAgICB4ID0gMDsKCiAgICAgIGRvIHsKCUlOVCBjb3VudCwgcG9zOwoKCWlmIChqdW1weCA9PSAtMSkKCSAganVtcHggPSB4OwoJZm9yIChjb3VudCA9IDAsIHBvcyA9IHg7IHBvcyA8IGxwYmlPdXQtPmJpV2lkdGg7IHBvcysrLCBjb3VudCsrKSB7CgkgIGlmIChDb2xvckNtcChscFBbcG9zXSwgbHBDW3Bvc10pID4gbERpc3QpCgkgICAgYnJlYWs7Cgl9CgoJaWYgKHBvcyA9PSBscGJpT3V0LT5iaVdpZHRoICYmIGNvdW50ID4gOCkgewoJICAvKiAoY291bnQgPiA4KSBzZWN1cmVzIHRoYXQgd2Ugd2lsbCBzYXZlIHNwYWNlICovCgkgIGp1bXB5Kys7CgkgIGJyZWFrOwoJfSBlbHNlIGlmIChqdW1weSB8fCBqdW1weCAhPSBwb3MpIHsKCSAgLyogdGltZSB0byBqdW1wICovCgkgIGFzc2VydChqdW1weCAhPSAtMSk7CgoJICBpZiAocG9zIDwganVtcHgpIHsKCSAgICAvKiBjYW4gb25seSBqdW1wIGluIHBvc2l0aXZlIGRpcmVjdGlvbiAtLSBqdW1wIHVudGlsIEVPTCwgRU9MICovCgkgICAgSU5UIHcgPSBscGJpT3V0LT5iaVdpZHRoIC0ganVtcHg7CgoJICAgIGFzc2VydChqdW1weSA+IDApOwoJICAgIGFzc2VydCh3ID49IDQpOwoKCSAgICBqdW1weCA9IDA7CgkgICAganVtcHktLTsKCSAgICAvKiBpZiAodyAlIDI1NSA9PSAyKSB0aGVuIGVxdWFsIGNvc3RzCgkgICAgICogZWxzZSBpZiAodyAlIDI1NSA8IDQgJiYgd2UgY291bGQgZW5jb2RlIGFsbCkgdGhlbiAyIGJ5dGVzIHRvbyBleHBlbnNpdmUKCSAgICAgKiBlbHNlIGl0IHdpbGwgYmUgY2hlYXBlcgoJICAgICAqLwoJICAgIHdoaWxlICh3ID4gMCkgewoJICAgICAgbHBiaU91dC0+YmlTaXplSW1hZ2UgKz0gNDsKCSAgICAgICpscE91dCsrID0gMDsKCSAgICAgICpscE91dCsrID0gMjsKCSAgICAgICpscE91dCAgID0gbWluKHcsIDI1NSk7CgkgICAgICB3ICAgICAgIC09ICpscE91dCsrOwoJICAgICAgKmxwT3V0KysgPSAwOwoJICAgIH0KCSAgICAvKiBhZGQgRU9MIC0tIGVuZCBvZiBsaW5lICovCgkgICAgbHBiaU91dC0+YmlTaXplSW1hZ2UgKz0gMjsKCSAgICAqKChMUFdPUkQpbHBPdXQpID0gMDsKCSAgICBscE91dCArPSBzaXplb2YoV09SRCk7CgkgIH0KCgkgIC8qIEZJWE1FOiBpZiAoanVtcHkgPT0gMCAmJiBjb3VsZCBlbmNvZGUgYWxsKSB0aGVuIGp1bXAgdG9vIGV4cGVuc2l2ZSAqLwoKCSAgLyogd3JpdGUgb3V0IHJlYWwganVtcChzKSAqLwoJICB3aGlsZSAoanVtcHkgfHwgcG9zICE9IGp1bXB4KSB7CgkgICAgbHBiaU91dC0+YmlTaXplSW1hZ2UgKz0gNDsKCSAgICAqbHBPdXQrKyA9IDA7CgkgICAgKmxwT3V0KysgPSAyOwoJICAgICpscE91dCAgID0gbWluKHBvcyAtIGp1bXB4LCAyNTUpOwoJICAgIHggICAgICAgKz0gKmxwT3V0OwoJICAgIGp1bXB4ICAgKz0gKmxwT3V0Kys7CgkgICAgKmxwT3V0ICAgPSBtaW4oanVtcHksIDI1NSk7CgkgICAganVtcHkgICAtPSAqbHBPdXQrKzsKCSAgfQoKCSAganVtcHkgPSAwOwoJfQoKCWp1bXB4ID0gLTE7CgoJaWYgKHggPCBscGJpT3V0LT5iaVdpZHRoKSB7CgkgIC8qIHNraXBwZWQgdGhlICdzYW1lJyB0aGluZ3MgY29ycmVzcG9uZGluZyB0byBwcmV2aW91cyBmcmFtZSAqLwoJICB4ID0gTVNSTEUzMl9Db21wcmVzc1JMRTRMaW5lKHBpLCBscFAsIGxwQywgbHBiaUluLCBscEluLCBsRGlzdCwgeCwKCQkJICAgICAgICZscE91dCwgJmxwYmlPdXQtPmJpU2l6ZUltYWdlKTsKCX0KICAgICAgfSB3aGlsZSAoeCA8IGxwYmlPdXQtPmJpV2lkdGgpOwoKICAgICAgbHBQICAgKz0gbExpbmU7CiAgICAgIGxwQyAgICs9IGxMaW5lOwogICAgICBscEluICArPSBsSW5MaW5lOwoKICAgICAgaWYgKGp1bXB5ID09IDApIHsKCWFzc2VydChqdW1weCA9PSAtMSk7CgoJLyogYWRkIEVPTCAtLSBlbmQgb2YgbGluZSAqLwoJbHBiaU91dC0+YmlTaXplSW1hZ2UgKz0gMjsKCSooKExQV09SRClscE91dCkgPSAwOwogICAgICAgIGxwT3V0ICs9IHNpemVvZihXT1JEKTsKCWFzc2VydChscE91dCA9PSBscE91dFN0YXJ0ICsgbHBiaU91dC0+YmlTaXplSW1hZ2UpOwogICAgICB9CiAgICB9CgogICAgLyogYWRkIEVPTCAtLSB3aWxsIGJlIGNoYW5nZWQgdG8gRU9JICovCiAgICBscGJpT3V0LT5iaVNpemVJbWFnZSArPSAyOwogICAgKigoTFBXT1JEKWxwT3V0KSA9IDA7CiAgICBscE91dCArPSBzaXplb2YoV09SRCk7CiAgfQoKICAvKiBjaGFuZ2UgRU9MIHRvIEVPSSAtLSBlbmQgb2YgaW1hZ2UgKi8KICBscE91dFstMV0gPSAxOwogIGFzc2VydChscE91dCA9PSAobHBPdXRTdGFydCArIGxwYmlPdXQtPmJpU2l6ZUltYWdlKSk7CgogIHJldHVybiBJQ0VSUl9PSzsKfQoKTFJFU1VMVCBNU1JMRTMyX0NvbXByZXNzUkxFOChDb2RlY0luZm8gKnBpLCBMUEJJVE1BUElORk9IRUFERVIgbHBiaUluLCBMUEJZVEUgbHBJbiwgTFBCSVRNQVBJTkZPSEVBREVSIGxwYmlPdXQsIExQQllURSBscE91dCwgQk9PTCBpc0tleSkKewogIExQV09SRCBscEM7CiAgTE9ORyAgIGxEaXN0LCBsSW5MaW5lLCBsTGluZTsKICBMUEJZVEUgbHBPdXRTdGFydCA9IGxwT3V0OwoKICBhc3NlcnQocGkgIT0gTlVMTCAmJiBscGJpT3V0ICE9IE5VTEwpOwogIGFzc2VydChscEluICE9IE5VTEwgJiYgbHBPdXQgIT0gTlVMTCk7CiAgYXNzZXJ0KHBpLT5wQ3VyRnJhbWUgIT0gTlVMTCk7CgogIGxwQyAgICAgPSBwaS0+cEN1ckZyYW1lOwogIGxEaXN0ICAgPSBRVUFMSVRZX3RvX0RJU1QocGktPmR3UXVhbGl0eSk7CiAgbEluTGluZSA9IERJQldJRFRIQllURVMoKmxwYmlJbik7CiAgbExpbmUgICA9IFdJRFRIQllURVMobHBiaU91dC0+YmlXaWR0aCAqIDE2KSAvIDI7CgogIGxwYmlPdXQtPmJpU2l6ZUltYWdlID0gMDsKICBpZiAoaXNLZXkpIHsKICAgIC8qIGtleWZyYW1lIC0tIGNvbnZlcnQgaW50ZXJuYWwgZnJhbWUgdG8gb3V0cHV0IGZvcm1hdCAqLwogICAgSU5UIHgsIHk7CgogICAgZm9yICh5ID0gMDsgeSA8IGxwYmlPdXQtPmJpSGVpZ2h0OyB5KyspIHsKICAgICAgeCA9IDA7CgogICAgICBkbyB7Cgl4ID0gTVNSTEUzMl9Db21wcmVzc1JMRThMaW5lKHBpLCBOVUxMLCBscEMsIGxwYmlJbiwgbHBJbiwgbERpc3QsIHgsCgkJCSAgICAgJmxwT3V0LCAmbHBiaU91dC0+YmlTaXplSW1hZ2UpOwoJYXNzZXJ0KGxwT3V0ID09IChscE91dFN0YXJ0ICsgbHBiaU91dC0+YmlTaXplSW1hZ2UpKTsKICAgICAgfSB3aGlsZSAoeCA8IGxwYmlPdXQtPmJpV2lkdGgpOwoKICAgICAgbHBDICArPSBsTGluZTsKICAgICAgbHBJbiArPSBsSW5MaW5lOwoKICAgICAgLyogYWRkIEVPTCAtLSBlbmQgb2YgbGluZSAqLwogICAgICBscGJpT3V0LT5iaVNpemVJbWFnZSArPSAyOwogICAgICAqKChMUFdPUkQpbHBPdXQpID0gMDsKICAgICAgbHBPdXQgKz0gc2l6ZW9mKFdPUkQpOwogICAgICBhc3NlcnQobHBPdXQgPT0gKGxwT3V0U3RhcnQgKyBscGJpT3V0LT5iaVNpemVJbWFnZSkpOwogICAgfQogIH0gZWxzZSB7CiAgICAvKiBkZWx0YS1mcmFtZSAtLSBjb21wdXRlIGRlbHRhIGJldHdlZW4gbGFzdCBhbmQgdGhpcyBpbnRlcm5hbCBmcmFtZSAqLwogICAgTFBXT1JEIGxwUDsKICAgIElOVCAgICB4LCB5OwogICAgSU5UICAgIGp1bXB4LCBqdW1weTsKCiAgICBhc3NlcnQocGktPnBQcmV2RnJhbWUgIT0gTlVMTCk7CgogICAgbHBQICAgPSBwaS0+cFByZXZGcmFtZTsKICAgIGp1bXB4ID0gLTE7CiAgICBqdW1weSA9IDA7CgogICAgZm9yICh5ID0gMDsgeSA8IGxwYmlPdXQtPmJpSGVpZ2h0OyB5KyspIHsKICAgICAgeCA9IDA7CgogICAgICBkbyB7CglJTlQgY291bnQsIHBvczsKCglpZiAoanVtcHggPT0gLTEpCgkgIGp1bXB4ID0geDsKCWZvciAoY291bnQgPSAwLCBwb3MgPSB4OyBwb3MgPCBscGJpT3V0LT5iaVdpZHRoOyBwb3MrKywgY291bnQrKykgewoJICBpZiAoQ29sb3JDbXAobHBQW3Bvc10sIGxwQ1twb3NdKSA+IGxEaXN0KQoJICAgIGJyZWFrOwoJfQoKCWlmIChwb3MgPT0gbHBiaU91dC0+YmlXaWR0aCAmJiBjb3VudCA+IDQpIHsKCSAgLyogKGNvdW50ID4gNCkgc2VjdXJlcyB0aGF0IHdlIHdpbGwgc2F2ZSBzcGFjZSAqLwoJICBqdW1weSsrOwoJICBicmVhazsKCX0gZWxzZSBpZiAoanVtcHkgfHwganVtcHggIT0gcG9zKSB7CgkgIC8qIHRpbWUgdG8ganVtcCAqLwoJICBhc3NlcnQoanVtcHggIT0gLTEpOwoKCSAgaWYgKHBvcyA8IGp1bXB4KSB7CgkgICAgLyogY2FuIG9ubHkganVtcCBpbiBwb3NpdGl2ZSBkaXJlY3Rpb24gLS0gZG8gYSBFT0wgdGhlbiBqdW1wICovCgkgICAgYXNzZXJ0KGp1bXB5ID4gMCk7CgoJICAgIGp1bXB4ID0gMDsKCSAgICBqdW1weS0tOwoKCSAgICAvKiBhZGQgRU9MIC0tIGVuZCBvZiBsaW5lICovCgkgICAgbHBiaU91dC0+YmlTaXplSW1hZ2UgKz0gMjsKCSAgICAqKChMUFdPUkQpbHBPdXQpID0gMDsKCSAgICBscE91dCArPSBzaXplb2YoV09SRCk7CgkgICAgYXNzZXJ0KGxwT3V0ID09IChscE91dFN0YXJ0ICsgbHBiaU91dC0+YmlTaXplSW1hZ2UpKTsKCSAgfQoKCSAgLyogRklYTUU6IGlmIChqdW1weSA9PSAwICYmIGNvdWxkIGVuY29kZSBhbGwpIHRoZW4ganVtcCB0b28gZXhwZW5zaXZlICovCgoJICAvKiB3cml0ZSBvdXQgcmVhbCBqdW1wKHMpICovCgkgIHdoaWxlIChqdW1weSB8fCBwb3MgIT0ganVtcHgpIHsKCSAgICBscGJpT3V0LT5iaVNpemVJbWFnZSArPSA0OwoJICAgICpscE91dCsrID0gMDsKCSAgICAqbHBPdXQrKyA9IDI7CgkgICAgKmxwT3V0ICAgPSBtaW4ocG9zIC0ganVtcHgsIDI1NSk7CgkgICAganVtcHggICArPSAqbHBPdXQrKzsKCSAgICAqbHBPdXQgICA9IG1pbihqdW1weSwgMjU1KTsKCSAgICBqdW1weSAgIC09ICpscE91dCsrOwoJICB9CgkgIHggPSBwb3M7CgoJICBqdW1weSA9IDA7Cgl9CgoJanVtcHggPSAtMTsKCglpZiAoeCA8IGxwYmlPdXQtPmJpV2lkdGgpIHsKCSAgLyogc2tpcCB0aGUgJ3NhbWUnIHRoaW5ncyBjb3JyZXNwb25kaW5nIHRvIHByZXZpb3VzIGZyYW1lICovCgkgIHggPSBNU1JMRTMyX0NvbXByZXNzUkxFOExpbmUocGksIGxwUCwgbHBDLCBscGJpSW4sIGxwSW4sIGxEaXN0LCB4LAoJCQkgICAgICAgJmxwT3V0LCAmbHBiaU91dC0+YmlTaXplSW1hZ2UpOwoJICBhc3NlcnQobHBPdXQgPT0gKGxwT3V0U3RhcnQgKyBscGJpT3V0LT5iaVNpemVJbWFnZSkpOwoJfQogICAgICB9IHdoaWxlICh4IDwgbHBiaU91dC0+YmlXaWR0aCk7CgogICAgICBscFAgICs9IGxMaW5lOwogICAgICBscEMgICs9IGxMaW5lOwogICAgICBscEluICs9IGxJbkxpbmU7CgogICAgICBpZiAoanVtcHkgPT0gMCkgewoJLyogYWRkIEVPTCAtLSBlbmQgb2YgbGluZSAqLwoJbHBiaU91dC0+YmlTaXplSW1hZ2UgKz0gMjsKCSooKExQV09SRClscE91dCkgPSAwOwoJbHBPdXQgKz0gc2l6ZW9mKFdPUkQpOwoJYXNzZXJ0KGxwT3V0ID09IChscE91dFN0YXJ0ICsgbHBiaU91dC0+YmlTaXplSW1hZ2UpKTsKICAgICAgfQogICAgfQoKICAgIC8qIGFkZCBFT0wgLS0gd2lsbCBiZSBjaGFuZ2VkIHRvIEVPSSAqLwogICAgbHBiaU91dC0+YmlTaXplSW1hZ2UgKz0gMjsKICAgICooKExQV09SRClscE91dCkgPSAwOwogICAgbHBPdXQgKz0gc2l6ZW9mKFdPUkQpOwogIH0KCiAgLyogY2hhbmdlIEVPTCB0byBFT0kgLS0gZW5kIG9mIGltYWdlICovCiAgbHBPdXRbLTFdID0gMTsKICBhc3NlcnQobHBPdXQgPT0gKGxwT3V0U3RhcnQgKyBscGJpT3V0LT5iaVNpemVJbWFnZSkpOwoKICByZXR1cm4gSUNFUlJfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBMUkVTVUxUIE1TUkxFMzJfRGVjb21wcmVzc1JMRTQoQ29kZWNJbmZvICpwaSwgTFBDQklUTUFQSU5GT0hFQURFUiBscGJpLAoJCQkJICAgICAgTFBCWVRFIGxwSW4sIExQQllURSBscE91dCkKewogIGludCAgYnl0ZXNfcGVyX3BpeGVsOwogIGludCAgbGluZV9zaXplOwogIGludCAgcGl4ZWxfcHRyICA9IDA7CiAgaW50ICBpOwogIEJPT0wgYkVuZEZsYWcgICA9IEZBTFNFOwoKICBhc3NlcnQocGkgIT0gTlVMTCk7CiAgYXNzZXJ0KGxwYmkgIT0gTlVMTCAmJiBscGJpLT5iaUNvbXByZXNzaW9uID09IEJJX1JHQik7CiAgYXNzZXJ0KGxwSW4gIT0gTlVMTCAmJiBscE91dCAhPSBOVUxMKTsKCiAgYnl0ZXNfcGVyX3BpeGVsID0gKGxwYmktPmJpQml0Q291bnQgKyAxKSAvIDg7CiAgbGluZV9zaXplICAgICAgID0gRElCV0lEVEhCWVRFUygqbHBiaSk7CgogIGRvIHsKICAgIEJZVEUgY29kZTAsIGNvZGUxOwoKICAgIGNvZGUwID0gKmxwSW4rKzsKICAgIGNvZGUxID0gKmxwSW4rKzsKCiAgICBpZiAoY29kZTAgPT0gMCkgewogICAgICBpbnQgIGV4dHJhX2J5dGU7CgogICAgICBzd2l0Y2ggKGNvZGUxKSB7CiAgICAgIGNhc2UgIDA6IC8qIEVPTCAtIGVuZCBvZiBsaW5lICAqLwoJcGl4ZWxfcHRyID0gMDsKCWxwT3V0ICs9IGxpbmVfc2l6ZTsKCWJyZWFrOwogICAgICBjYXNlICAxOiAvKiBFT0kgLSBlbmQgb2YgaW1hZ2UgKi8KCWJFbmRGbGFnID0gVFJVRTsKCWJyZWFrOwogICAgICBjYXNlICAyOiAvKiBza2lwICovCglwaXhlbF9wdHIgKz0gKmxwSW4rKyAqIGJ5dGVzX3Blcl9waXhlbDsKCWxwT3V0ICAgICArPSAqbHBJbisrICogbGluZV9zaXplOwoJaWYgKHBpeGVsX3B0ciA+PSBscGJpLT5iaVdpZHRoICogYnl0ZXNfcGVyX3BpeGVsKSB7CgkgIHBpeGVsX3B0ciA9IDA7CgkgIGxwT3V0ICAgICs9IGxpbmVfc2l6ZTsKCX0KCWJyZWFrOwogICAgICBkZWZhdWx0OiAvKiBhYnNvbHV0ZSBtb2RlICovCglleHRyYV9ieXRlID0gKCgoY29kZTEgKyAxKSAmICh+MSkpIC8gMikgJiAweDAxOwoKCWlmIChwaXhlbF9wdHIvYnl0ZXNfcGVyX3BpeGVsICsgY29kZTEgPiBscGJpLT5iaVdpZHRoKQoJICByZXR1cm4gSUNFUlJfRVJST1I7CgoJY29kZTAgPSBjb2RlMTsKCWZvciAoaSA9IDA7IGkgPCBjb2RlMCAvIDI7IGkrKykgewoJICBpZiAoYnl0ZXNfcGVyX3BpeGVsID09IDEpIHsKCSAgICBjb2RlMSA9IGxwSW5baV07CgkgICAgbHBPdXRbcGl4ZWxfcHRyKytdID0gcGktPnBhbGV0dGVfbWFwWyhjb2RlMSA+PiA0KV07CgkgICAgaWYgKDIgKiBpICsgMSA8PSBjb2RlMCkKCSAgICAgIGxwT3V0W3BpeGVsX3B0cisrXSA9IHBpLT5wYWxldHRlX21hcFsoY29kZTEgJiAweDBGKV07CgkgIH0gZWxzZSBpZiAoYnl0ZXNfcGVyX3BpeGVsID09IDIpIHsKCSAgICBjb2RlMSA9IGxwSW5baV0gPj4gNDsKCSAgICBscE91dFtwaXhlbF9wdHIrK10gPSBwaS0+cGFsZXR0ZV9tYXBbY29kZTEgKiAyICsgMF07CgkgICAgbHBPdXRbcGl4ZWxfcHRyKytdID0gcGktPnBhbGV0dGVfbWFwW2NvZGUxICogMiArIDFdOwoKCSAgICBpZiAoMiAqIGkgKyAxIDw9IGNvZGUwKSB7CgkgICAgICBjb2RlMSA9IGxwSW5baV0gJiAweDBGOwoJICAgICAgbHBPdXRbcGl4ZWxfcHRyKytdID0gcGktPnBhbGV0dGVfbWFwW2NvZGUxICogMiArIDBdOwoJICAgICAgbHBPdXRbcGl4ZWxfcHRyKytdID0gcGktPnBhbGV0dGVfbWFwW2NvZGUxICogMiArIDFdOwoJICAgIH0KCSAgfSBlbHNlIHsKCSAgICBjb2RlMSA9IGxwSW5baV0gPj4gNDsKCSAgICBscE91dFtwaXhlbF9wdHIgKyAwXSA9IHBpLT5wYWxldHRlX21hcFtjb2RlMSAqIDQgKyAwXTsKCSAgICBscE91dFtwaXhlbF9wdHIgKyAxXSA9IHBpLT5wYWxldHRlX21hcFtjb2RlMSAqIDQgKyAxXTsKCSAgICBscE91dFtwaXhlbF9wdHIgKyAyXSA9IHBpLT5wYWxldHRlX21hcFtjb2RlMSAqIDQgKyAyXTsKCSAgICBwaXhlbF9wdHIgKz0gYnl0ZXNfcGVyX3BpeGVsOwoKCSAgICBpZiAoMiAqIGkgKyAxIDw9IGNvZGUwKSB7CgkgICAgICBjb2RlMSA9IGxwSW5baV0gJiAweDBGOwoJICAgICAgbHBPdXRbcGl4ZWxfcHRyICsgMF0gPSBwaS0+cGFsZXR0ZV9tYXBbY29kZTEgKiA0ICsgMF07CgkgICAgICBscE91dFtwaXhlbF9wdHIgKyAxXSA9IHBpLT5wYWxldHRlX21hcFtjb2RlMSAqIDQgKyAxXTsKCSAgICAgIGxwT3V0W3BpeGVsX3B0ciArIDJdID0gcGktPnBhbGV0dGVfbWFwW2NvZGUxICogNCArIDJdOwoJICAgICAgcGl4ZWxfcHRyICs9IGJ5dGVzX3Blcl9waXhlbDsKCSAgICB9CgkgIH0KCX0KCWlmIChjb2RlMCAmIDB4MDEpIHsKCSAgaWYgKGJ5dGVzX3Blcl9waXhlbCA9PSAxKSB7CgkgICAgY29kZTEgPSBscEluW2ldOwoJICAgIGxwT3V0W3BpeGVsX3B0cisrXSA9IHBpLT5wYWxldHRlX21hcFsoY29kZTEgPj4gNCldOwoJICB9IGVsc2UgaWYgKGJ5dGVzX3Blcl9waXhlbCA9PSAyKSB7CgkgICAgY29kZTEgPSBscEluW2ldID4+IDQ7CgkgICAgbHBPdXRbcGl4ZWxfcHRyKytdID0gcGktPnBhbGV0dGVfbWFwW2NvZGUxICogMiArIDBdOwoJICAgIGxwT3V0W3BpeGVsX3B0cisrXSA9IHBpLT5wYWxldHRlX21hcFtjb2RlMSAqIDIgKyAxXTsKCSAgfSBlbHNlIHsKCSAgICBjb2RlMSA9IGxwSW5baV0gPj4gNDsKCSAgICBscE91dFtwaXhlbF9wdHIgKyAwXSA9IHBpLT5wYWxldHRlX21hcFtjb2RlMSAqIDQgKyAwXTsKCSAgICBscE91dFtwaXhlbF9wdHIgKyAxXSA9IHBpLT5wYWxldHRlX21hcFtjb2RlMSAqIDQgKyAxXTsKCSAgICBscE91dFtwaXhlbF9wdHIgKyAyXSA9IHBpLT5wYWxldHRlX21hcFtjb2RlMSAqIDQgKyAyXTsKCSAgICBwaXhlbF9wdHIgKz0gYnl0ZXNfcGVyX3BpeGVsOwoJICB9CgkgIGxwSW4rKzsKCX0KCWxwSW4gKz0gY29kZTAgLyAyOwoKCS8qIGlmIHRoZSBSTEUgY29kZSBpcyBvZGQsIHNraXAgYSBieXRlIGluIHRoZSBzdHJlYW0gKi8KCWlmIChleHRyYV9ieXRlKQoJICBscEluKys7CiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICAvKiBjb2RlZCBtb2RlICovCiAgICAgIGlmIChwaXhlbF9wdHIvYnl0ZXNfcGVyX3BpeGVsICsgY29kZTAgPiBscGJpLT5iaVdpZHRoKQoJcmV0dXJuIElDRVJSX0VSUk9SOwoKICAgICAgaWYgKGJ5dGVzX3Blcl9waXhlbCA9PSAxKSB7CglCWVRFIGMxID0gcGktPnBhbGV0dGVfbWFwWyhjb2RlMSA+PiA0KV07CglCWVRFIGMyID0gcGktPnBhbGV0dGVfbWFwWyhjb2RlMSAmIDB4MEYpXTsKCglmb3IgKGkgPSAwOyBpIDwgY29kZTA7IGkrKykgewoJICBpZiAoKGkgJiAxKSA9PSAwKQoJICAgIGxwT3V0W3BpeGVsX3B0cisrXSA9IGMxOwoJICBlbHNlCgkgICAgbHBPdXRbcGl4ZWxfcHRyKytdID0gYzI7Cgl9CiAgICAgIH0gZWxzZSBpZiAoYnl0ZXNfcGVyX3BpeGVsID09IDIpIHsKCUJZVEUgaGkxID0gcGktPnBhbGV0dGVfbWFwWyhjb2RlMSA+PiA0KSAqIDIgKyAwXTsKCUJZVEUgbG8xID0gcGktPnBhbGV0dGVfbWFwWyhjb2RlMSA+PiA0KSAqIDIgKyAxXTsKCglCWVRFIGhpMiA9IHBpLT5wYWxldHRlX21hcFsoY29kZTEgJiAweDBGKSAqIDIgKyAwXTsKCUJZVEUgbG8yID0gcGktPnBhbGV0dGVfbWFwWyhjb2RlMSAmIDB4MEYpICogMiArIDFdOwoKCWZvciAoaSA9IDA7IGkgPCBjb2RlMDsgaSsrKSB7CgkgIGlmICgoaSAmIDEpID09IDApIHsKCSAgICBscE91dFtwaXhlbF9wdHIrK10gPSBoaTE7CgkgICAgbHBPdXRbcGl4ZWxfcHRyKytdID0gbG8xOwoJICB9IGVsc2UgewoJICAgIGxwT3V0W3BpeGVsX3B0cisrXSA9IGhpMjsKCSAgICBscE91dFtwaXhlbF9wdHIrK10gPSBsbzI7CgkgIH0KCX0KICAgICAgfSBlbHNlIHsKCUJZVEUgYjEgPSBwaS0+cGFsZXR0ZV9tYXBbKGNvZGUxID4+IDQpICogNCArIDBdOwoJQllURSBnMSA9IHBpLT5wYWxldHRlX21hcFsoY29kZTEgPj4gNCkgKiA0ICsgMV07CglCWVRFIHIxID0gcGktPnBhbGV0dGVfbWFwWyhjb2RlMSA+PiA0KSAqIDQgKyAyXTsKCglCWVRFIGIyID0gcGktPnBhbGV0dGVfbWFwWyhjb2RlMSAmIDB4MEYpICogNCArIDBdOwoJQllURSBnMiA9IHBpLT5wYWxldHRlX21hcFsoY29kZTEgJiAweDBGKSAqIDQgKyAxXTsKCUJZVEUgcjIgPSBwaS0+cGFsZXR0ZV9tYXBbKGNvZGUxICYgMHgwRikgKiA0ICsgMl07CgoJZm9yIChpID0gMDsgaSA8IGNvZGUwOyBpKyspIHsKCSAgaWYgKChpICYgMSkgPT0gMCkgewoJICAgIGxwT3V0W3BpeGVsX3B0ciArIDBdID0gYjE7CgkgICAgbHBPdXRbcGl4ZWxfcHRyICsgMV0gPSBnMTsKCSAgICBscE91dFtwaXhlbF9wdHIgKyAyXSA9IHIxOwoJICB9IGVsc2UgewoJICAgIGxwT3V0W3BpeGVsX3B0ciArIDBdID0gYjI7CgkgICAgbHBPdXRbcGl4ZWxfcHRyICsgMV0gPSBnMjsKCSAgICBscE91dFtwaXhlbF9wdHIgKyAyXSA9IHIyOwoJICB9CgkgIHBpeGVsX3B0ciArPSBieXRlc19wZXJfcGl4ZWw7Cgl9CiAgICAgIH0KICAgIH0KICB9IHdoaWxlICghIGJFbmRGbGFnKTsKCiAgcmV0dXJuIElDRVJSX09LOwp9CgpzdGF0aWMgTFJFU1VMVCBNU1JMRTMyX0RlY29tcHJlc3NSTEU4KENvZGVjSW5mbyAqcGksIExQQ0JJVE1BUElORk9IRUFERVIgbHBiaSwKCQkJCSAgICAgIExQQllURSBscEluLCBMUEJZVEUgbHBPdXQpCnsKICBpbnQgIGJ5dGVzX3Blcl9waXhlbDsKICBpbnQgIGxpbmVfc2l6ZTsKICBpbnQgIHBpeGVsX3B0ciAgPSAwOwogIEJPT0wgYkVuZEZsYWcgICA9IEZBTFNFOwoKICBhc3NlcnQocGkgIT0gTlVMTCk7CiAgYXNzZXJ0KGxwYmkgIT0gTlVMTCAmJiBscGJpLT5iaUNvbXByZXNzaW9uID09IEJJX1JHQik7CiAgYXNzZXJ0KGxwSW4gIT0gTlVMTCAmJiBscE91dCAhPSBOVUxMKTsKCiAgYnl0ZXNfcGVyX3BpeGVsID0gKGxwYmktPmJpQml0Q291bnQgKyAxKSAvIDg7CiAgbGluZV9zaXplICAgICAgID0gRElCV0lEVEhCWVRFUygqbHBiaSk7CgogIGRvIHsKICAgIEJZVEUgY29kZTAsIGNvZGUxOwoKICAgIGNvZGUwID0gKmxwSW4rKzsKICAgIGNvZGUxID0gKmxwSW4rKzsKCiAgICBpZiAoY29kZTAgPT0gMCkgewogICAgICBpbnQgIGV4dHJhX2J5dGU7CgogICAgICBzd2l0Y2ggKGNvZGUxKSB7CiAgICAgIGNhc2UgIDA6IC8qIEVPTCAtIGVuZCBvZiBsaW5lICAqLwoJcGl4ZWxfcHRyID0gMDsKCWxwT3V0ICs9IGxpbmVfc2l6ZTsKCWJyZWFrOwogICAgICBjYXNlICAxOiAvKiBFT0kgLSBlbmQgb2YgaW1hZ2UgKi8KCWJFbmRGbGFnID0gVFJVRTsKCWJyZWFrOwogICAgICBjYXNlICAyOiAvKiBza2lwICovCglwaXhlbF9wdHIgKz0gKmxwSW4rKyAqIGJ5dGVzX3Blcl9waXhlbDsKCWxwT3V0ICAgICArPSAqbHBJbisrICogbGluZV9zaXplOwoJaWYgKHBpeGVsX3B0ciA+PSBscGJpLT5iaVdpZHRoICogYnl0ZXNfcGVyX3BpeGVsKSB7CgkgIHBpeGVsX3B0ciA9IDA7CgkgIGxwT3V0ICAgICs9IGxpbmVfc2l6ZTsKCX0KCWJyZWFrOwogICAgICBkZWZhdWx0OiAvKiBhYnNvbHV0ZSBtb2RlICovCglpZiAocGl4ZWxfcHRyL2J5dGVzX3Blcl9waXhlbCArIGNvZGUxID4gbHBiaS0+YmlXaWR0aCkgewoJICBXQVJOKCJhYm9ydGVkIGFic29sdXRlOiAoJWQ9JWQvJWQrJWQpID4gJWxkXG4iLHBpeGVsX3B0ci9ieXRlc19wZXJfcGl4ZWwgKyBjb2RlMSxwaXhlbF9wdHIsYnl0ZXNfcGVyX3BpeGVsLGNvZGUxLGxwYmktPmJpV2lkdGgpOwoJICByZXR1cm4gSUNFUlJfRVJST1I7Cgl9CglleHRyYV9ieXRlID0gY29kZTEgJiAweDAxOwoKCWNvZGUwID0gY29kZTE7Cgl3aGlsZSAoY29kZTAtLSkgewoJICBjb2RlMSA9ICpscEluKys7CgkgIGlmIChieXRlc19wZXJfcGl4ZWwgPT0gMSkgewoJICAgIGxwT3V0W3BpeGVsX3B0cl0gPSBwaS0+cGFsZXR0ZV9tYXBbY29kZTFdOwoJICB9IGVsc2UgaWYgKGJ5dGVzX3Blcl9waXhlbCA9PSAyKSB7CgkgICAgbHBPdXRbcGl4ZWxfcHRyICsgMF0gPSBwaS0+cGFsZXR0ZV9tYXBbY29kZTEgKiAyICsgMF07CgkgICAgbHBPdXRbcGl4ZWxfcHRyICsgMV0gPSBwaS0+cGFsZXR0ZV9tYXBbY29kZTEgKiAyICsgMV07CgkgIH0gZWxzZSB7CgkgICAgbHBPdXRbcGl4ZWxfcHRyICsgMF0gPSBwaS0+cGFsZXR0ZV9tYXBbY29kZTEgKiA0ICsgMF07CgkgICAgbHBPdXRbcGl4ZWxfcHRyICsgMV0gPSBwaS0+cGFsZXR0ZV9tYXBbY29kZTEgKiA0ICsgMV07CgkgICAgbHBPdXRbcGl4ZWxfcHRyICsgMl0gPSBwaS0+cGFsZXR0ZV9tYXBbY29kZTEgKiA0ICsgMl07CgkgIH0KCSAgcGl4ZWxfcHRyICs9IGJ5dGVzX3Blcl9waXhlbDsKCX0KCgkvKiBpZiB0aGUgUkxFIGNvZGUgaXMgb2RkLCBza2lwIGEgYnl0ZSBpbiB0aGUgc3RyZWFtICovCglpZiAoZXh0cmFfYnl0ZSkKCSAgbHBJbisrOwogICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgLyogY29kZWQgbW9kZSAqLwogICAgICBpZiAocGl4ZWxfcHRyL2J5dGVzX3Blcl9waXhlbCArIGNvZGUwID4gbHBiaS0+YmlXaWR0aCkgewoJV0FSTigiYWJvcnRlZCBjb2RlZDogKCVkPSVkLyVkKyVkKSA+ICVsZFxuIixwaXhlbF9wdHIvYnl0ZXNfcGVyX3BpeGVsICsgY29kZTEscGl4ZWxfcHRyLGJ5dGVzX3Blcl9waXhlbCxjb2RlMSxscGJpLT5iaVdpZHRoKTsKCXJldHVybiBJQ0VSUl9FUlJPUjsKICAgICAgfQoKICAgICAgaWYgKGJ5dGVzX3Blcl9waXhlbCA9PSAxKSB7Cgljb2RlMSA9IHBpLT5wYWxldHRlX21hcFtjb2RlMV07Cgl3aGlsZSAoY29kZTAtLSkKCSAgbHBPdXRbcGl4ZWxfcHRyKytdID0gY29kZTE7CiAgICAgIH0gZWxzZSBpZiAoYnl0ZXNfcGVyX3BpeGVsID09IDIpIHsKCUJZVEUgaGkgPSBwaS0+cGFsZXR0ZV9tYXBbY29kZTEgKiAyICsgMF07CglCWVRFIGxvID0gcGktPnBhbGV0dGVfbWFwW2NvZGUxICogMiArIDFdOwoKCXdoaWxlIChjb2RlMC0tKSB7CgkgIGxwT3V0W3BpeGVsX3B0ciArIDBdID0gaGk7CgkgIGxwT3V0W3BpeGVsX3B0ciArIDFdID0gbG87CgkgIHBpeGVsX3B0ciArPSBieXRlc19wZXJfcGl4ZWw7Cgl9CiAgICAgIH0gZWxzZSB7CglCWVRFIHIgPSBwaS0+cGFsZXR0ZV9tYXBbY29kZTEgKiA0ICsgMl07CglCWVRFIGcgPSBwaS0+cGFsZXR0ZV9tYXBbY29kZTEgKiA0ICsgMV07CglCWVRFIGIgPSBwaS0+cGFsZXR0ZV9tYXBbY29kZTEgKiA0ICsgMF07CgoJd2hpbGUgKGNvZGUwLS0pIHsKCSAgbHBPdXRbcGl4ZWxfcHRyICsgMF0gPSBiOwoJICBscE91dFtwaXhlbF9wdHIgKyAxXSA9IGc7CgkgIGxwT3V0W3BpeGVsX3B0ciArIDJdID0gcjsKCSAgcGl4ZWxfcHRyICs9IGJ5dGVzX3Blcl9waXhlbDsKCX0KICAgICAgfQogICAgfQogIH0gd2hpbGUgKCEgYkVuZEZsYWcpOwoKICByZXR1cm4gSUNFUlJfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBDb2RlY0luZm8qIE9wZW4oTFBJQ09QRU4gaWNpbmZvKQp7CiAgQ29kZWNJbmZvKiBwaSA9IE5VTEw7CgogIGlmIChpY2luZm8gPT0gTlVMTCkgewogICAgVFJBQ0UoIihOVUxMKVxuIik7CiAgICByZXR1cm4gKExQVk9JRCkweEZGRkYwMDAwOwogIH0KCiAgVFJBQ0UoIiglcCA9IHslbHUsMHglMDhsWCglNC40cyksMHglMDhsWCglNC40cyksMHglbFgsMHglbFgsLi4ufSlcbiIsIGljaW5mbywKCWljaW5mby0+ZHdTaXplLAlpY2luZm8tPmZjY1R5cGUsIChjaGFyKikmaWNpbmZvLT5mY2NUeXBlLAoJaWNpbmZvLT5mY2NIYW5kbGVyLCAoY2hhciopJmljaW5mby0+ZmNjSGFuZGxlciwKCWljaW5mby0+ZHdWZXJzaW9uLGljaW5mby0+ZHdGbGFncyk7CgogIGlmIChpY2luZm8tPmZjY1R5cGUgIT0gSUNUWVBFX1ZJREVPKQogICAgcmV0dXJuIE5VTEw7CgogIHN3aXRjaCAoaWNpbmZvLT5mY2NIYW5kbGVyKSB7CiAgY2FzZSBGT1VSQ0NfUkxFOgogIGNhc2UgRk9VUkNDX1JMRTQ6CiAgY2FzZSBGT1VSQ0NfUkxFODoKICBjYXNlIEZPVVJDQ19NUkxFOgogICAgYnJlYWs7CiAgY2FzZSBtbWlvRk9VUkNDKCdtJywncicsJ2wnLCdlJyk6CiAgICBpY2luZm8tPmZjY0hhbmRsZXIgPSBGT1VSQ0NfTVJMRTsKICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICBXQVJOKCJ1bmtub3duIEZPVVJDQyA9IDB4JTA4bFgoJTQuNHMpICFcbiIsCgkgaWNpbmZvLT5mY2NIYW5kbGVyLChjaGFyKikmaWNpbmZvLT5mY2NIYW5kbGVyKTsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgcGkgPSAoQ29kZWNJbmZvKilMb2NhbEFsbG9jKExQVFIsIHNpemVvZihDb2RlY0luZm8pKTsKCiAgaWYgKHBpICE9IE5VTEwpIHsKICAgIHBpLT5mY2NIYW5kbGVyICA9IGljaW5mby0+ZmNjSGFuZGxlcjsKCiAgICBwaS0+YkNvbXByZXNzICAgPSBGQUxTRTsKICAgIHBpLT5kd1F1YWxpdHkgICA9IE1TUkxFMzJfREVGQVVMVFFVQUxJVFk7CiAgICBwaS0+blByZXZGcmFtZSAgPSAtMTsKICAgIHBpLT5wUHJldkZyYW1lICA9IHBpLT5wQ3VyRnJhbWUgPSBOVUxMOwoKICAgIHBpLT5iRGVjb21wcmVzcyA9IEZBTFNFOwogICAgcGktPnBhbGV0dGVfbWFwID0gTlVMTDsKICB9CgogIGljaW5mby0+ZHdFcnJvciA9IChwaSAhPSBOVUxMID8gSUNFUlJfT0sgOiBJQ0VSUl9NRU1PUlkpOwoKICByZXR1cm4gcGk7Cn0KCnN0YXRpYyBMUkVTVUxUIENsb3NlKENvZGVjSW5mbyAqcGkpCnsKICBUUkFDRSgiKCVwKVxuIiwgcGkpOwoKICAvKiBwcmUtY29uZGl0aW9uICovCiAgYXNzZXJ0KHBpICE9IE5VTEwpOwoKICBpZiAocGktPnBQcmV2RnJhbWUgIT0gTlVMTCB8fCBwaS0+cEN1ckZyYW1lICE9IE5VTEwpCiAgICBDb21wcmVzc0VuZChwaSk7CgogIExvY2FsRnJlZSgoSExPQ0FMKXBpKTsKICByZXR1cm4gMTsKfQoKc3RhdGljIExSRVNVTFQgR2V0SW5mbyhDb2RlY0luZm8gKnBpLCBJQ0lORk8gKmljaW5mbywgRFdPUkQgZHdTaXplKQp7CiAgLyogcHJlLWNvbmRpdGlvbiAqLwogIGFzc2VydChwaSAhPSBOVUxMKTsKCiAgLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGlmIChpY2luZm8gPT0gTlVMTCkKICAgIHJldHVybiBzaXplb2YoSUNJTkZPKTsKICBpZiAoZHdTaXplIDwgc2l6ZW9mKElDSU5GTykpCiAgICByZXR1cm4gMDsKCiAgaWNpbmZvLT5kd1NpemUgICAgICAgPSBzaXplb2YoSUNJTkZPKTsKICBpY2luZm8tPmZjY1R5cGUgICAgICA9IHN0cmVhbXR5cGVWSURFTzsKICBpY2luZm8tPmZjY0hhbmRsZXIgICA9IChwaSAhPSBOVUxMID8gcGktPmZjY0hhbmRsZXIgOiBGT1VSQ0NfTVJMRSk7CiAgaWNpbmZvLT5kd0ZsYWdzICAgICAgPSBWSURDRl9RVUFMSVRZIHwgVklEQ0ZfVEVNUE9SQUwgfCBWSURDRl9DUlVOQ0ggfCBWSURDRl9GQVNUVEVNUE9SQUxDOwogIGljaW5mby0+ZHdWZXJzaW9uICAgID0gTVNSTEUzMl9WRVJTSU9OOwogIGljaW5mby0+ZHdWZXJzaW9uSUNNID0gMHgwMTA0MDAwMDsgLyogVmVyc2lvbiAxLjQgYnVpbGQgMCAqLwoKICBMb2FkV2lkZVN0cmluZyhJRFNfTkFNRSwgaWNpbmZvLT5zek5hbWUsIHNpemVvZihpY2luZm8tPnN6TmFtZSkpOwogIExvYWRXaWRlU3RyaW5nKElEU19ERVNDUklQVElPTiwgaWNpbmZvLT5zekRlc2NyaXB0aW9uLCBzaXplb2YoaWNpbmZvLT5zekRlc2NyaXB0aW9uKSk7CgogIHJldHVybiBzaXplb2YoSUNJTkZPKTsKfQoKc3RhdGljIExSRVNVTFQgU2V0UXVhbGl0eShDb2RlY0luZm8gKnBpLCBMT05HIGxRdWFsaXR5KQp7CiAgLyogcHJlLWNvbmRpdGlvbiAqLwogIGFzc2VydChwaSAhPSBOVUxMKTsKCiAgaWYgKGxRdWFsaXR5ID09IC0xKQogICAgbFF1YWxpdHkgPSBNU1JMRTMyX0RFRkFVTFRRVUFMSVRZOwogIGVsc2UgaWYgKElDUVVBTElUWV9MT1cgPiBsUXVhbGl0eSB8fCBsUXVhbGl0eSA+IElDUVVBTElUWV9ISUdIKQogICAgcmV0dXJuIElDRVJSX0JBRFBBUkFNOwoKICBwaS0+ZHdRdWFsaXR5ID0gKERXT1JEKWxRdWFsaXR5OwoKICByZXR1cm4gSUNFUlJfT0s7Cn0KCnN0YXRpYyBMUkVTVUxUIENvbmZpZ3VyZShDb2RlY0luZm8gKnBpLCBIV05EIGhXbmQpCnsKICAvKiBwcmUtY29uZGl0aW9uICovCiAgYXNzZXJ0KHBpICE9IE5VTEwpOwoKICAvKiBGSVhNRSAqLwogIHJldHVybiBJQ0VSUl9PSzsKfQoKc3RhdGljIExSRVNVTFQgQWJvdXQoQ29kZWNJbmZvICpwaSwgSFdORCBoV25kKQp7CiAgQ0hBUiBzelRpdGxlWzIwXTsKICBDSEFSIHN6QWJvdXRbMTI4XTsKCiAgLyogcHJlLWNvbmRpdGlvbiAqLwogIGFzc2VydChNU1JMRTMyX2hNb2R1bGUgIT0gMCk7CgogIExvYWRTdHJpbmdBKE1TUkxFMzJfaE1vZHVsZSwgSURTX05BTUUsIHN6VGl0bGUsIHNpemVvZihzelRpdGxlKSk7CiAgTG9hZFN0cmluZ0EoTVNSTEUzMl9oTW9kdWxlLCBJRFNfQUJPVVQsIHN6QWJvdXQsIHNpemVvZihzekFib3V0KSk7CgogIE1lc3NhZ2VCb3hBKGhXbmQsIHN6QWJvdXQsIHN6VGl0bGUsIE1CX09LfE1CX0lDT05JTkZPUk1BVElPTik7CgogIHJldHVybiBJQ0VSUl9PSzsKfQoKc3RhdGljIExSRVNVTFQgQ29tcHJlc3NHZXRGb3JtYXQoQ29kZWNJbmZvICpwaSwgTFBDQklUTUFQSU5GT0hFQURFUiBscGJpSW4sCgkJCQkgTFBCSVRNQVBJTkZPSEVBREVSIGxwYmlPdXQpCnsKICBMUkVTVUxUIHNpemU7CgogIFRSQUNFKCIoJXAsJXAsJXApXG4iLHBpLGxwYmlJbixscGJpT3V0KTsKCiAgLyogcHJlLWNvbmRpdGlvbiAqLwogIGFzc2VydChwaSAhPSBOVUxMKTsKCiAgLyogY2hlY2sgcGFyYW1ldGVycyAtLSBuZWVkIGF0IGxlYXN0IGlucHV0IGZvcm1hdCAqLwogIGlmIChscGJpSW4gPT0gTlVMTCkgewogICAgaWYgKGxwYmlPdXQgIT0gTlVMTCkKICAgICAgcmV0dXJuIElDRVJSX0JBRFBBUkFNOwogICAgcmV0dXJuIDA7CiAgfQoKICAvKiBoYW5kbGUgdW5zdXBwb3J0ZWQgaW5wdXQgZm9ybWF0ICovCiAgaWYgKENvbXByZXNzUXVlcnkocGksIGxwYmlJbiwgTlVMTCkgIT0gSUNFUlJfT0spCiAgICByZXR1cm4gKGxwYmlPdXQgPT0gTlVMTCA/IElDRVJSX0JBREZPUk1BVCA6IDApOwoKICBhc3NlcnQoMCA8IGxwYmlJbi0+YmlCaXRDb3VudCAmJiBscGJpSW4tPmJpQml0Q291bnQgPD0gOCk7CgogIHN3aXRjaCAocGktPmZjY0hhbmRsZXIpIHsKICBjYXNlIEZPVVJDQ19STEU0OgogICAgc2l6ZSA9IDEgPDwgNDsKICAgIGJyZWFrOwogIGNhc2UgRk9VUkNDX1JMRTg6CiAgICBzaXplID0gMSA8PCA4OwogICAgYnJlYWs7CiAgY2FzZSBGT1VSQ0NfUkxFOgogIGNhc2UgRk9VUkNDX01STEU6CiAgICBzaXplID0gKGxwYmlJbi0+YmlCaXRDb3VudCA8PSA0ID8gMSA8PCA0IDogMSA8PCA4KTsKICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICByZXR1cm4gSUNFUlJfRVJST1I7CiAgfQoKICBpZiAobHBiaUluLT5iaUNsclVzZWQgIT0gMCkKICAgIHNpemUgPSBscGJpSW4tPmJpQ2xyVXNlZDsKCiAgc2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSArIHNpemUgKiBzaXplb2YoUkdCUVVBRCk7CgogIGlmIChscGJpT3V0ICE9IE5VTEwpIHsKICAgIGxwYmlPdXQtPmJpU2l6ZSAgICAgICAgICA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKICAgIGxwYmlPdXQtPmJpV2lkdGggICAgICAgICA9IGxwYmlJbi0+YmlXaWR0aDsKICAgIGxwYmlPdXQtPmJpSGVpZ2h0ICAgICAgICA9IGxwYmlJbi0+YmlIZWlnaHQ7CiAgICBscGJpT3V0LT5iaVBsYW5lcyAgICAgICAgPSAxOwogICAgaWYgKHBpLT5mY2NIYW5kbGVyID09IEZPVVJDQ19STEU0IHx8CglscGJpSW4tPmJpQml0Q291bnQgPD0gNCkgewogICAgICBscGJpT3V0LT5iaUNvbXByZXNzaW9uID0gQklfUkxFNDsKICAgICAgbHBiaU91dC0+YmlCaXRDb3VudCAgICA9IDQ7CiAgICB9IGVsc2UgewogICAgICBscGJpT3V0LT5iaUNvbXByZXNzaW9uID0gQklfUkxFODsKICAgICAgbHBiaU91dC0+YmlCaXRDb3VudCAgICA9IDg7CiAgICB9CiAgICBscGJpT3V0LT5iaVNpemVJbWFnZSAgICAgPSBNU1JMRTMyX0dldE1heENvbXByZXNzZWRTaXplKGxwYmlPdXQpOwogICAgbHBiaU91dC0+YmlYUGVsc1Blck1ldGVyID0gbHBiaUluLT5iaVhQZWxzUGVyTWV0ZXI7CiAgICBscGJpT3V0LT5iaVlQZWxzUGVyTWV0ZXIgPSBscGJpSW4tPmJpWVBlbHNQZXJNZXRlcjsKICAgIGlmIChscGJpSW4tPmJpQ2xyVXNlZCA9PSAwKQogICAgICBzaXplID0gMTw8bHBiaUluLT5iaUJpdENvdW50OwogICAgZWxzZQogICAgICBzaXplID0gbHBiaUluLT5iaUNsclVzZWQ7CiAgICBscGJpT3V0LT5iaUNsclVzZWQgICAgICAgPSBtaW4oc2l6ZSwgMSA8PCBscGJpT3V0LT5iaUJpdENvdW50KTsKICAgIGxwYmlPdXQtPmJpQ2xySW1wb3J0YW50ICA9IDA7CgogICAgbWVtY3B5KChMUEJZVEUpbHBiaU91dCArIGxwYmlPdXQtPmJpU2l6ZSwKCSAgIChjb25zdCBCWVRFKilscGJpSW4gKyBscGJpSW4tPmJpU2l6ZSwgbHBiaU91dC0+YmlDbHJVc2VkICogc2l6ZW9mKFJHQlFVQUQpKTsKCiAgICByZXR1cm4gSUNFUlJfT0s7CiAgfSBlbHNlCiAgICByZXR1cm4gc2l6ZTsKfQoKc3RhdGljIExSRVNVTFQgQ29tcHJlc3NHZXRTaXplKENvZGVjSW5mbyAqcGksIExQQ0JJVE1BUElORk9IRUFERVIgbHBiaUluLAoJCQkgICAgICAgTFBDQklUTUFQSU5GT0hFQURFUiBscGJpT3V0KQp7CiAgLyogcHJlLWNvbmRpdGlvbiAqLwogIGFzc2VydChwaSAhPSBOVUxMKTsKCiAgVFJBQ0UoIiglcCwlcCwlcClcbiIscGksbHBiaUluLGxwYmlPdXQpOwoKICAvKiBjaGVjayBwYXJhbWV0ZXIgLS0gbmVlZCBhdCBsZWFzdCBvbmUgZm9ybWF0ICovCiAgaWYgKGxwYmlJbiA9PSBOVUxMICYmIGxwYmlPdXQgPT0gTlVMTCkKICAgIHJldHVybiAwOwogIC8qIGNoZWNrIGlmIHRoZSBnaXZlbiBmb3JtYXQgaXMgc3VwcG9ydGVkICovCiAgaWYgKENvbXByZXNzUXVlcnkocGksIGxwYmlJbiwgbHBiaU91dCkgIT0gSUNFUlJfT0spCiAgICByZXR1cm4gMDsKCiAgLyogdGhlIHdvcnN0IGNhc2UgaXMgY29kaW5nIHRoZSBjb21wbGV0ZSBpbWFnZSBpbiBhYnNvbHV0ZSBtb2RlLiAqLwogIGlmIChscGJpSW4pCiAgICByZXR1cm4gTVNSTEUzMl9HZXRNYXhDb21wcmVzc2VkU2l6ZShscGJpSW4pOwogIGVsc2UKICAgIHJldHVybiBNU1JMRTMyX0dldE1heENvbXByZXNzZWRTaXplKGxwYmlPdXQpOwp9CgpzdGF0aWMgTFJFU1VMVCBDb21wcmVzc1F1ZXJ5KENvZGVjSW5mbyAqcGksIExQQ0JJVE1BUElORk9IRUFERVIgbHBiaUluLAoJCQkgICAgIExQQ0JJVE1BUElORk9IRUFERVIgbHBiaU91dCkKewogIC8qIHByZS1jb25kaXRpb24gKi8KICBhc3NlcnQocGkgIT0gTlVMTCk7CgogIC8qIG5lZWQgYXQgbGVhc3Qgb25lIGZvcm1hdCAqLwogIGlmIChscGJpSW4gPT0gTlVMTCAmJiBscGJpT3V0ID09IE5VTEwpCiAgICByZXR1cm4gSUNFUlJfQkFEUEFSQU07CgogIC8qIGNoZWNrIGlucHV0IGZvcm1hdCBpZiBnaXZlbiAqLwogIGlmIChscGJpSW4gIT0gTlVMTCkgewogICAgaWYgKCFpc1N1cHBvcnRlZERJQihscGJpSW4pKQogICAgICByZXR1cm4gSUNFUlJfQkFERk9STUFUOwoKICAgIC8qIGZvciA0LWJpdCBuZWVkIGFuIGV2ZW4gd2lkdGggKi8KICAgIGlmIChscGJpSW4tPmJpQml0Q291bnQgPD0gNCAmJiAobHBiaUluLT5iaVdpZHRoICUgMikpCiAgICAgIHJldHVybiBJQ0VSUl9CQURGT1JNQVQ7CgogICAgaWYgKHBpLT5mY2NIYW5kbGVyID09IEZPVVJDQ19STEU0ICYmIGxwYmlJbi0+YmlCaXRDb3VudCA+IDQpCiAgICAgIHJldHVybiBJQ0VSUl9VTlNVUFBPUlRFRDsKICAgIGVsc2UgaWYgKGxwYmlJbi0+YmlCaXRDb3VudCA+IDgpCiAgICAgIHJldHVybiBJQ0VSUl9VTlNVUFBPUlRFRDsKICB9CgogIC8qIGNoZWNrIG91dHB1dCBmb3JtYXQgaWYgZ2l2ZW4gKi8KICBpZiAobHBiaU91dCAhPSBOVUxMKSB7CiAgICBpZiAoIWlzU3VwcG9ydGVkTVJMRShscGJpT3V0KSkKICAgICAgcmV0dXJuIElDRVJSX0JBREZPUk1BVDsKCiAgICBpZiAobHBiaUluICE9IE5VTEwpIHsKICAgICAgaWYgKGxwYmlJbi0+YmlXaWR0aCAgIT0gbHBiaU91dC0+YmlXaWR0aCkKCXJldHVybiBJQ0VSUl9VTlNVUFBPUlRFRDsKICAgICAgaWYgKGxwYmlJbi0+YmlIZWlnaHQgIT0gbHBiaU91dC0+YmlIZWlnaHQpCglyZXR1cm4gSUNFUlJfVU5TVVBQT1JURUQ7CiAgICAgIGlmIChscGJpSW4tPmJpQml0Q291bnQgPiBscGJpT3V0LT5iaUJpdENvdW50KQoJcmV0dXJuIElDRVJSX1VOU1VQUE9SVEVEOwogICAgfQogIH0KCiAgcmV0dXJuIElDRVJSX09LOwp9CgpzdGF0aWMgTFJFU1VMVCBDb21wcmVzc0JlZ2luKENvZGVjSW5mbyAqcGksIExQQ0JJVE1BUElORk9IRUFERVIgbHBiaUluLAoJCQkgICAgIExQQ0JJVE1BUElORk9IRUFERVIgbHBiaU91dCkKewogIGNvbnN0IFJHQlFVQUQgKnJnYkluOwogIGNvbnN0IFJHQlFVQUQgKnJnYk91dDsKICBVSU5UICAgaTsKICBzaXplX3Qgc2l6ZTsKCiAgVFJBQ0UoIiglcCwlcCwlcClcbiIscGksbHBiaUluLGxwYmlPdXQpOwoKICAvKiBwcmUtY29uZGl0aW9uICovCiAgYXNzZXJ0KHBpICE9IE5VTEwpOwoKICAvKiBjaGVjayBwYXJhbWV0ZXJzIC0tIG5lZWQgYm90aCBmb3JtYXRzICovCiAgaWYgKGxwYmlJbiA9PSBOVUxMIHx8IGxwYmlPdXQgPT0gTlVMTCkKICAgIHJldHVybiBJQ0VSUl9CQURQQVJBTTsKICAvKiBBbmQgYm90aCBtdXN0IGJlIHN1cHBvcnRlZCAqLwogIGlmIChDb21wcmVzc1F1ZXJ5KHBpLCBscGJpSW4sIGxwYmlPdXQpICE9IElDRVJSX09LKQogICAgcmV0dXJuIElDRVJSX0JBREZPUk1BVDsKCiAgLyogRklYTUU6IGNhbm5vdCBjb21wcmVzcyBhbmQgZGVjb21wcmVzcyBhdCBzYW1lIHRpbWUhICovCiAgaWYgKHBpLT5iRGVjb21wcmVzcykgewogICAgRklYTUUoImNhbm5vdCBjb21wcmVzcyBhbmQgZGVjb21wcmVzcyBhdCBzYW1lIHRpbWUhXG4iKTsKICAgIHJldHVybiBJQ0VSUl9FUlJPUjsKICB9CgogIGlmIChwaS0+YkNvbXByZXNzKQogICAgQ29tcHJlc3NFbmQocGkpOwoKICBzaXplID0gV0lEVEhCWVRFUyhscGJpT3V0LT5iaVdpZHRoICogMTYpIC8gMiAqIGxwYmlPdXQtPmJpSGVpZ2h0OwogIHBpLT5wUHJldkZyYW1lID0gKExQV09SRClHbG9iYWxBbGxvY1B0cihHUFRSLCBzaXplICogc2l6ZW9mKFdPUkQpKTsKICBpZiAocGktPnBQcmV2RnJhbWUgPT0gTlVMTCkKICAgIHJldHVybiBJQ0VSUl9NRU1PUlk7CiAgcGktPnBDdXJGcmFtZSA9IChMUFdPUkQpR2xvYmFsQWxsb2NQdHIoR1BUUiwgc2l6ZSAqIHNpemVvZihXT1JEKSk7CiAgaWYgKHBpLT5wQ3VyRnJhbWUgPT0gTlVMTCkgewogICAgQ29tcHJlc3NFbmQocGkpOwogICAgcmV0dXJuIElDRVJSX01FTU9SWTsKICB9CiAgcGktPm5QcmV2RnJhbWUgPSAtMTsKICBwaS0+YkNvbXByZXNzICA9IFRSVUU7CgogIHJnYkluICA9IChjb25zdCBSR0JRVUFEKikoKGNvbnN0IEJZVEUqKWxwYmlJbiAgKyBscGJpSW4tPmJpU2l6ZSk7CiAgcmdiT3V0ID0gKGNvbnN0IFJHQlFVQUQqKSgoY29uc3QgQllURSopbHBiaU91dCArIGxwYmlPdXQtPmJpU2l6ZSk7CgogIHN3aXRjaCAobHBiaU91dC0+YmlCaXRDb3VudCkgewogIGNhc2UgNDoKICBjYXNlIDg6CiAgICBwaS0+cGFsZXR0ZV9tYXAgPSAoTFBCWVRFKUxvY2FsQWxsb2MoTFBUUiwgbHBiaUluLT5iaUNsclVzZWQpOwogICAgaWYgKHBpLT5wYWxldHRlX21hcCA9PSBOVUxMKSB7CiAgICAgIENvbXByZXNzRW5kKHBpKTsKICAgICAgcmV0dXJuIElDRVJSX01FTU9SWTsKICAgIH0KCiAgICBmb3IgKGkgPSAwOyBpIDwgbHBiaUluLT5iaUNsclVzZWQ7IGkrKykgewogICAgICBwaS0+cGFsZXR0ZV9tYXBbaV0gPSBNU1JMRTMyX0dldE5lYXJlc3RQYWxldHRlSW5kZXgobHBiaU91dC0+YmlDbHJVc2VkLCByZ2JPdXQsIHJnYkluW2ldKTsKICAgIH0KICAgIGJyZWFrOwogIH07CgogIHJldHVybiBJQ0VSUl9PSzsKfQoKc3RhdGljIExSRVNVTFQgQ29tcHJlc3MoQ29kZWNJbmZvICpwaSwgSUNDT01QUkVTUyogbHBpYywgRFdPUkQgZHdTaXplKQp7CiAgaW50IGk7CgogIFRSQUNFKCIoJXAsJXAsJWx1KVxuIixwaSxscGljLGR3U2l6ZSk7CgogIC8qIHByZS1jb25kaXRpb24gKi8KICBhc3NlcnQocGkgIT0gTlVMTCk7CgogIC8qIGNoZWNrIHBhcmFtZXRlcnMgKi8KICBpZiAobHBpYyA9PSBOVUxMIHx8IGR3U2l6ZSA8IHNpemVvZihJQ0NPTVBSRVNTKSkKICAgIHJldHVybiBJQ0VSUl9CQURQQVJBTTsKICBpZiAoIWxwaWMtPmxwYmlPdXRwdXQgfHwgIWxwaWMtPmxwT3V0cHV0IHx8CiAgICAgICFscGljLT5scGJpSW5wdXQgIHx8ICFscGljLT5scElucHV0KQogICAgcmV0dXJuIElDRVJSX0JBRFBBUkFNOwoKICBUUkFDRSgibHBpYz17MHglbFgsJXAsJXAsJXAsJXAsJXAsJXAsJWxkLCVsdSwlbHUsJXAsJXB9XG4iLGxwaWMtPmR3RmxhZ3MsbHBpYy0+bHBiaU91dHB1dCxscGljLT5scE91dHB1dCxscGljLT5scGJpSW5wdXQsbHBpYy0+bHBJbnB1dCxscGljLT5scGNraWQsbHBpYy0+bHBkd0ZsYWdzLGxwaWMtPmxGcmFtZU51bSxscGljLT5kd0ZyYW1lU2l6ZSxscGljLT5kd1F1YWxpdHksbHBpYy0+bHBiaVByZXYsbHBpYy0+bHBQcmV2KTsKCiAgaWYgKCEgcGktPmJDb21wcmVzcykgewogICAgTFJFU1VMVCBociA9IENvbXByZXNzQmVnaW4ocGksIGxwaWMtPmxwYmlJbnB1dCwgbHBpYy0+bHBiaU91dHB1dCk7CiAgICBpZiAoaHIgIT0gSUNFUlJfT0spCiAgICAgIHJldHVybiBocjsKICB9IGVsc2UgaWYgKENvbXByZXNzUXVlcnkocGksIGxwaWMtPmxwYmlJbnB1dCwgbHBpYy0+bHBiaU91dHB1dCkgIT0gSUNFUlJfT0spCiAgICByZXR1cm4gSUNFUlJfQkFERk9STUFUOwoKICBpZiAobHBpYy0+bEZyYW1lTnVtID49IHBpLT5uUHJldkZyYW1lICsgMSkgewogICAgLyogd2UgY29udGludWUgaW4gdGhlIHNlcXVlbmNlIHNvIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSAKICAgICAqIG91ciBpbnRlcm5hbCBmcmFtZWRhdGEgKi8KCiAgICBjb21wdXRlSW50ZXJuYWxGcmFtZShwaSwgbHBpYy0+bHBiaUlucHV0LCBscGljLT5scElucHV0KTsKICB9IGVsc2UgaWYgKGxwaWMtPmxGcmFtZU51bSA9PSBwaS0+blByZXZGcmFtZSkgewogICAgLyogT29wcywgY29tcHJlc3Mgc2FtZSBmcmFtZSBhZ2FpbiA/IE9rYXksIGFzIHlvdSB3aXNoLgogICAgICogTm8gbmVlZCB0byByZWNvbXB1dGUgaW50ZXJuYWwgZnJhbWVkYXRhLCBiZWNhdXNlIHdlIG9ubHkgc3dhcHBlZCBidWZmZXJzICovCiAgICBMUFdPUkQgcFRtcCA9IHBpLT5wUHJldkZyYW1lOwoKICAgIHBpLT5wUHJldkZyYW1lID0gcGktPnBDdXJGcmFtZTsKICAgIHBpLT5wQ3VyRnJhbWUgID0gcFRtcDsKICB9IGVsc2UgaWYgKChscGljLT5kd0ZsYWdzICYgSUNDT01QUkVTU19LRVlGUkFNRSkgPT0gMCkgewogICAgTFBXT1JEIHBUbXA7CgogICAgV0FSTigiOiBwcmV2PSVsZCBjdXI9JWxkIGdvbmUgYmFjaz8gLS0gdW50ZXN0ZWRcbiIscGktPm5QcmV2RnJhbWUsbHBpYy0+bEZyYW1lTnVtKTsKICAgIGlmIChscGljLT5scGJpUHJldiA9PSBOVUxMIHx8IGxwaWMtPmxwUHJldiA9PSBOVUxMKQogICAgICByZXR1cm4gSUNFUlJfR09UT0tFWUZSQU1FOyAvKiBOZWVkIGEga2V5ZnJhbWUgaWYgeW91IGdvIGJhY2sgKi8KICAgIGlmIChDb21wcmVzc1F1ZXJ5KHBpLCBscGljLT5scGJpUHJldiwgbHBpYy0+bHBiaU91dHB1dCkgIT0gSUNFUlJfT0spCiAgICAgIHJldHVybiBJQ0VSUl9CQURGT1JNQVQ7CgogICAgV0FSTigiOiBwcmV2PSVsZCBjdXI9JWxkIGNvbXB1dGUgc3dhcHBlZCAtLSB1bnRlc3RlZFxuIixwaS0+blByZXZGcmFtZSxscGljLT5sRnJhbWVOdW0pOwogICAgY29tcHV0ZUludGVybmFsRnJhbWUocGksIGxwaWMtPmxwYmlQcmV2LCBscGljLT5scFByZXYpOwoKICAgIC8qIHN3YXAgYnVmZmVycyBmb3IgY3VycmVudCBhbmQgcHJldmlvdXMgZnJhbWUgKi8KICAgIC8qIERvbid0IGZyZWUgYW5kIGFsbG9jIG5ldyAtLSBjb3N0cyB0byBtdWNoIHRpbWUgYW5kIHRoZXkgYXJlIG9mIGVxdWFsIHNpemUgISAqLwogICAgcFRtcCA9IHBpLT5wUHJldkZyYW1lOwogICAgcGktPnBQcmV2RnJhbWUgPSBwaS0+cEN1ckZyYW1lOwogICAgcGktPnBDdXJGcmFtZSAgPSBwVG1wOwogICAgcGktPm5QcmV2RnJhbWUgPSBscGljLT5sRnJhbWVOdW07CiAgfQoKICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICBTZXRRdWFsaXR5KHBpLCBscGljLT5kd1F1YWxpdHkpOwoKICAgIGxwaWMtPmxwYmlPdXRwdXQtPmJpU2l6ZUltYWdlID0gMDsKCiAgICBpZiAobHBpYy0+bHBiaU91dHB1dC0+YmlCaXRDb3VudCA9PSA0KQogICAgICBNU1JMRTMyX0NvbXByZXNzUkxFNChwaSwgbHBpYy0+bHBiaUlucHV0LCAoTFBCWVRFKWxwaWMtPmxwSW5wdXQsCgkJICAgbHBpYy0+bHBiaU91dHB1dCwgKExQQllURSlscGljLT5scE91dHB1dCwgKGxwaWMtPmR3RmxhZ3MgJiBJQ0NPTVBSRVNTX0tFWUZSQU1FKSAhPSAwKTsKICAgIGVsc2UKICAgICAgTVNSTEUzMl9Db21wcmVzc1JMRTgocGksIGxwaWMtPmxwYmlJbnB1dCwgKExQQllURSlscGljLT5scElucHV0LAoJCSAgIGxwaWMtPmxwYmlPdXRwdXQsIChMUEJZVEUpbHBpYy0+bHBPdXRwdXQsIChscGljLT5kd0ZsYWdzICYgSUNDT01QUkVTU19LRVlGUkFNRSkgIT0gMCk7CgogICAgaWYgKGxwaWMtPmR3RnJhbWVTaXplID09IDAgfHwKCWxwaWMtPmxwYmlPdXRwdXQtPmJpU2l6ZUltYWdlIDwgbHBpYy0+ZHdGcmFtZVNpemUpCiAgICAgIGJyZWFrOwoKICAgIGlmICgoKmxwaWMtPmxwZHdGbGFncyAmIElDQ09NUFJFU1NfS0VZRlJBTUUpID09IDApIHsKICAgICAgaWYgKGxwaWMtPmxwYmlPdXRwdXQtPmJpQml0Q291bnQgPT0gNCkKCU1TUkxFMzJfQ29tcHJlc3NSTEU0KHBpLCBscGljLT5scGJpSW5wdXQsIChMUEJZVEUpbHBpYy0+bHBJbnB1dCwKCQkJICAgICBscGljLT5scGJpT3V0cHV0LCAoTFBCWVRFKWxwaWMtPmxwT3V0cHV0LCBUUlVFKTsKICAgICAgZWxzZQoJTVNSTEUzMl9Db21wcmVzc1JMRTgocGksIGxwaWMtPmxwYmlJbnB1dCwgKExQQllURSlscGljLT5scElucHV0LAoJCQkgICAgIGxwaWMtPmxwYmlPdXRwdXQsIChMUEJZVEUpbHBpYy0+bHBPdXRwdXQsIFRSVUUpOwoKICAgICAgaWYgKGxwaWMtPmR3RnJhbWVTaXplID09IDAgfHwKCSAgbHBpYy0+bHBiaU91dHB1dC0+YmlTaXplSW1hZ2UgPCBscGljLT5kd0ZyYW1lU2l6ZSkgewoJV0FSTigic3dpdGNoZWQgdG8ga2V5ZnJhbWUsIHdhcyBzbWFsbCBlbm91Z2ghXG4iKTsKCSpscGljLT5scGR3RmxhZ3MgfD0gSUNDT01QUkVTU19LRVlGUkFNRTsKCSpscGljLT5scGNraWQgICAgPSBNQUtFQVZJQ0tJRChja3R5cGVESUJiaXRzLAoJCQkJICAgICAgIFN0cmVhbUZyb21GT1VSQ0MoKmxwaWMtPmxwY2tpZCkpOwoJYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAobHBpYy0+ZHdRdWFsaXR5IDwgMTAwMCkKICAgICAgYnJlYWs7CgogICAgbHBpYy0+ZHdRdWFsaXR5IC09IDEwMDA7IC8qIHJlZHVjZSBxdWFsaXR5IGJ5IDEwJSAqLwogIH0KCiAgeyAvKiBzd2FwIGJ1ZmZlciBmb3IgY3VycmVudCBhbmQgcHJldmlvdXMgZnJhbWUgKi8KICAgIC8qIERvbid0IGZyZWUgYW5kIGFsbG9jIG5ldyAtLSBjb3N0cyB0byBtdWNoIHRpbWUgYW5kIHRoZXkgYXJlIG9mIGVxdWFsIHNpemUgISAqLwogICAgcmVnaXN0ZXIgTFBXT1JEIHBUbXAgPSBwaS0+cFByZXZGcmFtZTsKCiAgICBwaS0+cFByZXZGcmFtZSA9IHBpLT5wQ3VyRnJhbWU7CiAgICBwaS0+cEN1ckZyYW1lICA9IHBUbXA7CiAgICBwaS0+blByZXZGcmFtZSA9IGxwaWMtPmxGcmFtZU51bTsKICB9CgogIHJldHVybiBJQ0VSUl9PSzsKfQoKc3RhdGljIExSRVNVTFQgQ29tcHJlc3NFbmQoQ29kZWNJbmZvICpwaSkKewogIFRSQUNFKCIoJXApXG4iLHBpKTsKCiAgaWYgKHBpICE9IE5VTEwpIHsKICAgIGlmIChwaS0+cFByZXZGcmFtZSAhPSBOVUxMKQogICAgICBHbG9iYWxGcmVlUHRyKHBpLT5wUHJldkZyYW1lKTsKICAgIGlmIChwaS0+cEN1ckZyYW1lICE9IE5VTEwpCiAgICAgIEdsb2JhbEZyZWVQdHIocGktPnBDdXJGcmFtZSk7CiAgICBwaS0+cFByZXZGcmFtZSA9IE5VTEw7CiAgICBwaS0+cEN1ckZyYW1lICA9IE5VTEw7CiAgICBwaS0+blByZXZGcmFtZSA9IC0xOwogICAgcGktPmJDb21wcmVzcyAgPSBGQUxTRTsKICB9CgogIHJldHVybiBJQ0VSUl9PSzsKfQoKc3RhdGljIExSRVNVTFQgRGVjb21wcmVzc0dldEZvcm1hdChDb2RlY0luZm8gKnBpLCBMUENCSVRNQVBJTkZPSEVBREVSIGxwYmlJbiwKCQkJCSAgIExQQklUTUFQSU5GT0hFQURFUiBscGJpT3V0KQp7CiAgRFdPUkQgc2l6ZTsKCiAgVFJBQ0UoIiglcCwlcCwlcClcbiIscGksbHBiaUluLGxwYmlPdXQpOwoKICAvKiBwcmUtY29uZGl0aW9uICovCiAgYXNzZXJ0KHBpICE9IE5VTEwpOwoKICBpZiAobHBiaUluID09IE5VTEwpCiAgICByZXR1cm4gKGxwYmlPdXQgIT0gTlVMTCA/IElDRVJSX0JBRFBBUkFNIDogMCk7CgogIGlmIChEZWNvbXByZXNzUXVlcnkocGksIGxwYmlJbiwgTlVMTCkgIT0gSUNFUlJfT0spCiAgICByZXR1cm4gKGxwYmlPdXQgIT0gTlVMTCA/IElDRVJSX0JBREZPUk1BVCA6IDApOwoKICBzaXplID0gbHBiaUluLT5iaVNpemU7CgogIGlmIChscGJpSW4tPmJpQml0Q291bnQgPD0gOCkKICAgIHNpemUgKz0gbHBiaUluLT5iaUNsclVzZWQgKiBzaXplb2YoUkdCUVVBRCk7CgogIGlmIChscGJpT3V0ICE9IE5VTEwpIHsKICAgIG1lbWNweShscGJpT3V0LCBscGJpSW4sIHNpemUpOwogICAgbHBiaU91dC0+YmlDb21wcmVzc2lvbiAgPSBCSV9SR0I7CiAgICBscGJpT3V0LT5iaVNpemVJbWFnZSAgICA9IERJQldJRFRIQllURVMoKmxwYmlPdXQpICogbHBiaU91dC0+YmlIZWlnaHQ7CgogICAgcmV0dXJuIElDRVJSX09LOwogIH0gZWxzZQogICAgcmV0dXJuIHNpemU7Cn0KCnN0YXRpYyBMUkVTVUxUIERlY29tcHJlc3NRdWVyeShDb2RlY0luZm8gKnBpLCBMUENCSVRNQVBJTkZPSEVBREVSIGxwYmlJbiwKCQkJICAgICAgIExQQ0JJVE1BUElORk9IRUFERVIgbHBiaU91dCkKewogIExSRVNVTFQgaHIgPSBJQ0VSUl9PSzsKCiAgVFJBQ0UoIiglcCwlcCwlcClcbiIscGksbHBiaUluLGxwYmlPdXQpOwoKICAvKiBwcmUtY29uZGl0aW9uICovCiAgYXNzZXJ0KHBpICE9IE5VTEwpOwoKICAvKiBuZWVkIGF0IGxlYXN0IG9uZSBmb3JtYXQgKi8KICBpZiAobHBiaUluID09IE5VTEwgJiYgbHBiaU91dCA9PSBOVUxMKQogICAgcmV0dXJuIElDRVJSX0JBRFBBUkFNOwoKICAvKiBjaGVjayBpbnB1dCBmb3JtYXQgaWYgZ2l2ZW4gKi8KICBpZiAobHBiaUluICE9IE5VTEwpIHsKICAgIGlmICghaXNTdXBwb3J0ZWRNUkxFKGxwYmlJbikpCiAgICAgIHJldHVybiBJQ0VSUl9CQURGT1JNQVQ7CiAgfQoKICAvKiBjaGVjayBvdXRwdXQgZm9ybWF0IGlmIGdpdmVuICovCiAgaWYgKGxwYmlPdXQgIT0gTlVMTCkgewogICAgaWYgKCFpc1N1cHBvcnRlZERJQihscGJpT3V0KSkKICAgICAgaHIgPSBJQ0VSUl9CQURGT1JNQVQ7CgogICAgaWYgKGxwYmlJbiAhPSBOVUxMKSB7CiAgICAgIGlmIChscGJpSW4tPmJpV2lkdGggICE9IGxwYmlPdXQtPmJpV2lkdGgpCglociA9IElDRVJSX1VOU1VQUE9SVEVEOwogICAgICBpZiAobHBiaUluLT5iaUhlaWdodCAhPSBscGJpT3V0LT5iaUhlaWdodCkKCWhyID0gSUNFUlJfVU5TVVBQT1JURUQ7CiAgICAgIGlmIChscGJpSW4tPmJpQml0Q291bnQgPiBscGJpT3V0LT5iaUJpdENvdW50KQoJaHIgPSBJQ0VSUl9VTlNVUFBPUlRFRDsKICAgIH0KICB9CgogIHJldHVybiBocjsKfQoKc3RhdGljIExSRVNVTFQgRGVjb21wcmVzc0JlZ2luKENvZGVjSW5mbyAqcGksIExQQ0JJVE1BUElORk9IRUFERVIgbHBiaUluLAoJCQkgICAgICAgTFBDQklUTUFQSU5GT0hFQURFUiBscGJpT3V0KQp7CiAgY29uc3QgUkdCUVVBRCAqcmdiSW47CiAgY29uc3QgUkdCUVVBRCAqcmdiT3V0OwogIFVJTlQgIGk7CgogIFRSQUNFKCIoJXAsJXAsJXApXG4iLHBpLGxwYmlJbixscGJpT3V0KTsKCiAgLyogcHJlLWNvbmRpdGlvbiAqLwogIGFzc2VydChwaSAhPSBOVUxMKTsKCiAgLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGlmIChscGJpSW4gPT0gTlVMTCB8fCBscGJpT3V0ID09IE5VTEwpCiAgICByZXR1cm4gSUNFUlJfQkFEUEFSQU07CiAgaWYgKERlY29tcHJlc3NRdWVyeShwaSwgbHBiaUluLCBscGJpT3V0KSAhPSBJQ0VSUl9PSykKICAgIHJldHVybiBJQ0VSUl9CQURGT1JNQVQ7CgogIC8qIEZJWE1FOiBjYW5ub3QgY29tcHJlc3MgYW5kIGRlY29tcHJlc3MgYXQgYSB0aW1lISAqLwogIGlmIChwaS0+YkNvbXByZXNzKSB7CiAgICBGSVhNRSgiY2Fubm90IGNvbXByZXNzIGFuZCBkZWNvbXByZXNzIGF0IHNhbWUgdGltZSFcbiIpOwogICAgcmV0dXJuIElDRVJSX0VSUk9SOwogIH0KCiAgaWYgKHBpLT5iRGVjb21wcmVzcykKICAgIERlY29tcHJlc3NFbmQocGkpOwoKICByZ2JJbiAgPSAoY29uc3QgUkdCUVVBRCopKChjb25zdCBCWVRFKilscGJpSW4gICsgbHBiaUluLT5iaVNpemUpOwogIHJnYk91dCA9IChjb25zdCBSR0JRVUFEKikoKGNvbnN0IEJZVEUqKWxwYmlPdXQgKyBscGJpT3V0LT5iaVNpemUpOwoKICBzd2l0Y2ggKGxwYmlPdXQtPmJpQml0Q291bnQpIHsKICBjYXNlIDQ6CiAgY2FzZSA4OgogICAgcGktPnBhbGV0dGVfbWFwID0gKExQQllURSlMb2NhbEFsbG9jKExQVFIsIGxwYmlJbi0+YmlDbHJVc2VkKTsKICAgIGlmIChwaS0+cGFsZXR0ZV9tYXAgPT0gTlVMTCkKICAgICAgcmV0dXJuIElDRVJSX01FTU9SWTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgbHBiaUluLT5iaUNsclVzZWQ7IGkrKykgewogICAgICBwaS0+cGFsZXR0ZV9tYXBbaV0gPSBNU1JMRTMyX0dldE5lYXJlc3RQYWxldHRlSW5kZXgobHBiaU91dC0+YmlDbHJVc2VkLCByZ2JPdXQsIHJnYkluW2ldKTsKICAgIH0KICAgIGJyZWFrOwogIGNhc2UgMTU6CiAgY2FzZSAxNjoKICAgIHBpLT5wYWxldHRlX21hcCA9IChMUEJZVEUpTG9jYWxBbGxvYyhMUFRSLCBscGJpSW4tPmJpQ2xyVXNlZCAqIDIpOwogICAgaWYgKHBpLT5wYWxldHRlX21hcCA9PSBOVUxMKQogICAgICByZXR1cm4gSUNFUlJfTUVNT1JZOwoKICAgIGZvciAoaSA9IDA7IGkgPCBscGJpSW4tPmJpQ2xyVXNlZDsgaSsrKSB7CiAgICAgIFdPUkQgY29sb3I7CgogICAgICBpZiAobHBiaU91dC0+YmlCaXRDb3VudCA9PSAxNSkKCWNvbG9yID0gKChyZ2JJbltpXS5yZ2JSZWQgPj4gMykgPDwgMTApCgkgIHwgKChyZ2JJbltpXS5yZ2JHcmVlbiA+PiAzKSA8PCA1KSB8IChyZ2JJbltpXS5yZ2JCbHVlID4+IDMpOwogICAgICBlbHNlCgljb2xvciA9ICgocmdiSW5baV0ucmdiUmVkID4+IDMpIDw8IDExKQoJICB8ICgocmdiSW5baV0ucmdiR3JlZW4gPj4gMykgPDwgNSkgfCAocmdiSW5baV0ucmdiQmx1ZSA+PiAzKTsKCiAgICAgIHBpLT5wYWxldHRlX21hcFtpICogMiArIDFdID0gY29sb3IgPj4gODsKICAgICAgcGktPnBhbGV0dGVfbWFwW2kgKiAyICsgMF0gPSBjb2xvciAmIDB4RkY7CiAgICB9OwogICAgYnJlYWs7CiAgY2FzZSAyNDoKICBjYXNlIDMyOgogICAgcGktPnBhbGV0dGVfbWFwID0gKExQQllURSlMb2NhbEFsbG9jKExQVFIsIGxwYmlJbi0+YmlDbHJVc2VkICogc2l6ZW9mKFJHQlFVQUQpKTsKICAgIGlmIChwaS0+cGFsZXR0ZV9tYXAgPT0gTlVMTCkKICAgICAgcmV0dXJuIElDRVJSX01FTU9SWTsKICAgIG1lbWNweShwaS0+cGFsZXR0ZV9tYXAsIHJnYkluLCBscGJpSW4tPmJpQ2xyVXNlZCAqIHNpemVvZihSR0JRVUFEKSk7CiAgICBicmVhazsKICB9OwoKICBwaS0+YkRlY29tcHJlc3MgPSBUUlVFOwoKICByZXR1cm4gSUNFUlJfT0s7Cn0KCnN0YXRpYyBMUkVTVUxUIERlY29tcHJlc3MoQ29kZWNJbmZvICpwaSwgSUNERUNPTVBSRVNTICpwaWMsIERXT1JEIGR3U2l6ZSkKewogIFRSQUNFKCIoJXAsJXAsJWx1KVxuIixwaSxwaWMsZHdTaXplKTsKCiAgLyogcHJlLWNvbmRpdGlvbiAqLwogIGFzc2VydChwaSAhPSBOVUxMKTsKCiAgLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGlmIChwaWMgPT0gTlVMTCkKICAgIHJldHVybiBJQ0VSUl9CQURQQVJBTTsKICBpZiAocGljLT5scGJpSW5wdXQgPT0gTlVMTCB8fCBwaWMtPmxwSW5wdXQgPT0gTlVMTCB8fAogICAgICBwaWMtPmxwYmlPdXRwdXQgPT0gTlVMTCB8fCBwaWMtPmxwT3V0cHV0ID09IE5VTEwpCiAgICByZXR1cm4gSUNFUlJfQkFEUEFSQU07CgogIC8qIGNoZWNrIGZvcm1hdHMgKi8KICBpZiAoISBwaS0+YkRlY29tcHJlc3MpIHsKICAgIExSRVNVTFQgaHIgPSBEZWNvbXByZXNzQmVnaW4ocGksIHBpYy0+bHBiaUlucHV0LCBwaWMtPmxwYmlPdXRwdXQpOwogICAgaWYgKGhyICE9IElDRVJSX09LKQogICAgICByZXR1cm4gaHI7CiAgfSBlbHNlIGlmIChEZWNvbXByZXNzUXVlcnkocGksIHBpYy0+bHBiaUlucHV0LCBwaWMtPmxwYmlPdXRwdXQpICE9IElDRVJSX09LKQogICAgcmV0dXJuIElDRVJSX0JBREZPUk1BVDsKCiAgYXNzZXJ0KHBpYy0+bHBiaUlucHV0LT5iaVdpZHRoICA9PSBwaWMtPmxwYmlPdXRwdXQtPmJpV2lkdGgpOwogIGFzc2VydChwaWMtPmxwYmlJbnB1dC0+YmlIZWlnaHQgPT0gcGljLT5scGJpT3V0cHV0LT5iaUhlaWdodCk7CgogIHBpYy0+bHBiaU91dHB1dC0+YmlTaXplSW1hZ2UgPSBESUJXSURUSEJZVEVTKCpwaWMtPmxwYmlPdXRwdXQpICogcGljLT5scGJpT3V0cHV0LT5iaUhlaWdodDsKICBpZiAocGljLT5scGJpSW5wdXQtPmJpQml0Q291bnQgPT0gNCkKICAgIHJldHVybiBNU1JMRTMyX0RlY29tcHJlc3NSTEU0KHBpLCBwaWMtPmxwYmlPdXRwdXQsIHBpYy0+bHBJbnB1dCwgcGljLT5scE91dHB1dCk7CiAgZWxzZQogICAgcmV0dXJuIE1TUkxFMzJfRGVjb21wcmVzc1JMRTgocGksIHBpYy0+bHBiaU91dHB1dCwgcGljLT5scElucHV0LCBwaWMtPmxwT3V0cHV0KTsKfQoKc3RhdGljIExSRVNVTFQgRGVjb21wcmVzc0VuZChDb2RlY0luZm8gKnBpKQp7CiAgVFJBQ0UoIiglcClcbiIscGkpOwoKICAvKiBwcmUtY29uZGl0aW9uICovCiAgYXNzZXJ0KHBpICE9IE5VTEwpOwoKICBwaS0+YkRlY29tcHJlc3MgPSBGQUxTRTsKCiAgaWYgKHBpLT5wYWxldHRlX21hcCAhPSBOVUxMKSB7CiAgICBMb2NhbEZyZWUoKEhMT0NBTClwaS0+cGFsZXR0ZV9tYXApOwogICAgcGktPnBhbGV0dGVfbWFwID0gTlVMTDsKICB9CgogIHJldHVybiBJQ0VSUl9PSzsKfQoKc3RhdGljIExSRVNVTFQgRGVjb21wcmVzc0dldFBhbGV0dGUoQ29kZWNJbmZvICpwaSwgTFBDQklUTUFQSU5GT0hFQURFUiBscGJpSW4sCgkJCQkgICAgTFBCSVRNQVBJTkZPSEVBREVSIGxwYmlPdXQpCnsKICBpbnQgc2l6ZTsKCiAgVFJBQ0UoIiglcCwlcCwlcClcbiIscGksbHBiaUluLGxwYmlPdXQpOwoKICAvKiBwcmUtY29uZGl0aW9uICovCiAgYXNzZXJ0KHBpICE9IE5VTEwpOwoKICAvKiBjaGVjayBwYXJhbWV0ZXJzICovCiAgaWYgKGxwYmlJbiA9PSBOVUxMIHx8IGxwYmlPdXQgPT0gTlVMTCkKICAgIHJldHVybiBJQ0VSUl9CQURQQVJBTTsKCiAgaWYgKERlY29tcHJlc3NRdWVyeShwaSwgbHBiaUluLCBscGJpT3V0KSAhPSBJQ0VSUl9PSykKICAgIHJldHVybiBJQ0VSUl9CQURGT1JNQVQ7CgogIGlmIChscGJpT3V0LT5iaUJpdENvdW50ID4gOCkKICAgIHJldHVybiBJQ0VSUl9FUlJPUjsKCiAgaWYgKGxwYmlJbi0+YmlCaXRDb3VudCA8PSA4KSB7CiAgICBpZiAobHBiaUluLT5iaUNsclVzZWQgPiAwKQogICAgICBzaXplID0gbHBiaUluLT5iaUNsclVzZWQ7CiAgICBlbHNlCiAgICAgIHNpemUgPSAoMSA8PCBscGJpSW4tPmJpQml0Q291bnQpOwoKICAgIGxwYmlPdXQtPmJpQ2xyVXNlZCA9IHNpemU7CgogICAgbWVtY3B5KChMUEJZVEUpbHBiaU91dCArIGxwYmlPdXQtPmJpU2l6ZSwgKGNvbnN0IEJZVEUqKWxwYmlJbiArIGxwYmlJbi0+YmlTaXplLCBzaXplICogc2l6ZW9mKFJHQlFVQUQpKTsKICB9IC8qIGVsc2UgY291bGQgbmV2ZXIgb2NjdXIgISAqLwoKICByZXR1cm4gSUNFUlJfT0s7Cn0KCi8qIERyaXZlclByb2MgLSBlbnRyeSBwb2ludCBmb3IgYW4gaW5zdGFsbGFibGUgZHJpdmVyICovCkxSRVNVTFQgQ0FMTEJBQ0sgTVNSTEUzMl9Ecml2ZXJQcm9jKERXT1JEIGR3RHJ2SUQsIEhEUlZSIGhEcnYsIFVJTlQgdU1zZywKCQkJCSAgICBMUEFSQU0gbFBhcmFtMSwgTFBBUkFNIGxQYXJhbTIpCnsKICBDb2RlY0luZm8gKnBpID0gKENvZGVjSW5mbyopZHdEcnZJRDsKCiAgVFJBQ0UoIiglcCwlcCwweCUwNFgsMHglMDhsWCwweCUwOGxYKVxuIiwgKExQVk9JRClkd0RydklELCAoTFBWT0lEKWhEcnYsCgl1TXNnLCBsUGFyYW0xLCBsUGFyYW0yKTsKCiAgc3dpdGNoICh1TXNnKSB7CiAgICAvKiBzdGFuZGFyZCBkcml2ZXIgbWVzc2FnZXMgKi8KICBjYXNlIERSVl9MT0FEOgogICAgcmV0dXJuIERSVkNORl9PSzsKICBjYXNlIERSVl9PUEVOOgogICAgaWYgKGxQYXJhbTIgPT0gMCkKICAgICAgcmV0dXJuIChMUkVTVUxUKTB4RkZGRjAwMDA7CiAgICBlbHNlCiAgICAgIHJldHVybiAoTFJFU1VMVClPcGVuKChJQ09QRU4qKWxQYXJhbTIpOwogIGNhc2UgRFJWX0NMT1NFOgogICAgaWYgKGR3RHJ2SUQgIT0gMHhGRkZGMDAwMCAmJiAoTFBWT0lEKWR3RHJ2SUQgIT0gTlVMTCkKICAgICAgQ2xvc2UocGkpOwogICAgcmV0dXJuIERSVkNORl9PSzsKICBjYXNlIERSVl9FTkFCTEU6CiAgY2FzZSBEUlZfRElTQUJMRToKICAgIHJldHVybiBEUlZDTkZfT0s7CiAgY2FzZSBEUlZfRlJFRToKICAgIHJldHVybiBEUlZDTkZfT0s7CiAgY2FzZSBEUlZfUVVFUllDT05GSUdVUkU6CiAgICByZXR1cm4gRFJWQ05GX0NBTkNFTDsgLyogRklYTUUgKi8KICBjYXNlIERSVl9DT05GSUdVUkU6CiAgICByZXR1cm4gRFJWQ05GX09LOyAgICAgLyogRklYTUUgKi8KICBjYXNlIERSVl9JTlNUQUxMOgogIGNhc2UgRFJWX1JFTU9WRToKICAgIHJldHVybiBEUlZDTkZfT0s7CgogICAgLyogaW5zdGFsbGFibGUgY29tcHJlc3Npb24gbWFuYWdlciBtZXNzYWdlcyAqLwogIGNhc2UgSUNNX0NPTkZJR1VSRToKICAgIEZJWE1FKCJJQ01fQ09ORklHVVJFICglbGQpXG4iLGxQYXJhbTEpOwogICAgaWYgKGxQYXJhbTEgPT0gLTEpCiAgICAgIHJldHVybiBJQ0VSUl9VTlNVUFBPUlRFRDsgLyogRklYTUUgKi8KICAgIGVsc2UKICAgICAgcmV0dXJuIENvbmZpZ3VyZShwaSwgKEhXTkQpbFBhcmFtMSk7CiAgY2FzZSBJQ01fQUJPVVQ6CiAgICBpZiAobFBhcmFtMSA9PSAtMSkKICAgICAgcmV0dXJuIElDRVJSX09LOwogICAgZWxzZQogICAgICByZXR1cm4gQWJvdXQocGksIChIV05EKWxQYXJhbTEpOwogIGNhc2UgSUNNX0dFVFNUQVRFOgogIGNhc2UgSUNNX1NFVFNUQVRFOgogICAgcmV0dXJuIDA7IC8qIG5vIHN0YXRlICovCiAgY2FzZSBJQ01fR0VUSU5GTzoKICAgIHJldHVybiBHZXRJbmZvKHBpLCAoSUNJTkZPKilsUGFyYW0xLCAoRFdPUkQpbFBhcmFtMik7CiAgY2FzZSBJQ01fR0VUREVGQVVMVFFVQUxJVFk6CiAgICBpZiAoKExQVk9JRClsUGFyYW0xICE9IE5VTEwpIHsKICAgICAgKigoTFBEV09SRClsUGFyYW0xKSA9IE1TUkxFMzJfREVGQVVMVFFVQUxJVFk7CiAgICAgIHJldHVybiBJQ0VSUl9PSzsKICAgIH0KICAgIGJyZWFrOwogIGNhc2UgSUNNX0dFVFFVQUxJVFk6CiAgICBpZiAoKExQVk9JRClsUGFyYW0xICE9IE5VTEwpIHsKICAgICAgKigoTFBEV09SRClsUGFyYW0xKSA9IHBpLT5kd1F1YWxpdHk7CiAgICAgIHJldHVybiBJQ0VSUl9PSzsKICAgIH0KICAgIGJyZWFrOwogIGNhc2UgSUNNX1NFVFFVQUxJVFk6CiAgICByZXR1cm4gU2V0UXVhbGl0eShwaSwgKihMUExPTkcpbFBhcmFtMSk7CiAgY2FzZSBJQ01fQ09NUFJFU1NfR0VUX0ZPUk1BVDoKICAgIHJldHVybiBDb21wcmVzc0dldEZvcm1hdChwaSwgKExQQ0JJVE1BUElORk9IRUFERVIpbFBhcmFtMSwKCQkJICAgICAoTFBCSVRNQVBJTkZPSEVBREVSKWxQYXJhbTIpOwogIGNhc2UgSUNNX0NPTVBSRVNTX0dFVF9TSVpFOgogICAgcmV0dXJuIENvbXByZXNzR2V0U2l6ZShwaSwgKExQQ0JJVE1BUElORk9IRUFERVIpbFBhcmFtMSwKCQkJICAgKExQQ0JJVE1BUElORk9IRUFERVIpbFBhcmFtMik7CiAgY2FzZSBJQ01fQ09NUFJFU1NfUVVFUlk6CiAgICByZXR1cm4gQ29tcHJlc3NRdWVyeShwaSwgKExQQ0JJVE1BUElORk9IRUFERVIpbFBhcmFtMSwKCQkJIChMUENCSVRNQVBJTkZPSEVBREVSKWxQYXJhbTIpOwogIGNhc2UgSUNNX0NPTVBSRVNTX0JFR0lOOgogICAgcmV0dXJuIENvbXByZXNzQmVnaW4ocGksIChMUENCSVRNQVBJTkZPSEVBREVSKWxQYXJhbTEsCgkJCSAoTFBDQklUTUFQSU5GT0hFQURFUilsUGFyYW0yKTsKICBjYXNlIElDTV9DT01QUkVTUzoKICAgIHJldHVybiBDb21wcmVzcyhwaSwgKElDQ09NUFJFU1MqKWxQYXJhbTEsIChEV09SRClsUGFyYW0yKTsKICBjYXNlIElDTV9DT01QUkVTU19FTkQ6CiAgICByZXR1cm4gQ29tcHJlc3NFbmQocGkpOwogIGNhc2UgSUNNX0RFQ09NUFJFU1NfR0VUX0ZPUk1BVDoKICAgIHJldHVybiBEZWNvbXByZXNzR2V0Rm9ybWF0KHBpLCAoTFBDQklUTUFQSU5GT0hFQURFUilsUGFyYW0xLAoJCQkgICAgICAgKExQQklUTUFQSU5GT0hFQURFUilsUGFyYW0yKTsKICBjYXNlIElDTV9ERUNPTVBSRVNTX1FVRVJZOgogICAgcmV0dXJuIERlY29tcHJlc3NRdWVyeShwaSwgKExQQ0JJVE1BUElORk9IRUFERVIpbFBhcmFtMSwKCQkJICAgKExQQ0JJVE1BUElORk9IRUFERVIpbFBhcmFtMik7CiAgY2FzZSBJQ01fREVDT01QUkVTU19CRUdJTjoKICAgIHJldHVybiBEZWNvbXByZXNzQmVnaW4ocGksIChMUENCSVRNQVBJTkZPSEVBREVSKWxQYXJhbTEsCgkJCSAgIChMUENCSVRNQVBJTkZPSEVBREVSKWxQYXJhbTIpOwogIGNhc2UgSUNNX0RFQ09NUFJFU1M6CiAgICByZXR1cm4gRGVjb21wcmVzcyhwaSwgKElDREVDT01QUkVTUyopbFBhcmFtMSwgKERXT1JEKWxQYXJhbTIpOwogIGNhc2UgSUNNX0RFQ09NUFJFU1NfRU5EOgogICAgcmV0dXJuIERlY29tcHJlc3NFbmQocGkpOwogIGNhc2UgSUNNX0RFQ09NUFJFU1NfU0VUX1BBTEVUVEU6CiAgICBGSVhNRSgiKC4uLikgLT4gU2V0UGFsZXR0ZSglcCwlcCwlcCk6IHN0dWIhXG4iLCBwaSwgKExQVk9JRClsUGFyYW0xLCAoTFBWT0lEKWxQYXJhbTIpOwogICAgcmV0dXJuIElDRVJSX1VOU1VQUE9SVEVEOwogIGNhc2UgSUNNX0RFQ09NUFJFU1NfR0VUX1BBTEVUVEU6CiAgICByZXR1cm4gRGVjb21wcmVzc0dldFBhbGV0dGUocGksIChMUEJJVE1BUElORk9IRUFERVIpbFBhcmFtMSwKCQkJCShMUEJJVE1BUElORk9IRUFERVIpbFBhcmFtMik7CiAgY2FzZSBJQ01fR0VUREVGQVVMVEtFWUZSQU1FUkFURToKICAgIGlmICgoTFBWT0lEKWxQYXJhbTEgIT0gTlVMTCkKICAgICAgKihMUERXT1JEKWxQYXJhbTEgPSAxNTsKICAgIHJldHVybiBJQ0VSUl9PSzsKICBkZWZhdWx0OgogICAgaWYgKHVNc2cgPCBEUlZfVVNFUikKICAgICAgcmV0dXJuIERlZkRyaXZlclByb2MoZHdEcnZJRCwgaERydiwgdU1zZywgbFBhcmFtMSwgbFBhcmFtMik7CiAgICBlbHNlCiAgICAgIEZJWE1FKCJVbmtub3duIG1lc3NhZ2UgdU1zZz0weCUwOFggbFBhcmFtMT0weCUwOGxYIGxQYXJhbTI9MHglMDhsWFxuIix1TXNnLGxQYXJhbTEsbFBhcmFtMik7CiAgfTsKCiAgcmV0dXJuIElDRVJSX1VOU1VQUE9SVEVEOwp9CgovKiBEbGxNYWluIC0gbGlicmFyeSBpbml0aWFsaXphdGlvbiBjb2RlICovCkJPT0wgV0lOQVBJIERsbE1haW4oSElOU1RBTkNFIGhNb2R1bGUsIERXT1JEIGR3UmVhc29uLCBMUFZPSUQgbHBSZXNlcnZlZCkKewogIFRSQUNFKCIoJXAsJWxkLCVwKVxuIiwoTFBWT0lEKWhNb2R1bGUsZHdSZWFzb24sbHBSZXNlcnZlZCk7CgogIHN3aXRjaCAoZHdSZWFzb24pIHsKICBjYXNlIERMTF9QUk9DRVNTX0FUVEFDSDoKICAgIERpc2FibGVUaHJlYWRMaWJyYXJ5Q2FsbHMoaE1vZHVsZSk7CiAgICBNU1JMRTMyX2hNb2R1bGUgPSBoTW9kdWxlOwogICAgYnJlYWs7CgogIGNhc2UgRExMX1BST0NFU1NfREVUQUNIOgogICAgYnJlYWs7CiAgfTsKCiAgcmV0dXJuIFRSVUU7Cn0K