LyogLSotIHRhYi13aWR0aDogODsgYy1iYXNpYy1vZmZzZXQ6IDQgLSotICovCgovKgogKiBTYW1wbGUgTUlESSBXaW5lIERyaXZlciBmb3IgTGludXgKICoKICogQ29weXJpZ2h0IDE5OTQgTWFydGluIEF5b3R0ZQogKi8KCi8qIAogKiBFcmljIFBPVUVDSCA6IAogKiA5OC83IGNoYW5nZXMgZm9yIG1ha2luZyB0aGlzIE1JREkgZHJpdmVyIHdvcmsgb24gT1NTCiAqIAljdXJyZW50IHN1cHBvcnQgaXMgbGltaXRlZCB0byBNSURJIHBvcnRzIG9mIE9TUyBzeXN0ZW1zCiAqIDk4LzkJcmV3cml0aW5nIE1DSSBjb2RlIGZvciBNSURJCiAqIDk4LzExIHNwbGl0dGVkIGluIG1pZGkuYyBhbmQgbWNpbWlkaS5jCiAqLwoKI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgImxkdC5oIgojaW5jbHVkZSAibXVsdGltZWRpYS5oIgojaW5jbHVkZSAidXNlci5oIgojaW5jbHVkZSAiZHJpdmVyLmgiCiNpbmNsdWRlICJ4bWFsbG9jLmgiCiNpbmNsdWRlICJkZWJ1Zy5oIgojaW5jbHVkZSAiaGVhcC5oIgoKREVDTEFSRV9ERUJVR19DSEFOTkVMKG1jaW1pZGkpCkRFQ0xBUkVfREVCVUdfQ0hBTk5FTChtaWRpKQoKdHlwZWRlZiBzdHJ1Y3QgewogICAgRFdPUkQJCWR3Rmlyc3Q7CQkvKiBvZmZzZXQgaW4gZmlsZSBvZiB0cmFjayAqLwogICAgRFdPUkQJCWR3TGFzdDsJCQkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gZmlsZSBvZiB0cmFjayAqLwogICAgRFdPUkQJCWR3SW5kZXg7CQkvKiBjdXJyZW50IGluZGV4IGluIGZpbGUgKGR3Rmlyc3QgPD0gZHdJbmRleCA8IGR3TGFzdCkgKi8KICAgIERXT1JECQlkd0xlbmd0aDsJCS8qIG51bWJlciBvZiBwdWxzZXMgaW4gdGhpcyB0cmFjayAqLwogICAgRFdPUkQJCWR3RXZlbnRQdWxzZTsJCS8qIGN1cnJlbnQgcHVsc2UgIyAoZXZlbnQpIHBvaW50ZWQgYnkgZHdJbmRleCAqLwogICAgRFdPUkQJCWR3RXZlbnREYXRhOwkJLyogY3VycmVudCBkYXRhICAgIChldmVudCkgcG9pbnRlZCBieSBkd0luZGV4ICovCiAgICBXT1JECQl3RXZlbnRMZW5ndGg7CQkvKiBjdXJyZW50IGxlbmd0aCAgKGV2ZW50KSBwb2ludGVkIGJ5IGR3SW5kZXggKi8KICAgIFdPUkQJCXdTdGF0dXMgOiAxLAkJLyogMSA6IHBsYXlpbmcsIDAgOiBkb25lICovCgkgICAgICAgICAgICAgICAgd1RyYWNrTnIgOiA3LAoJICAgICAgICAgICAgICAgIHdMYXN0Q29tbWFuZCA6IDg7Cn0gTUNJX01JRElUUkFDSzsKCnR5cGVkZWYgc3RydWN0IHsKICAgIGludAkJCW5Vc2VDb3VudDsgICAgICAgICAgCS8qIEluY3JlbWVudGVkIGZvciBlYWNoIHNoYXJlZCBvcGVuICAgICAgICAgICovCiAgICBXT1JECQl3Tm90aWZ5RGV2aWNlSUQ7ICAgIAkvKiBNQ0kgZGV2aWNlIElEIHdpdGggYSBwZW5kaW5nIG5vdGlmaWNhdGlvbiAqLwogICAgSEFORExFMTYgCQloQ2FsbGJhY2s7ICAgICAgICAgCS8qIENhbGxiYWNrIGhhbmRsZSBmb3IgcGVuZGluZyBub3RpZmljYXRpb24gICovCiAgICBITU1JTwkJaEZpbGU7CSAgICAgICAgICAgIAkvKiBtbWlvIGZpbGUgaGFuZGxlIG9wZW4gYXMgRWxlbWVudCAgICAgICAgICAqLwogICAgTUNJX09QRU5fUEFSTVNBIAlvcGVuUGFybXM7CiAgICBITE9DQUwxNgkJaE1pZGlIZHI7CiAgICBXT1JECQlkd1N0YXR1czsJCS8qIG9uZSBmcm9tIE1DSV9NT0RFX3h4eHggKi8KICAgIERXT1JECQlkd01jaVRpbWVGb3JtYXQ7CS8qIE9uZSBvZiB0aGUgc3VwcG9ydGVkIE1DSV9GT1JNQVRfeHh4eCAqLwkgICAgICAgCiAgICBXT1JECQl3Rm9ybWF0OwkJLyogRm9ybWF0IG9mIE1JREkgaEZpbGUgKDAsIDEgb3IgMikgKi8KICAgIFdPUkQJCW5UcmFja3M7CQkvKiBOdW1iZXIgb2YgdHJhY2tzIGluIGhGaWxlICovCiAgICBXT1JECQluRGl2aXNpb247CQkvKiBOdW1iZXIgb2YgZGl2aXNpb24gaW4gaEZpbGUgUFBRTiBvciBTTVBURSAqLwogICAgV09SRAkJd1N0YXJ0ZWRQbGF5aW5nOwogICAgRFdPUkQJCWR3VGVtcG87CQkvKiBUZW1wbyAoIyBvZiAxLzQgbm90ZSBwZXIgc2Vjb25kICovCiAgICBNQ0lfTUlESVRSQUNLKiAgICAgCXRyYWNrczsJCQkvKiBDb250ZW50IG9mIGVhY2ggdHJhY2sgKi8KICAgIERXT1JECQlkd1B1bHNlOwkJCiAgICBEV09SRAkJZHdQb3NpdGlvbk1TOwogICAgRFdPUkQJCWR3U3RhcnRUaWNrczsKfSBXSU5FX01DSU1JREk7CgojZGVmaW5lIE1BWF9NQ0lNSURJRFJWIAkoMSkKc3RhdGljIFdJTkVfTUNJTUlESQlNQ0lNaWRpRGV2W01BWF9NQ0lNSURJRFJWXTsKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSoKICogICAgICAgICAgICAgICAgICAJICAgIE1DSSBNSURJIGltcGxlbWFudGF0aW9uCQkJKgogKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKI2lmZGVmIFNORENUTF9NSURJX0lORk8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaUdldE9wZW5EZXYJCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMgV0lORV9NQ0lNSURJKiAgTUlESV9tY2lHZXRPcGVuRGV2KFVJTlQxNiB3RGV2SUQpCnsKICAgIGlmICh3RGV2SUQgPj0gTUFYX01DSU1JRElEUlYgfHwgTUNJTWlkaURldlt3RGV2SURdLm5Vc2VDb3VudCA9PSAwKSB7CglXQVJOKG1jaW1pZGksICJJbnZhbGlkIHdEZXZJRD0ldVxuIiwgd0RldklEKTsKCXJldHVybiAwOwogICAgfQogICAgcmV0dXJuICZNQ0lNaWRpRGV2W3dEZXZJRF07Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lSZWFkQnl0ZQkJW2ludGVybmFsXQkKICovCnN0YXRpYyBEV09SRCBNSURJX21jaVJlYWRCeXRlKFdJTkVfTUNJTUlESSogd21tLCBCWVRFICpscGJ5dCkKewogICAgRFdPUkQJcmV0ID0gMDsKICAgIAogICAgaWYgKGxwYnl0ID09IE5VTEwgfHwgCgltbWlvUmVhZCh3bW0tPmhGaWxlLCAoSFBTVFIpbHBieXQsIChsb25nKXNpemVvZihCWVRFKSkgIT0gKGxvbmcpc2l6ZW9mKEJZVEUpKSB7CglXQVJOKG1jaW1pZGksICJFcnJvciByZWFkaW5nIHdtbT0lcFxuIiwgd21tKTsKCXJldCA9IE1DSUVSUl9JTlRFUk5BTDsKICAgIH0KICAgIAogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVJlYWRXb3JkCQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpUmVhZFdvcmQoV0lORV9NQ0lNSURJKiB3bW0sIExQV09SRCBscHcpCnsKICAgIEJZVEUJaGlieXRlLCBsb2J5dGU7CiAgICBEV09SRAlyZXQgPSBNQ0lFUlJfSU5URVJOQUw7CiAgICAKICAgIGlmIChscHcgIT0gTlVMTCAmJiAKCU1JRElfbWNpUmVhZEJ5dGUod21tLCAmaGlieXRlKSA9PSAwICYmIAoJTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZsb2J5dGUpID09IDApIHsKCSpscHcgPSAoKFdPUkQpaGlieXRlIDw8IDgpICsgbG9ieXRlOwoJcmV0ID0gMDsKICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lSZWFkTG9uZwkJW2ludGVybmFsXQkKICovCnN0YXRpYyBEV09SRCBNSURJX21jaVJlYWRMb25nKFdJTkVfTUNJTUlESSogd21tLCBMUERXT1JEIGxwZHcpCnsKICAgIFdPUkQJaGl3b3JkLCBsb3dvcmQ7CiAgICBEV09SRAlyZXQgPSBNQ0lFUlJfSU5URVJOQUw7CiAgICAKICAgIGlmIChscGR3ICE9IE5VTEwgJiYKCU1JRElfbWNpUmVhZFdvcmQod21tLCAmaGl3b3JkKSA9PSAwICYmCglNSURJX21jaVJlYWRXb3JkKHdtbSwgJmxvd29yZCkgPT0gMCkgewoJKmxwZHcgPSBNQUtFTE9ORyhsb3dvcmQsIGhpd29yZCk7CglyZXQgPSAwOwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAJCQkJTUlESV9tY2lSZWFkVmFyeUxlbgkJW2ludGVybmFsXQkKICovCnN0YXRpYyBXT1JEIE1JRElfbWNpUmVhZFZhcnlMZW4oV0lORV9NQ0lNSURJKiB3bW0sIExQRFdPUkQgbHBkdykKewogICAgQllURQlieXRlOwogICAgRFdPUkQJdmFsdWUgPSAwOwogICAgV09SRAlyZXQgPSAwOwogICAgCiAgICBpZiAobHBkdyA9PSBOVUxMKSB7CglyZXQgPSBNQ0lFUlJfSU5URVJOQUw7CiAgICB9IGVsc2UgewoJZG8gewoJICAgIGlmIChNSURJX21jaVJlYWRCeXRlKHdtbSwgJmJ5dGUpICE9IDApIHsKCQlyZXR1cm4gMDsKCSAgICB9CgkgICAgdmFsdWUgPSAodmFsdWUgPDwgNykgKyAoYnl0ZSAmIDB4N0YpOwoJICAgIHJldCsrOyAKCX0gd2hpbGUgKGJ5dGUgJiAweDgwKTsKCSpscGR3ID0gdmFsdWU7CgkvKgoJICBUUkFDRShtY2ltaWRpLCAidmFsPSUwOGxYIFxuIiwgdmFsdWUpOwoJKi8KICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lSZWFkTmV4dEV2ZW50CQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljIERXT1JECU1JRElfbWNpUmVhZE5leHRFdmVudChXSU5FX01DSU1JREkqIHdtbSwgTUNJX01JRElUUkFDSyogbW10KSAKewogICAgQllURQliMSwgYjIgPSAwLCBiMzsKICAgIFdPUkQJaHcgPSAwOwogICAgRFdPUkQJZXZ0UHVsc2U7CiAgICBEV09SRAlldnRMZW5ndGg7CiAgICBEV09SRAl0bXA7CiAgICAKICAgIGlmIChtbWlvU2Vlayh3bW0tPmhGaWxlLCBtbXQtPmR3SW5kZXgsIFNFRUtfU0VUKSAhPSBtbXQtPmR3SW5kZXgpIHsKCVdBUk4obWNpbWlkaSwgIkNhbid0IHNlZWsgYXQgJTA4bFggXG4iLCBtbXQtPmR3SW5kZXgpOwoJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKICAgIH0KICAgIGV2dExlbmd0aCA9IE1JRElfbWNpUmVhZFZhcnlMZW4od21tLCAmZXZ0UHVsc2UpICsgMTsJLyogPiAwICovCiAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmIxKTsKICAgIHN3aXRjaCAoYjEpIHsKICAgIGNhc2UgMHhGMDoKICAgIGNhc2UgMHhGNzoKCWV2dExlbmd0aCArPSBNSURJX21jaVJlYWRWYXJ5TGVuKHdtbSwgJnRtcCk7CglldnRMZW5ndGggKz0gdG1wOwoJYnJlYWs7CiAgICBjYXNlIDB4RkY6CglNSURJX21jaVJlYWRCeXRlKHdtbSwgJmIyKTsJZXZ0TGVuZ3RoKys7CgkKCWV2dExlbmd0aCArPSBNSURJX21jaVJlYWRWYXJ5TGVuKHdtbSwgJnRtcCk7CglpZiAoZXZ0TGVuZ3RoID49IDB4MTAwMDB1KSB7CgkgICAgLyogdGhpcyBsaW1pdGF0aW9uIHNob3VsZG4ndCBiZSBhIHByb2JsZW0gKi8KCSAgICBXQVJOKG1jaW1pZGksICJPdWNoICEhIEltcGxlbWVudGF0aW9uIGxpbWl0YXRpb24gdG8gNjRrIGJ5dGVzIGZvciBhIE1JREkgZXZlbnQgaXMgb3ZlcmZsb3dlZFxuIik7CgkgICAgaHcgPSAweEZGRkY7Cgl9IGVsc2UgewoJICAgIGh3ID0gTE9XT1JEKGV2dExlbmd0aCk7Cgl9CglldnRMZW5ndGggKz0gdG1wOwoJYnJlYWs7CiAgICBkZWZhdWx0OgoJaWYgKGIxICYgMHg4MCkgeyAvKiB1c2UgcnVubmluZyBzdGF0dXMgPyAqLwoJICAgIG1tdC0+d0xhc3RDb21tYW5kID0gYjE7CgkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZiMik7CWV2dExlbmd0aCsrOwoJfSBlbHNlIHsKCSAgICBiMiA9IGIxOwoJICAgIGIxID0gbW10LT53TGFzdENvbW1hbmQ7Cgl9Cglzd2l0Y2ggKChiMSA+PiA0KSAmIDB4MDcpIHsKCWNhc2UgMDoJY2FzZSAxOgljYXNlIDI6IGNhc2UgMzogY2FzZSA2OgoJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmYjMpOwlldnRMZW5ndGgrKzsKCSAgICBodyA9IGIzOwoJICAgIGJyZWFrOwoJY2FzZSA0OgljYXNlIDU6CgkgICAgYnJlYWs7CgljYXNlIDc6CgkgICAgV0FSTihtY2ltaWRpLCAiU3RyYW5nZSBpbmRlZWQgYjE9MHglMDJ4XG4iLCBiMSk7Cgl9CglicmVhazsKICAgIH0KICAgIGlmIChtbXQtPmR3SW5kZXggKyBldnRMZW5ndGggPiBtbXQtPmR3TGFzdCkKCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAgICAKICAgIG1tdC0+ZHdFdmVudFB1bHNlICs9IGV2dFB1bHNlOwogICAgbW10LT5kd0V2ZW50RGF0YSAgID0gKGh3IDw8IDE2KSArIChiMiA8PCA4KSArIGIxOwogICAgbW10LT53RXZlbnRMZW5ndGggID0gZXZ0TGVuZ3RoOwogICAgCiAgICAvKgogICAgICBUUkFDRShtY2ltaWRpLCAiWyV1XSA9PiBwdWxzZT0lMDhseCglMDhseCksIGRhdGE9JTA4bHgsIGxlbmd0aD0ldVxuIiwgCiAgICAgIG1tdC0+d1RyYWNrTnIsIG1tdC0+ZHdFdmVudFB1bHNlLCBldnRQdWxzZSwgCiAgICAgIG1tdC0+ZHdFdmVudERhdGEsIG1tdC0+d0V2ZW50TGVuZ3RoKTsKICAgICovCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVJlYWRNVHJrCQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpUmVhZE1UcmsoV0lORV9NQ0lNSURJKiB3bW0sIE1DSV9NSURJVFJBQ0sqIG1tdCkKewogICAgRFdPUkQJCXRvYmVyZWFkOwogICAgRk9VUkNDCQlmb3VyY2M7CiAgICAKICAgIGlmIChtbWlvUmVhZCh3bW0tPmhGaWxlLCAoSFBTVFIpJmZvdXJjYywgKGxvbmcpc2l6ZW9mKEZPVVJDQykpICE9IAoJKGxvbmcpc2l6ZW9mKEZPVVJDQykpIHsKCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAgICB9CiAgICAKICAgIGlmIChmb3VyY2MgIT0gbW1pb0ZPVVJDQygnTScsICdUJywgJ3InLCAnaycpKSB7CglXQVJOKG1jaW1pZGksICJDYW4ndCBzeW5jaHJvbml6ZSBvbiAnTVRyaycgIVxuIik7CglyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogICAgfQogICAgCiAgICBpZiAoTUlESV9tY2lSZWFkTG9uZyh3bW0sICZ0b2JlcmVhZCkgIT0gMCkgewoJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKICAgIH0KICAgIG1tdC0+ZHdGaXJzdCA9IG1taW9TZWVrKHdtbS0+aEZpbGUsIDAsIFNFRUtfQ1VSKTsgLyogPj0gMCAqLwogICAgbW10LT5kd0xhc3QgPSBtbXQtPmR3Rmlyc3QgKyB0b2JlcmVhZDsKICAgIAogICAgLyogY29tcHV0ZSAjIG9mIHB1bHNlcyBpbiB0aGlzIHRyYWNrICovCiAgICBtbXQtPmR3SW5kZXggPSBtbXQtPmR3Rmlyc3Q7CiAgICBtbXQtPmR3RXZlbnRQdWxzZSA9IDA7CiAgICAKICAgIHdoaWxlIChNSURJX21jaVJlYWROZXh0RXZlbnQod21tLCBtbXQpID09IDAgJiYgCgkgICBMT1dPUkQobW10LT5kd0V2ZW50RGF0YSkgIT0gMHgyRkZGKSB7CQoJbW10LT5kd0luZGV4ICs9IG1tdC0+d0V2ZW50TGVuZ3RoOwogICAgfQogICAgbW10LT5kd0xlbmd0aCA9IG1tdC0+ZHdFdmVudFB1bHNlOwogICAgCiAgICBUUkFDRShtY2ltaWRpLCAiVHJhY2sgJXUgaGFzICVsdSBieXRlcyBhbmQgJWx1IHB1bHNlc1xuIiwgbW10LT53VHJhY2tOciwgdG9iZXJlYWQsIG1tdC0+ZHdMZW5ndGgpOwogICAgCiAgICAvKiByZXNldCB0cmFjayBkYXRhICovCiAgICBtbXQtPndTdGF0dXMgPSAxOwkvKiBvaywgcGxheWluZyAqLwogICAgbW10LT5kd0luZGV4ID0gbW10LT5kd0ZpcnN0OwogICAgbW10LT5kd0V2ZW50UHVsc2UgPSAwOwogICAgCiAgICBpZiAobW1pb1NlZWsod21tLT5oRmlsZSwgMCwgU0VFS19DVVIpICE9IG1tdC0+ZHdMYXN0KSB7CglXQVJOKG1jaW1pZGksICJPdWNoLCBvdXQgb2Ygc3luYyBzZWVrPSVsdSB0cmFjaz0lbHVcbiIsIAoJICAgICBtbWlvU2Vlayh3bW0tPmhGaWxlLCAwLCBTRUVLX0NVUiksIG1tdC0+ZHdMYXN0KTsKCS8qIHBvc2l0aW9uIGF0IGVuZCBvZiB0aGlzIHRyYWNrLCB0byBiZSByZWFkeSB0byByZWFkIG5leHQgdHJhY2sgKi8KCW1taW9TZWVrKHdtbS0+aEZpbGUsIG1tdC0+ZHdMYXN0LCBTRUVLX1NFVCk7CiAgICB9CiAgICAKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVhZE1UaGQJCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lSZWFkTVRoZChXSU5FX01DSU1JREkqIHdtbSwgRFdPUkQgZHdPZmZzZXQpCnsKICAgIERXT1JECXRvYmVyZWFkOwogICAgRk9VUkNDCWZvdXJjYzsKICAgIFdPUkQJbnQ7CiAgICAKICAgIFRSQUNFKG1jaW1pZGksICIoJXAsICUwOGxYKTtcbiIsIHdtbSwgZHdPZmZzZXQpOwogICAgCiAgICBpZiAobW1pb1NlZWsod21tLT5oRmlsZSwgZHdPZmZzZXQsIFNFRUtfU0VUKSAhPSBkd09mZnNldCkgewoJV0FSTihtY2ltaWRpLCAiQ2FuJ3Qgc2VlayBhdCAlMDhsWCBiZWdpbiBvZiAnTVRoZCcgXG4iLCBkd09mZnNldCk7CglyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogICAgfQogICAgaWYgKG1taW9SZWFkKHdtbS0+aEZpbGUsIChIUFNUUikmZm91cmNjLAoJCSAgIChsb25nKSBzaXplb2YoRk9VUkNDKSkgIT0gKGxvbmcpIHNpemVvZihGT1VSQ0MpKQoJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKICAgIAogICAgaWYgKGZvdXJjYyAhPSBtbWlvRk9VUkNDKCdNJywgJ1QnLCAnaCcsICdkJykpIHsKCVdBUk4obWNpbWlkaSwgIkNhbid0IHN5bmNocm9uaXplIG9uICdNVGhkJyAhXG4iKTsKCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAgICB9CiAgICAKICAgIGlmIChNSURJX21jaVJlYWRMb25nKHdtbSwgJnRvYmVyZWFkKSAhPSAwIHx8IHRvYmVyZWFkIDwgMyAqIHNpemVvZihXT1JEKSkKCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAgICAKICAgIGlmIChNSURJX21jaVJlYWRXb3JkKHdtbSwgJndtbS0+d0Zvcm1hdCkgIT0gMCB8fAoJTUlESV9tY2lSZWFkV29yZCh3bW0sICZ3bW0tPm5UcmFja3MpICE9IDAgfHwKCU1JRElfbWNpUmVhZFdvcmQod21tLCAmd21tLT5uRGl2aXNpb24pICE9IDApIHsKCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAgICB9CiAgICAKICAgIFRSQUNFKG1jaW1pZGksICJ0b2JlcmVhZD0weCUwOGxYLCB3Rm9ybWF0PTB4JTA0WCBuVHJhY2tzPTB4JTA0WCBuRGl2aXNpb249MHglMDRYXG4iLAoJICB0b2JlcmVhZCwgd21tLT53Rm9ybWF0LCB3bW0tPm5UcmFja3MsIHdtbS0+bkRpdmlzaW9uKTsKICAgIAogICAgLyogTVMgZG9jIHNheXMgdGhhdCB0aGUgTUlESSBNQ0kgdGltZSBmb3JtYXQgbXVzdCBiZSBwdXQgYnkgZGVmYXVsdCB0byB0aGUgZm9ybWF0CiAgICAgKiBzdG9yZWQgaW4gdGhlIE1JREkgZmlsZS4uLgogICAgICovCiAgICBpZiAod21tLT5uRGl2aXNpb24gPiAweDgwMDApIHsKCS8qIGVyaWMucG91ZWNoQGxlbWVsLmZyIDk4LzExCgkgKiBJbiBkaWQgbm90IGNoZWNrIHRoaXMgdmVyeSBjb2RlIChwdWxzZXMgYXJlIGV4cHJlc3NlZCBhcyBTTVBURSBzdWItZnJhbWVzKS4KCSAqIEluIGFib3V0IDQwIE1CIG9mIE1JREkgZmlsZXMgSSBoYXZlLCBub25lIHdhcyBTTVBURSBiYXNlZC4uLgoJICogSSdtIGp1c3Qgd29uZGVyaW5nIGlmIHRoaXMgaXMgd2lkZWx5IHVzZWQgOi0pLiBTbywgaWYgc29tZW9uZSBoYXMgb25lIG9mIAoJICogdGhlc2UgZmlsZXMsIEknZCBsaWtlIHRvIGtub3cgYWJvdXQuCgkgKi8KCUZJWE1FKG1jaW1pZGksICJIYW5kbGluZyBTTVBURSB0aW1lIGluIE1JREkgZmlsZXMgaGFzIG5vdCBiZWVuIHRlc3RlZFxuIgoJICAgICAgIlBsZWFzZSByZXBvcnQgdG8gY29tcC5lbXVsYXRvcnMubXMtd2luZG93cy53aW5lIHdpdGggTUlESSBmaWxlICFcbiIpOwoJCglzd2l0Y2ggKEhJQllURSh3bW0tPm5EaXZpc2lvbikpIHsKCWNhc2UgMHhFODoJd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1NNUFRFXzI0OwlicmVhazsJLyogLTI0ICovCgljYXNlIDB4RTc6CXdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9TTVBURV8yNTsJYnJlYWs7CS8qIC0yNSAqLwoJY2FzZSAweEUzOgl3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfU01QVEVfMzBEUk9QOwlicmVhazsJLyogLTI5ICovIC8qIGlzIHRoZSBNQ0kgY29uc3RhbnQgY29ycmVjdCA/ICovCgljYXNlIDB4RTI6CXdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9TTVBURV8zMDsJYnJlYWs7CS8qIC0zMCAqLwoJZGVmYXVsdDoKCSAgICBXQVJOKG1jaW1pZGksICJVbnN1cHBvcnRlZCBudW1iZXIgb2YgZnJhbWVzICVkXG4iLCAtKGNoYXIpSElCWVRFKHdtbS0+bkRpdmlzaW9uKSk7CgkgICAgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKCX0KCXN3aXRjaCAoTE9CWVRFKHdtbS0+bkRpdmlzaW9uKSkgewoJY2FzZSA0OgkvKiBNSURJIFRpbWUgQ29kZSAqLwoJY2FzZSA4OgoJY2FzZSAxMDoKCWNhc2UgODA6IC8qIFNNUFRFIGJpdCByZXNvbHV0aW9uICovCgljYXNlIDEwMDoKCWRlZmF1bHQ6CgkgICAgV0FSTihtY2ltaWRpLCAiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHN1Yi1mcmFtZXMgJWRcbiIsIExPQllURSh3bW0tPm5EaXZpc2lvbikpOwoJICAgIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7Cgl9CglyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogICAgfSBlbHNlIGlmICh3bW0tPm5EaXZpc2lvbiA9PSAwKSB7CglXQVJOKG1jaW1pZGksICJOdW1iZXIgb2YgZGl2aXNpb24gaXMgMCwgY2FuJ3Qgc3VwcG9ydCB0aGF0ICEhXG4iKTsKCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAgICB9IGVsc2UgewoJd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzsKICAgIH0KICAgIAogICAgc3dpdGNoICh3bW0tPndGb3JtYXQpIHsKICAgIGNhc2UgMDoKCWlmICh3bW0tPm5UcmFja3MgIT0gMSkgewoJICAgIFdBUk4obWNpbWlkaSwgIkdvdCB0eXBlIDAgZmlsZSB3aG9zZSBudW1iZXIgb2YgdHJhY2sgaXMgbm90IDEuIFNldHRpbmcgaXQgdG8gMVxuIik7CgkgICAgd21tLT5uVHJhY2tzID0gMTsKCX0KCWJyZWFrOwogICAgY2FzZSAxOgogICAgY2FzZSAyOgoJYnJlYWs7CiAgICBkZWZhdWx0OgoJV0FSTihtY2ltaWRpLCAiSGFuZGxpbmcgTUlESSBmaWxlcyB3aGljaCBmb3JtYXQgPSAlZCBpcyBub3QgKHlldCkgc3VwcG9ydGVkXG4iCgkgICAgICJQbGVhc2UgcmVwb3J0IHdpdGggTUlESSBmaWxlICFcbiIsIHdtbS0+d0Zvcm1hdCk7CglyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogICAgfQogICAgCiAgICBpZiAod21tLT5uVHJhY2tzICYgMHg4MDAwKSB7CgkvKiB0aGlzIHNob3VsZG4ndCBiZSBhIHByb2JsZW0uLi4gKi8KCVdBUk4obWNpbWlkaSwgIk91Y2ggISEgSW1wbGVtZW50YXRpb24gbGltaXRhdGlvbiB0byAzMmsgdHJhY2tzIHBlciBNSURJIGZpbGUgaXMgb3ZlcmZsb3dlZFxuIik7Cgl3bW0tPm5UcmFja3MgPSAweDdGRkY7CiAgICB9CiAgICAKICAgIHdtbS0+dHJhY2tzID0geG1hbGxvYyhzaXplb2YoTUNJX01JRElUUkFDSykgKiB3bW0tPm5UcmFja3MpOwogICAgCiAgICB0b2JlcmVhZCAtPSAzICogc2l6ZW9mKFdPUkQpOyAKICAgIGlmICh0b2JlcmVhZCA+IDApIHsKCVRSQUNFKG1jaW1pZGksICJTaXplIG9mIE1UaGQgPiA2LCBza2lwcGluZyAlbGQgZXh0cmEgYnl0ZXNcbiIsIHRvYmVyZWFkKTsKCW1taW9TZWVrKHdtbS0+aEZpbGUsIHRvYmVyZWFkLCBTRUVLX0NVUik7CiAgICB9CiAgICAKICAgIGZvciAobnQgPSAwOyBudCA8IHdtbS0+blRyYWNrczsgbnQrKykgewoJd21tLT50cmFja3NbbnRdLndUcmFja05yID0gbnQ7CglpZiAoTUlESV9tY2lSZWFkTVRyayh3bW0sICZ3bW0tPnRyYWNrc1tudF0pICE9IDApIHsKCSAgICBXQVJOKG1jaW1pZGksICJDYW4ndCByZWFkICdNVHJrJyBoZWFkZXIgXG4iKTsKCSAgICByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwoJfQogICAgfQogICAgCiAgICB3bW0tPmR3VGVtcG8gPSA1MDAwMDA7CiAgICAKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJTUlESV9Db252ZXJ0UHVsc2VUb01TCQkJW2ludGVybmFsXQogKi8Kc3RhdGljCURXT1JECU1JRElfQ29udmVydFB1bHNlVG9NUyhXSU5FX01DSU1JREkqIHdtbSwgRFdPUkQgcHVsc2UpCnsKICAgIERXT1JECXJldCA9IDA7CiAgICAKICAgIC8qIEZJWE1FOiB0aGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gZmFsc2UgdmFsdWVzIHNpbmNlIHRoZSB0ZW1wbyAod21tLT5kd1RlbXBvKQogICAgICogbWF5IGNoYW5nZSBkdXJpbmcgZmlsZSBwbGF5aW5nCiAgICAgKi8KICAgIGlmICh3bW0tPm5EaXZpc2lvbiA9PSAwKSB7CglGSVhNRShtY2ltaWRpLCAiU2hvdWxkbid0IGhhcHBlbi4gd21tLT5uRGl2aXNpb24gPSAwXG4iKTsKICAgIH0gZWxzZSBpZiAod21tLT5uRGl2aXNpb24gPiAweDgwMDApIHsgLyogU01QVEUsIHVuY2hlY2tlZCBGSVhNRT8gKi8KCWludAluZiA9IC0oY2hhcilISUJZVEUod21tLT5uRGl2aXNpb24pOwkvKiBudW1iZXIgb2YgZnJhbWVzICAgICAqLwoJaW50CW5zZiA9IExPQllURSh3bW0tPm5EaXZpc2lvbik7CQkvKiBudW1iZXIgb2Ygc3ViLWZyYW1lcyAqLwoJcmV0ID0gKHB1bHNlICogMTAwMCkgLyAobmYgKiBuc2YpOwogICAgfSBlbHNlIHsKCXJldCA9IChEV09SRCkoKGRvdWJsZSlwdWxzZSAqICgoZG91YmxlKXdtbS0+ZHdUZW1wbyAvIDEwMDApIC8JCgkJICAgICAgKGRvdWJsZSl3bW0tPm5EaXZpc2lvbik7CiAgICB9CiAgICAKICAgIC8qCiAgICAgIFRSQUNFKG1jaW1pZGksICJwdWxzZT0lbHUgdGVtcG89JWx1IGRpdmlzaW9uPSV1PTB4JTA0eCA9PiBtcz0lbHVcbiIsIAogICAgICBwdWxzZSwgd21tLT5kd1RlbXBvLCB3bW0tPm5EaXZpc2lvbiwgd21tLT5uRGl2aXNpb24sIHJldCk7CiAgICAqLwogICAgCiAgICByZXR1cm4gcmV0Owp9CgojZGVmaW5lIFRJTUVfTVNfSU5fT05FX0hPVVIJKDYwKjYwKjEwMDApCiNkZWZpbmUgVElNRV9NU19JTl9PTkVfTUlOVVRFCSg2MCoxMDAwKQojZGVmaW5lIFRJTUVfTVNfSU5fT05FX1NFQ09ORAkoMTAwMCkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQlNSURJX0NvbnZlcnRUaW1lRm9ybWF0VG9NUwkJW2ludGVybmFsXQogKi8Kc3RhdGljCURXT1JECU1JRElfQ29udmVydFRpbWVGb3JtYXRUb01TKFdJTkVfTUNJTUlESSogd21tLCBEV09SRCB2YWwpCnsKICAgIERXT1JECXJldCA9IDA7CiAgICAKICAgIHN3aXRjaCAod21tLT5kd01jaVRpbWVGb3JtYXQpIHsKICAgIGNhc2UgTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM6CQoJcmV0ID0gdmFsOwkJCglicmVhazsKICAgIGNhc2UgTUNJX0ZPUk1BVF9TTVBURV8yNDoKCXJldCA9IAoJICAgIChISUJZVEUoSElXT1JEKHZhbCkpICogMTI1KSAvIDMgKyAgICAgICAgICAgICBMT0JZVEUoSElXT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfU0VDT05EICsKCSAgICBISUJZVEUoTE9XT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfTUlOVVRFICsgTE9CWVRFKExPV09SRCh2YWwpKSAqIFRJTUVfTVNfSU5fT05FX0hPVVI7CglicmVhazsKICAgIGNhc2UgTUNJX0ZPUk1BVF9TTVBURV8yNToJCQoJcmV0ID0gCgkgICAgSElCWVRFKEhJV09SRCh2YWwpKSAqIDQwICsgCQkgIAkgIExPQllURShISVdPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9TRUNPTkQgKwoJICAgIEhJQllURShMT1dPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9NSU5VVEUgKyBMT0JZVEUoTE9XT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfSE9VUjsKCWJyZWFrOwogICAgY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzMwOgkJCglyZXQgPSAKCSAgICAoSElCWVRFKEhJV09SRCh2YWwpKSAqIDEwMCkgLyAzICsgCQkgIExPQllURShISVdPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9TRUNPTkQgKwoJICAgIEhJQllURShMT1dPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9NSU5VVEUgKyBMT0JZVEUoTE9XT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfSE9VUjsKCWJyZWFrOwogICAgZGVmYXVsdDoKCVdBUk4obWNpbWlkaSwgIkJhZCB0aW1lIGZvcm1hdCAlbHUhXG4iLCB3bW0tPmR3TWNpVGltZUZvcm1hdCk7CiAgICB9CiAgICAvKgogICAgICBUUkFDRShtY2ltaWRpLCAidmFsPSVsdT0weCUwOGx4IFt0Zj0lbHVdID0+IHJldD0lbHVcbiIsIHZhbCwgdmFsLCB3bW0tPmR3TWNpVGltZUZvcm1hdCwgcmV0KTsKICAgICovCiAgICByZXR1cm4gcmV0Owp9CQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCU1JRElfQ29udmVydE1TVG9UaW1lRm9ybWF0CQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMJRFdPUkQJTUlESV9Db252ZXJ0TVNUb1RpbWVGb3JtYXQoV0lORV9NQ0lNSURJKiB3bW0sIERXT1JEIF92YWwpCnsKICAgIERXT1JECXJldCA9IDAsIHZhbCA9IF92YWw7CiAgICBEV09SRAloLCBtLCBzLCBmOwogICAgCiAgICBzd2l0Y2ggKHdtbS0+ZHdNY2lUaW1lRm9ybWF0KSB7CiAgICBjYXNlIE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOgkKCXJldCA9IHZhbDsJCQoJYnJlYWs7CiAgICBjYXNlIE1DSV9GT1JNQVRfU01QVEVfMjQ6CiAgICBjYXNlIE1DSV9GT1JNQVRfU01QVEVfMjU6CQkKICAgIGNhc2UgTUNJX0ZPUk1BVF9TTVBURV8zMDoJCQoJaCA9IHZhbCAvIFRJTUVfTVNfSU5fT05FX0hPVVI7CQoJbSA9ICh2YWwgLT0gaCAqIFRJTUVfTVNfSU5fT05FX0hPVVIpICAgLyBUSU1FX01TX0lOX09ORV9NSU5VVEU7CQoJcyA9ICh2YWwgLT0gbSAqIFRJTUVfTVNfSU5fT05FX01JTlVURSkgLyBUSU1FX01TX0lOX09ORV9TRUNPTkQ7Cglzd2l0Y2ggKHdtbS0+ZHdNY2lUaW1lRm9ybWF0KSB7CgljYXNlIE1DSV9GT1JNQVRfU01QVEVfMjQ6CgkgICAgLyogb25lIGZyYW1lIGlzIDEwMDAvMjQgdmFsIGxvbmcsIDEwMDAvMjQgPT0gMTI1LzMgKi8KCSAgICBmID0gKHZhbCAqIDMpIC8gMTI1OyAJdmFsIC09IChmICogMTI1KSAvIDM7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9GT1JNQVRfU01QVEVfMjU6CQkKCSAgICAvKiBvbmUgZnJhbWUgaXMgMTAwMC8yNSBtcyBsb25nLCAxMDAwLzI1ID09IDQwICovCgkgICAgZiA9IHZhbCAvIDQwOyAJCXZhbCAtPSBmICogNDA7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9GT1JNQVRfU01QVEVfMzA6CQkKCSAgICAvKiBvbmUgZnJhbWUgaXMgMTAwMC8zMCBtcyBsb25nLCAxMDAwLzMwID09IDEwMC8zICovCgkgICAgZiA9ICh2YWwgKiAzKSAvIDEwMDsgCXZhbCAtPSAoZiAqIDEwMCkgLyAzOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBGSVhNRShtY2ltaWRpLCAiVGhlcmUgbXVzdCBiZSBzb21lIGJhZCBiYWQgcHJvZ3JhbW1lclxuIik7CgkgICAgZiA9IDA7Cgl9CgkvKiB2YWwgY29udGFpbnMgdGhlIG51bWJlciBvZiBtcyB3aGljaCBjYW5ub3QgbWFrZSBhIGNvbXBsZXRlIGZyYW1lICovCgkvKiBGSVhNRTogaXMgdGhpcyBjb3JyZWN0ID8gcHJvZ3JhbXMgc2VlbSB0byBiZSBoYXBweSB3aXRoIHRoYXQgKi8KCXJldCA9IChmIDw8IDI0KSB8IChzIDw8IDE2KSB8IChtIDw8IDgpIHwgKGggPDwgMCk7CglicmVhazsKICAgIGRlZmF1bHQ6CglXQVJOKG1jaW1pZGksICJCYWQgdGltZSBmb3JtYXQgJWx1IVxuIiwgd21tLT5kd01jaVRpbWVGb3JtYXQpOwogICAgfQogICAgLyoKICAgICAgVFJBQ0UobWNpbWlkaSwgInZhbD0lbHUgW3RmPSVsdV0gPT4gcmV0PSVsdT0weCUwOGx4XG4iLCBfdmFsLCB3bW0tPmR3TWNpVGltZUZvcm1hdCwgcmV0LCByZXQpOwogICAgKi8KICAgIHJldHVybiByZXQ7Cn0JCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJTUlESV9HZXRNVGhkTGVuZ3RoTVMJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMJRFdPUkQJTUlESV9HZXRNVGhkTGVuZ3RoTVMoV0lORV9NQ0lNSURJKiB3bW0pCnsKICAgIFdPUkQJbnQ7CiAgICBEV09SRAlyZXQgPSAwOwogICAgCiAgICBmb3IgKG50ID0gMDsgbnQgPCB3bW0tPm5UcmFja3M7IG50KyspIHsKCWlmICh3bW0tPndGb3JtYXQgPT0gMikgewoJICAgIHJldCArPSB3bW0tPnRyYWNrc1tudF0uZHdMZW5ndGg7Cgl9IGVsc2UgaWYgKHdtbS0+dHJhY2tzW250XS5kd0xlbmd0aCA+IHJldCkgewoJICAgIHJldCA9IHdtbS0+dHJhY2tzW250XS5kd0xlbmd0aDsKCX0KICAgIH0KICAgIC8qIEZJWE1FOiB0aGlzIGlzIHdyb25nIGlmIHRoZXJlIGlzIGEgdGVtcG8gY2hhbmdlIGluc2lkZSB0aGUgZmlsZSAqLwogICAgcmV0dXJuIE1JRElfQ29udmVydFB1bHNlVG9NUyh3bW0sIHJldCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lPcGVuCQkJW2ludGVybmFsXQkKICovCnN0YXRpYyBEV09SRCBNSURJX21jaU9wZW4oVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfT1BFTl9QQVJNU0EgbHBQYXJtcykKewogICAgTUlESU9QRU5ERVNDIAltaWRpT3BlbkRlc2M7CiAgICBEV09SRAkJZHdSZXQgPSAwOwogICAgRFdPUkQJCWR3RGV2aWNlSUQ7CiAgICBXSU5FX01DSU1JREkqCXdtbTsKICAgIAogICAgVFJBQ0UobWNpbWlkaSwgIiglMDR4LCAlMDhsWCwgJXApXG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogICAgCiAgICBpZiAobHBQYXJtcyA9PSBOVUxMKSAJcmV0dXJuIE1DSUVSUl9OVUxMX1BBUkFNRVRFUl9CTE9DSzsKICAgIGlmICh3RGV2SUQgPj0gTUFYX01DSU1JRElEUlYpIHsKCVdBUk4obWNpbWlkaSwgIkludmFsaWQgd0RldklEPSV1XG4iLCB3RGV2SUQpOwoJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIH0JCiAgICBpZiAoZHdGbGFncyAmIE1DSV9PUEVOX1NIQVJFQUJMRSkKCXJldHVybiBNQ0lFUlJfSEFSRFdBUkU7CgogICAgd21tID0gJk1DSU1pZGlEZXZbd0RldklEXTsKICAgIAogICAgaWYgKHdtbS0+blVzZUNvdW50ID4gMCkgewoJLyogVGhlIGRyaXZlciBpcyBhbHJlYWR5IG9wZW5lZCBvbiB0aGlzIGNoYW5uZWwKCSAqIE1JREkgc2VxdWVuY2VyIGNhbm5vdCBiZSBzaGFyZWQKCSAqLwoJcmV0dXJuIE1DSUVSUl9ERVZJQ0VfT1BFTjsKICAgIH0KICAgIHdtbS0+blVzZUNvdW50Kys7CiAgICAKICAgIHdtbS0+aEZpbGUgPSAwOwogICAgZHdEZXZpY2VJRCA9IGxwUGFybXMtPndEZXZpY2VJRDsKICAgIAogICAgVFJBQ0UobWNpbWlkaSwgIndEZXZJRD0lMDRYIChscFBhcmFtcy0+d0RldmljZUlEPSUwOGxYKVxuIiwgd0RldklELCBkd0RldmljZUlEKTsKICAgIC8qCWxwUGFybXMtPndEZXZpY2VJRCA9IHdEZXZJRDsqLwogICAgCiAgICBpZiAoZHdGbGFncyAmIE1DSV9PUEVOX0VMRU1FTlQpIHsKCUxQU1RSCQlscHN0ckVsZW1lbnROYW1lOwoJCglscHN0ckVsZW1lbnROYW1lID0gbHBQYXJtcy0+bHBzdHJFbGVtZW50TmFtZTsKCQoJVFJBQ0UobWNpbWlkaSwgIk1DSV9PUEVOX0VMRU1FTlQgJyVzJyAhXG4iLCBscHN0ckVsZW1lbnROYW1lKTsKCWlmIChscHN0ckVsZW1lbnROYW1lICYmIHN0cmxlbihscHN0ckVsZW1lbnROYW1lKSA+IDApIHsKCSAgICB3bW0tPmhGaWxlID0gbW1pb09wZW5BKGxwc3RyRWxlbWVudE5hbWUsIE5VTEwsIAoJCQkJICAgICBNTUlPX0FMTE9DQlVGIHwgTU1JT19SRUFEV1JJVEUgfCBNTUlPX0VYQ0xVU0lWRSk7CgkgICAgaWYgKHdtbS0+aEZpbGUgPT0gMCkgewoJCVdBUk4obWNpbWlkaSwgIkNhbid0IGZpbmQgZmlsZT0nJXMnICFcbiIsIGxwc3RyRWxlbWVudE5hbWUpOwoJCXdtbS0+blVzZUNvdW50LS07CgkJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKCSAgICB9Cgl9IGVsc2UgewoJICAgIHdtbS0+aEZpbGUgPSAwOwoJfQogICAgfQogICAgVFJBQ0UobWNpbWlkaSwgImhGaWxlPSV1XG4iLCB3bW0tPmhGaWxlKTsKICAgIAogICAgbWVtY3B5KCZ3bW0tPm9wZW5QYXJtcywgbHBQYXJtcywgc2l6ZW9mKE1DSV9PUEVOX1BBUk1TQSkpOwogICAgCiAgICB3bW0tPndOb3RpZnlEZXZpY2VJRCA9IGR3RGV2aWNlSUQ7CiAgICB3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfTk9UX1JFQURZOwkvKiB3aGlsZSBsb2FkaW5nIGZpbGUgY29udGVudHMgKi8KICAgIC8qIHNwZWMgc2F5cyBpdCBzaG91bGQgYmUgdGhlIGRlZmF1bHQgZm9ybWF0IGZyb20gdGhlIE1JREkgZmlsZS4uLiAqLwogICAgd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzsKICAgIAogICAgbWlkaU9wZW5EZXNjLmhNaWRpID0gMDsKICAgIAogICAgaWYgKHdtbS0+aEZpbGUgIT0gMCkgewoJTU1DS0lORk8JY2tNYWluUklGRjsKCU1NQ0tJTkZPCW1tY2tJbmZvOwoJRFdPUkQJCWR3T2Zmc2V0ID0gMDsKCQoJaWYgKG1taW9EZXNjZW5kKHdtbS0+aEZpbGUsICZja01haW5SSUZGLCBOVUxMLCAwKSAhPSAwKSB7CgkgICAgZHdSZXQgPSBNQ0lFUlJfSU5WQUxJRF9GSUxFOwoJfSBlbHNlIHsKCSAgICBUUkFDRShtY2ltaWRpLCJQYXJlbnRDaHVuayBja2lkPSUuNHMgZmNjVHlwZT0lLjRzIGNrc2l6ZT0lMDhsWCBcbiIsCgkJICAoTFBTVFIpJmNrTWFpblJJRkYuY2tpZCwgKExQU1RSKSZja01haW5SSUZGLmZjY1R5cGUsIGNrTWFpblJJRkYuY2tzaXplKTsKCSAgICAKCSAgICBpZiAoY2tNYWluUklGRi5ja2lkID09IEZPVVJDQ19SSUZGICYmIGNrTWFpblJJRkYuZmNjVHlwZSA9PSBtbWlvRk9VUkNDKCdSJywgJ00nLCAnSScsICdEJykpIHsKCQltbWNrSW5mby5ja2lkID0gbW1pb0ZPVVJDQygnZCcsICdhJywgJ3QnLCAnYScpOwoJCWlmIChtbWlvRGVzY2VuZCh3bW0tPmhGaWxlLCAmbW1ja0luZm8sICZja01haW5SSUZGLCBNTUlPX0ZJTkRDSFVOSykgPT0gMCkgewoJCSAgICBUUkFDRShtY2ltaWRpLCAiLi4uIGlzIGEgJ1JNSUQnIGZpbGUgXG4iKTsKCQkgICAgZHdPZmZzZXQgPSBtbWNrSW5mby5kd0RhdGFPZmZzZXQ7CgkJfSBlbHNlIHsKCQkgICAgZHdSZXQgPSBNQ0lFUlJfSU5WQUxJRF9GSUxFOwoJCX0KCSAgICB9CgkgICAgaWYgKGR3UmV0ID09IDAgJiYgTUlESV9tY2lSZWFkTVRoZCh3bW0sIGR3T2Zmc2V0KSAhPSAwKSB7CgkJV0FSTihtY2ltaWRpLCAiQ2FuJ3QgcmVhZCAnTVRoZCcgaGVhZGVyIFxuIik7CgkJZHdSZXQgPSBNQ0lFUlJfSU5WQUxJRF9GSUxFOwoJICAgIH0KCX0KICAgIH0gZWxzZSB7CglUUkFDRShtY2ltaWRpLCAiaEZpbGU9PTAsIHNldHRpbmcgI3RyYWNrcyB0byAwOyBpcyB0aGlzIGNvcnJlY3QgP1xuIik7Cgl3bW0tPm5UcmFja3MgPSAwOwoJd21tLT53Rm9ybWF0ID0gMDsKCXdtbS0+bkRpdmlzaW9uID0gMTsKICAgIH0KICAgIGlmIChkd1JldCAhPSAwKSB7Cgl3bW0tPm5Vc2VDb3VudC0tOwoJaWYgKHdtbS0+aEZpbGUgIT0gMCkKCSAgICBtbWlvQ2xvc2Uod21tLT5oRmlsZSwgMCk7Cgl3bW0tPmhGaWxlID0gMDsKICAgIH0gZWxzZSB7Cgl3bW0tPmR3UG9zaXRpb25NUyA9IDA7Cgl3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKCXdtbS0+aE1pZGlIZHIgPSBVU0VSX0hFQVBfQUxMT0Moc2l6ZW9mKE1JRElIRFIxNikpOwoJCglkd1JldCA9IG1vZE1lc3NhZ2Uod0RldklELCBNT0RNX09QRU4sIDAsIChEV09SRCkmbWlkaU9wZW5EZXNjLCBDQUxMQkFDS19OVUxMKTsKCS8qCWR3UmV0ID0gbWlkTWVzc2FnZSh3RGV2SUQsIE1JRE1fT1BFTiwgMCwgKERXT1JEKSZtaWRpT3BlbkRlc2MsIENBTExCQUNLX05VTEwpOyovCiAgICB9CiAgICByZXR1cm4gZHdSZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lTdG9wCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpU3RvcChVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCnsgICAgCiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgCiAgICBUUkFDRShtY2ltaWRpLCAiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogICAgCiAgICBpZiAod21tID09IE5VTEwpCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CiAgICAKICAgIHdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOwogICAgVFJBQ0UobWNpbWlkaSwgIndtbS0+ZHdTdGF0dXM9JWRcbiIsIHdtbS0+ZHdTdGF0dXMpOwogICAgCiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpKSB7CglUUkFDRShtY2ltaWRpLCAiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwoJbWNpRHJpdmVyTm90aWZ5MTYoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAoJCQkgIHdtbS0+d05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lDbG9zZQkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaUNsb3NlKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKewogICAgRFdPUkQJCWR3UmV0OwogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIAogICAgVFJBQ0UobWNpbWlkaSwgIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKHdtbSA9PSBOVUxMKQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgCiAgICBpZiAod21tLT5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9TVE9QKSB7CglNSURJX21jaVN0b3Aod0RldklELCBNQ0lfV0FJVCwgbHBQYXJtcyk7CiAgICB9CiAgICAKICAgIHdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOwogICAgd21tLT5uVXNlQ291bnQtLTsKICAgIGlmICh3bW0tPm5Vc2VDb3VudCA9PSAwKSB7CglpZiAod21tLT5oRmlsZSAhPSAwKSB7CgkgICAgbW1pb0Nsb3NlKHdtbS0+aEZpbGUsIDApOwoJICAgIHdtbS0+aEZpbGUgPSAwOwoJICAgIFRSQUNFKG1jaW1pZGksICJoRmlsZSBjbG9zZWQgIVxuIik7Cgl9CglVU0VSX0hFQVBfRlJFRSh3bW0tPmhNaWRpSGRyKTsKCWZyZWUod21tLT50cmFja3MpOwoJZHdSZXQgPSBtb2RNZXNzYWdlKHdEZXZJRCwgTU9ETV9DTE9TRSwgMCwgMEwsIDBMKTsKCWlmIChkd1JldCAhPSBNTVNZU0VSUl9OT0VSUk9SKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwoJLyoKCSAgZHdSZXQgPSBtaWRNZXNzYWdlKHdEZXZJRCwgTUlETV9DTE9TRSwgMCwgMEwsIDBMKTsKCSAgaWYgKGR3UmV0ICE9IE1NU1lTRVJSX05PRVJST1IpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CgkqLwogICAgfSBlbHNlIHsKCVRSQUNFKG1jaW1pZGksICJTaG91bGRuJ3QgaGFwcGVuLi4uIG5Vc2VDb3VudD0lZFxuIiwgd21tLT5uVXNlQ291bnQpOwoJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKICAgIH0KICAgIAogICAgaWYgKGxwUGFybXMgJiYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSkgewoJVFJBQ0UobWNpbWlkaSwgIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKCW1jaURyaXZlck5vdGlmeTE2KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKCQkJICB3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpRmluZE5leHRFdmVudAkJW2ludGVybmFsXQogKi8Kc3RhdGljIE1DSV9NSURJVFJBQ0sqCU1JRElfbWNpRmluZE5leHRFdmVudChXSU5FX01DSU1JREkqIHdtbSwgTFBEV09SRCBoaVB1bHNlKSAKewogICAgV09SRAkJY250LCBudDsKICAgIE1DSV9NSURJVFJBQ0sqCW1tdDsKICAgIAogICAgKmhpUHVsc2UgPSAweEZGRkZGRkZGdWw7CiAgICBjbnQgPSAweEZGRkZ1OwogICAgZm9yIChudCA9IDA7IG50IDwgd21tLT5uVHJhY2tzOyBudCsrKSB7CgltbXQgPSAmd21tLT50cmFja3NbbnRdOwoJCglpZiAobW10LT53U3RhdHVzID09IDApCgkgICAgY29udGludWU7CglpZiAobW10LT5kd0V2ZW50UHVsc2UgPCAqaGlQdWxzZSkgewoJICAgICpoaVB1bHNlID0gbW10LT5kd0V2ZW50UHVsc2U7CgkgICAgY250ID0gbnQ7Cgl9CiAgICB9CiAgICByZXR1cm4gKGNudCA9PSAweEZGRkZ1KSA/IDAgLyogbm8gbW9yZSBldmVudCBvbiBhbGwgdHJhY2tzICovCgk6ICZ3bW0tPnRyYWNrc1tjbnRdOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUGxheQkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVBsYXkoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfUExBWV9QQVJNUyBscFBhcm1zKQp7CiAgICBEV09SRAkJZHdTdGFydE1TLCBkd0VuZE1TLCBkd1JldDsKICAgIFdPUkQJCWRvUGxheSwgbnQ7CiAgICBNQ0lfTUlESVRSQUNLKgltbXQ7CiAgICBEV09SRAkJaGlQdWxzZTsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CiAgICAKICAgIFRSQUNFKG1jaW1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAgICAKICAgIGlmICh3bW0gPT0gTlVMTCkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIAogICAgaWYgKHdtbS0+aEZpbGUgPT0gMCkgewoJV0FSTihtY2ltaWRpLCAiQ2FuJ3QgcGxheTogbm8gZmlsZSAnJXMnICFcbiIsIHdtbS0+b3BlblBhcm1zLmxwc3RyRWxlbWVudE5hbWUpOwoJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKICAgIH0KICAgIAogICAgaWYgKHdtbS0+ZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkgewoJV0FSTihtY2ltaWRpLCAiQ2FuJ3QgcGxheTogZGV2aWNlIGlzIG5vdCBzdG9wcGVkICFcbiIpOwoJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKICAgIH0KICAgIAogICAgaWYgKCEoZHdGbGFncyAmIE1DSV9XQUlUKSkgewkKCS8qKiBGSVhNRTogSSdtIG5vdCAxMDAlIHN1cmUgdGhhdCB3Tm90aWZ5RGV2aWNlSUQgaXMgdGhlIHJpZ2h0IHZhbHVlIGluIGFsbCBjYXNlcyA/Pz8gKi8KCXJldHVybiBNQ0lfU2VuZENvbW1hbmRBc3luYyh3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX1BMQVksIGR3RmxhZ3MsIChEV09SRClscFBhcm1zLCBzaXplb2YoTFBNQ0lfUExBWV9QQVJNUykpOwogICAgfQogICAgCiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9GUk9NKSkgewoJZHdTdGFydE1TID0gTUlESV9Db252ZXJ0VGltZUZvcm1hdFRvTVMod21tLCBscFBhcm1zLT5kd0Zyb20pOyAKICAgIH0gZWxzZSB7Cglkd1N0YXJ0TVMgPSB3bW0tPmR3UG9zaXRpb25NUzsKICAgIH0KICAgIAogICAgaWYgKGxwUGFybXMgJiYgKGR3RmxhZ3MgJiBNQ0lfVE8pKSB7Cglkd0VuZE1TID0gTUlESV9Db252ZXJ0VGltZUZvcm1hdFRvTVMod21tLCBscFBhcm1zLT5kd1RvKTsKICAgIH0gZWxzZSB7Cglkd0VuZE1TID0gMHhGRkZGRkZGRnVsOwogICAgfQogICAgCiAgICBUUkFDRShtY2ltaWRpLCAiUGxheWluZyBmcm9tICVsdSB0byAlbHVcbiIsIGR3U3RhcnRNUywgZHdFbmRNUyk7CiAgICAKICAgIC8qIGluaXQgdHJhY2tzICovCiAgICBmb3IgKG50ID0gMDsgbnQgPCB3bW0tPm5UcmFja3M7IG50KyspIHsKCW1tdCA9ICZ3bW0tPnRyYWNrc1tudF07CgkKCW1tdC0+d1N0YXR1cyA9IDE7CS8qIG9rLCBwbGF5aW5nICovCgltbXQtPmR3SW5kZXggPSBtbXQtPmR3Rmlyc3Q7CglpZiAod21tLT53Rm9ybWF0ID09IDIgJiYgbnQgPiAwKSB7CgkgICAgbW10LT5kd0V2ZW50UHVsc2UgPSB3bW0tPnRyYWNrc1tudCAtIDFdLmR3TGVuZ3RoOwoJfSBlbHNlIHsKCSAgICBtbXQtPmR3RXZlbnRQdWxzZSA9IDA7Cgl9CglNSURJX21jaVJlYWROZXh0RXZlbnQod21tLCBtbXQpOyAvKiBGSVhNRSA9PSAwICovCiAgICB9CiAgICAKICAgIHdtbS0+ZHdQdWxzZSA9IDA7CiAgICB3bW0tPmR3VGVtcG8gPSA1MDAwMDA7CiAgICB3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfUExBWTsKICAgIHdtbS0+ZHdQb3NpdGlvbk1TID0gMDsKICAgIHdtbS0+d1N0YXJ0ZWRQbGF5aW5nID0gRkFMU0U7CiAgICAKICAgIHdoaWxlICh3bW0tPmR3U3RhdHVzICE9IE1DSV9NT0RFX1NUT1ApIHsKCS8qIGl0IHNlZW1zIHRoYXQgaW4gY2FzZSBvZiBtdWx0aS10aHJlYWRpbmcsIGdjYyBpcyBvcHRpbWl6aW5nIGp1c3QgYSBsaXR0bGUgYml0IAoJICogdG9vIG11Y2guIFRlbGwgZ2NjIG5vdCB0byBvcHRpbWl6ZSBzdGF0dXMgdmFsdWUgdXNpbmcgdm9sYXRpbGUuIAoJICovCgl3aGlsZSAoKCh2b2xhdGlsZSBXSU5FX01DSU1JREkqKXdtbSktPmR3U3RhdHVzID09IE1DSV9NT0RFX1BBVVNFKTsKCQoJZG9QbGF5ID0gKHdtbS0+ZHdQb3NpdGlvbk1TID49IGR3U3RhcnRNUyAmJiB3bW0tPmR3UG9zaXRpb25NUyA8PSBkd0VuZE1TKTsKCQoJVFJBQ0UobWNpbWlkaSwgIndtbS0+ZHdTdGF0dXM9JWQsIGRvUGxheT0lc1xuIiwgd21tLT5kd1N0YXR1cywgZG9QbGF5ID8gIlQiIDogIkYiKTsKCQoJaWYgKChtbXQgPSBNSURJX21jaUZpbmROZXh0RXZlbnQod21tLCAmaGlQdWxzZSkpID09IE5VTEwpCgkgICAgYnJlYWs7ICAvKiBubyBtb3JlIGV2ZW50IG9uIHRyYWNrcyAqLwoJCgkvKiBpZiBzdGFydGluZyBwbGF5aW5nLCB0aGVuIHNldCBTdGFydFRpY2tzIHRvIHRoZSB2YWx1ZSBpdCB3b3VsZCBoYXZlIGhhZAoJICogaWYgcGxheSBoYWQgc3RhcnRlZCBhdCBwb3NpdGlvbiAwCgkgKi8KCWlmIChkb1BsYXkgJiYgIXdtbS0+d1N0YXJ0ZWRQbGF5aW5nKSB7CgkgICAgd21tLT5kd1N0YXJ0VGlja3MgPSBHZXRUaWNrQ291bnQoKSAtIE1JRElfQ29udmVydFB1bHNlVG9NUyh3bW0sIHdtbS0+ZHdQdWxzZSk7CgkgICAgd21tLT53U3RhcnRlZFBsYXlpbmcgPSBUUlVFOwoJICAgIFRSQUNFKG1jaW1pZGksICJTZXR0aW5nIGR3U3RhcnRUaWNrcyB0byAlbHVcbiIsIHdtbS0+ZHdTdGFydFRpY2tzKTsKCX0KCQoJaWYgKGhpUHVsc2UgPiB3bW0tPmR3UHVsc2UpIHsKCSAgICB3bW0tPmR3UG9zaXRpb25NUyArPSBNSURJX0NvbnZlcnRQdWxzZVRvTVMod21tLCBoaVB1bHNlIC0gd21tLT5kd1B1bHNlKTsKCSAgICBpZiAoZG9QbGF5KSB7CgkJRFdPUkQJdG9nbyA9IHdtbS0+ZHdTdGFydFRpY2tzICsgd21tLT5kd1Bvc2l0aW9uTVM7CgkJRFdPUkQJdGMgPSBHZXRUaWNrQ291bnQoKTsKCQkKCQlUUkFDRShtY2ltaWRpLCAiUHVsc2VzIGhpPTB4JTA4bHggPD4gY3VyPTB4JTA4bHhcbiIsIGhpUHVsc2UsIHdtbS0+ZHdQdWxzZSk7CgkJVFJBQ0UobWNpbWlkaSwgIldhaXQgdW50aWwgJWx1ID0+ICVsdSBtc1xuIiwgCQoJCSAgICAgIHRjIC0gd21tLT5kd1N0YXJ0VGlja3MsIHRvZ28gLSB3bW0tPmR3U3RhcnRUaWNrcyk7CgkJaWYgKHRjIDwgdG9nbykJCgkJICAgIFNsZWVwKHRvZ28gLSB0Yyk7CgkgICAgfQoJICAgIHdtbS0+ZHdQdWxzZSA9IGhpUHVsc2U7Cgl9CgkKCXN3aXRjaCAoTE9CWVRFKExPV09SRChtbXQtPmR3RXZlbnREYXRhKSkpIHsKCWNhc2UgMHhGMDoKCWNhc2UgMHhGNzoJLyogc3lzZXggZXZlbnRzICovCgkgICAgewoJCUZJWE1FKG1jaW1pZGksICJOb3QgaGFuZGxpbmcgU3lzRXggZXZlbnRzICh5ZXQpXG4iKTsKCSAgICB9CgkgICAgYnJlYWs7CgljYXNlIDB4RkY6CgkgICAgLyogcG9zaXRpb24gYWZ0ZXIgbWV0YSBkYXRhIGhlYWRlciAqLwoJICAgIG1taW9TZWVrKHdtbS0+aEZpbGUsIG1tdC0+ZHdJbmRleCArIEhJV09SRChtbXQtPmR3RXZlbnREYXRhKSwgU0VFS19TRVQpOwoJICAgIHN3aXRjaCAoSElCWVRFKExPV09SRChtbXQtPmR3RXZlbnREYXRhKSkpIHsKCSAgICBjYXNlIDB4MDA6IC8qIDE2LWJpdCBzZXF1ZW5jZSBudW1iZXIgKi8KCQlpZiAoVFJBQ0VfT04obWlkaSkpIHsKCQkgICAgV09SRAl0d2Q7CgkJICAgIAoJCSAgICBNSURJX21jaVJlYWRXb3JkKHdtbSwgJnR3ZCk7CS8qID09IDAgKi8KCQkgICAgVFJBQ0UobWNpbWlkaSwgIkdvdCBzZXF1ZW5jZSBudW1iZXIgJXVcbiIsIHR3ZCk7CgkJfQoJCWJyZWFrOwoJICAgIGNhc2UgMHgwMTogLyogYW55IHRleHQgKi8KCSAgICBjYXNlIDB4MDI6IC8qIENvcHlyaWdodCBNZXNzYWdlIHRleHQgKi8KCSAgICBjYXNlIDB4MDM6IC8qIFNlcXVlbmNlL1RyYWNrIE5hbWUgdGV4dCAqLwoJICAgIGNhc2UgMHgwNDogLyogSW5zdHJ1bWVudCBOYW1lIHRleHQgKi8KCSAgICBjYXNlIDB4MDU6IC8qIEx5cmljIHRleHQgKi8KCSAgICBjYXNlIDB4MDY6IC8qIE1hcmtlciB0ZXh0ICovCgkgICAgY2FzZSAweDA3OiAvKiBDdWUtcG9pbnQgdGV4dCAqLwoJCWlmIChUUkFDRV9PTihtY2ltaWRpKSkgewoJCSAgICBjaGFyCWJ1ZlsxMDI0XTsKCQkgICAgV09SRAlsZW4gPSBtbXQtPndFdmVudExlbmd0aCAtIEhJV09SRChtbXQtPmR3RXZlbnREYXRhKTsKCQkgICAgc3RhdGljCWNoYXIqCWluZm9bOF0gPSB7IiIsICJUZXh0IiwgIkNvcHlyaWdodCIsICJTZXEvVHJrIG5hbWUiLCAKCQkJCQkJICAgIkluc3RydW1lbnQiLCAiTHlyaWMiLCAiTWFya2VyIiwgIkN1ZS1wb2ludCJ9OwoJCSAgICBXT1JECWlkeCA9IEhJQllURShMT1dPUkQobW10LT5kd0V2ZW50RGF0YSkpOwoJCSAgICAKCQkgICAgaWYgKGxlbiA+PSBzaXplb2YoYnVmKSkgewoJCQlXQVJOKG1jaW1pZGksICJCdWZmZXIgZm9yIHRleHQgaXMgdG9vIHNtYWxsICglZCBieXRlcywgd2hlbiAldSBhcmUgbmVlZGVkKVxuIiwgc2l6ZW9mKGJ1ZikgLSAxLCBsZW4pOwoJCQlsZW4gPSBzaXplb2YoYnVmKSAtIDE7CgkJICAgIH0KCQkgICAgaWYgKG1taW9SZWFkKHdtbS0+aEZpbGUsIChIUFNUUilidWYsIGxlbikgPT0gbGVuKSB7CgkJCWJ1ZltsZW5dID0gMDsJLyogZW5kIHN0cmluZyBpbiBjYXNlICovCgkJCVRSQUNFKG1jaW1pZGksICIlcyA9PiBcIiVzXCJcbiIsIChpZHggPCA4ICkgPyBpbmZvW2lkeF0gOiAiIiwgYnVmKTsKCQkgICAgfSBlbHNlIHsKCQkJV0FSTihtY2ltaWRpLCAiQ291bGRuJ3QgcmVhZCBkYXRhIGZvciAlc1xuIiwgKGlkeCA8IDggKSA/IGluZm9baWR4XSA6ICIiKTsKCQkgICAgfQoJCX0KCQlicmVhazsKCSAgICBjYXNlIDB4MjA6IAoJCS8qIE1JREkgY2hhbm5lbCAoY2MpICovCgkJaWYgKEZJWE1FX09OKG1jaW1pZGkpKSB7CgkJICAgIEJZVEUJYnQ7CgkJICAgIAoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmJ0KTsJLyogPT0gMCAqLwoJCSAgICBGSVhNRShtY2ltaWRpLCAiTklZOiBNSURJIGNoYW5uZWw9JXUsIHRyYWNrPSV1XG4iLCBidCwgbW10LT53VHJhY2tOcik7CgkJfQoJCWJyZWFrOwoJICAgIGNhc2UgMHgyMToKCQkvKiBNSURJIHBvcnQgKHBwKSAqLwoJCWlmIChGSVhNRV9PTihtY2ltaWRpKSkgewoJCSAgICBCWVRFCWJ0OwoJCSAgICAKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZidCk7CS8qID09IDAgKi8KCQkgICAgRklYTUUobWNpbWlkaSwgIk5JWTogTUlESSBwb3J0PSV1LCB0cmFjaz0ldVxuIiwgYnQsIG1tdC0+d1RyYWNrTnIpOwoJCX0KCQlicmVhazsKCSAgICBjYXNlIDB4MkY6IC8qIGVuZCBvZiB0cmFjayAqLwoJCW1tdC0+d1N0YXR1cyA9IDA7CgkJYnJlYWs7CgkgICAgY2FzZSAweDUxOi8qIHNldCB0ZW1wbyAqLwoJCS8qIFRlbXBvIGlzIGV4cHJlc3NlZCBpbiC1LXNlY29uZHMgcGVyIG1pZGkgcXVhcnRlciBub3RlCgkJICogZm9yIGZvcm1hdCAxIE1JREkgZmlsZXMsIHRoaXMgY2FuIG9ubHkgYmUgcHJlc2VudCBvbiB0cmFjayAjMAoJCSAqLwoJCWlmIChtbXQtPndUcmFja05yICE9IDAgJiYgd21tLT53Rm9ybWF0ID09IDEpIHsKCQkgICAgV0FSTihtY2ltaWRpLCAiRm9yIGZvcm1hdCAjMSBNSURJIGZpbGVzLCB0ZW1wbyBjYW4gb25seSBiZSBjaGFuZ2VkIG9uIHRyYWNrICMwICgldSlcbiIsIG1tdC0+d1RyYWNrTnIpOwoJCX0gZWxzZSB7IAoJCSAgICBCWVRFCXRidDsKCQkgICAgRFdPUkQJdmFsdWUgPSAwOwoJCSAgICAKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZ0YnQpOwl2YWx1ZSAgPSAoKERXT1JEKXRidCkgPDwgMTY7CgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmdGJ0KTsJdmFsdWUgfD0gKChEV09SRCl0YnQpIDw8IDg7CgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmdGJ0KTsJdmFsdWUgfD0gKChEV09SRCl0YnQpIDw8IDA7CgkJICAgIFRSQUNFKG1jaW1pZGksICJTZXR0aW5nIHRlbXBvIHRvICVsZCAoQlBNPSVsZClcbiIsIHdtbS0+ZHdUZW1wbywgKHZhbHVlKSA/ICg2MDAwMDAwMGwgLyB2YWx1ZSkgOiAwKTsKCQkgICAgd21tLT5kd1RlbXBvID0gdmFsdWU7CgkJfQoJCWJyZWFrOwoJICAgIGNhc2UgMHg1NDogLyogKGhvdXIpIChtaW4pIChzZWNvbmQpIChmcmFtZSkgKGZyYWN0aW9uYWwtZnJhbWUpIC0gU01QVEUgdHJhY2sgc3RhcnQgKi8KCQlpZiAobW10LT53VHJhY2tOciAhPSAwICYmIHdtbS0+d0Zvcm1hdCA9PSAxKSB7CgkJICAgIFdBUk4obWNpbWlkaSwgIkZvciBmb3JtYXQgIzEgTUlESSBmaWxlcywgU01QVEUgdHJhY2sgc3RhcnQgY2FuIG9ubHkgYmUgZXhwcmVzc2VkIG9uIHRyYWNrICMwICgldSlcbiIsIG1tdC0+d1RyYWNrTnIpOwoJCX0gaWYgKG1tdC0+ZHdFdmVudFB1bHNlICE9IDApIHsKCQkgICAgV0FSTihtY2ltaWRpLCAiU01QVEUgdHJhY2sgc3RhcnQgY2FuIG9ubHkgYmUgZXhwcmVzc2VkIGF0IHN0YXJ0IG9mIHRyYWNrICglbHUpXG4iLCBtbXQtPmR3RXZlbnRQdWxzZSk7CgkJfSBlbHNlIHsKCQkgICAgQllURQloLCBtLCBzLCBmLCBmZjsKCQkgICAgCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmaCk7CgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmbSk7CgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmcyk7CgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmZik7CgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmZmYpOwoJCSAgICBGSVhNRShtY2ltaWRpLCAiTklZOiBTTVBURSB0cmFjayBzdGFydCAldToldToldSAldS4ldVxuIiwgaCwgbSwgcywgZiwgZmYpOwoJCX0KCQlicmVhazsKCSAgICBjYXNlIDB4NTg6IC8qIGZpbGUgcnl0aG0gKi8KCQlpZiAoVFJBQ0VfT04obWNpbWlkaSkpIHsKCQkgICAgQllURQludW0sIGRlbiwgY3BtYywgXzMybnBxbjsKCQkgICAgCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmbnVtKTsJCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmZGVuKTsJCS8qIHRvIG5vdGF0ZSBlLmcuIDYvOCAqLwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmNwbWMpOwkJLyogbnVtYmVyIG9mIE1JREkgY2xvY2tzIHBlciBtZXRyb25vbWUgY2xpY2sgKi8gCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmXzMybnBxbik7CQkvKiBudW1iZXIgb2Ygbm90YXRlZCAzMm5kIG5vdGVzIHBlciBNSURJIHF1YXJ0ZXIgbm90ZSAqLwoJCSAgICAKCQkgICAgVFJBQ0UobWNpbWlkaSwgIiV1LyV1LCBjbG9jayBwZXIgbWV0cm9ub21lIGNsaWNrPSV1LCAzMm5kIG5vdGVzIGJ5IDEvNCBub3RlPSV1XG4iLCBudW0sIDEgPDwgZGVuLCBjcG1jLCBfMzJucHFuKTsKCQl9CgkJYnJlYWs7CgkgICAgY2FzZSAweDU5OiAvKiBrZXkgc2lnbmF0dXJlICovCgkJaWYgKFRSQUNFX09OKG1jaW1pZGkpKSB7CgkJICAgIEJZVEUJc2YsIG1tOwoJCSAgICAKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZzZik7CQkKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZtbSk7CQoJCSAgICAKCQkgICAgaWYgKHNmID49IDB4ODApIAlUUkFDRShtY2ltaWRpLCAiJWQgZmxhdHNcbiIsIC0oY2hhcilzZik7CSAKCQkgICAgZWxzZSBpZiAoc2YgPiAwKSAJVFJBQ0UobWNpbWlkaSwgIiVkIHNoYXJwc1xuIiwgKGNoYXIpc2YpOwkgCgkJICAgIGVsc2UgCQlUUkFDRShtY2ltaWRpLCAiS2V5IG9mIENcbiIpOwoJCSAgICBUUkFDRShtY2ltaWRpLCAiTW9kZTogJXNcbiIsIChtbSA9IDApID8gIm1ham9yIiA6ICJtaW5vciIpOwoJCX0KCQlicmVhazsKCSAgICBkZWZhdWx0OgoJCVdBUk4obWNpbWlkaSwgIlVua25vd24gTUlESSBtZXRhIGV2ZW50ICUwMnguIFNraXBwaW5nLi4uXG4iLCBISUJZVEUoTE9XT1JEKG1tdC0+ZHdFdmVudERhdGEpKSk7CgkJYnJlYWs7CgkgICAgfQoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBpZiAoZG9QbGF5KSB7CgkJZHdSZXQgPSBtb2RNZXNzYWdlKHdEZXZJRCwgTU9ETV9EQVRBLCAwLCBtbXQtPmR3RXZlbnREYXRhLCAwKTsKCSAgICB9IGVsc2UgewoJCXN3aXRjaCAoTE9CWVRFKExPV09SRChtbXQtPmR3RXZlbnREYXRhKSkgJiAweEYwKSB7CgkJY2FzZSBNSURJX05PVEVPTjoKCQljYXNlIE1JRElfTk9URU9GRjoKCQkgICAgZHdSZXQgPSAwOwkKCQkgICAgYnJlYWs7CgkJZGVmYXVsdDoKCQkgICAgZHdSZXQgPSBtb2RNZXNzYWdlKHdEZXZJRCwgTU9ETV9EQVRBLCAwLCBtbXQtPmR3RXZlbnREYXRhLCAwKTsKCQl9CgkgICAgfQoJfQoJbW10LT5kd0luZGV4ICs9IG1tdC0+d0V2ZW50TGVuZ3RoOwoJaWYgKG1tdC0+ZHdJbmRleCA8IG1tdC0+ZHdGaXJzdCB8fCBtbXQtPmR3SW5kZXggPj0gbW10LT5kd0xhc3QpIHsKCSAgICBtbXQtPndTdGF0dXMgPSAwOwoJfSAKCWlmIChtbXQtPndTdGF0dXMpIHsJCgkgICAgTUlESV9tY2lSZWFkTmV4dEV2ZW50KHdtbSwgbW10KTsKCX0KICAgIH0KICAgIAogICAgLyogc3RvcCBhbGwgbm90ZXMgKi8KICAgIC8qIHNob3VsZCBiZSAoMHg3ODAwIHwgTUlESV9DVExfQ0hBTkdFKSBpbnN0ZWFkIG9mIDB4NzhCMCwKICAgICAqIGJ1dCBNSURJX0NUTF9DSEFOR0UgaXMgZGVmaW5lZCBpbiBPU1MncyBzb3VuZGNhcmQuaCBhbmQgTUNJIG11c3QgY29tcGlsZQogICAgICogd2l0aG91dCBhbnkgcmVmZXJlbmNlIHRvIE9TUwogICAgICovCiAgICAvKiBGSVhNRTogY2hlY2sgaWYgMHg3OEIwIGlzIGNoYW5uZWwgZGVwZW5kYW50IG9yIG5vdC4gSSBjb2RlZCBpdCBzbyB0aGF0IAogICAgICogaXQncyBjaGFubmVsIGRlcGVuZGVudC4uLgogICAgICovCiAgICB7Cgl1bnNpZ25lZCBjaG47Cglmb3IgKGNobiA9IDA7IGNobiA8IDE2OyBjaG4rKykKCSAgICBtb2RNZXNzYWdlKHdEZXZJRCwgTU9ETV9EQVRBLCAwLCAweDc4QjAgfCBjaG4sIDApOwogICAgfQogICAgCiAgICB3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKICAgIAogICAgLyogdG8gcmVzdGFydCBwbGF5aW5nIGF0IGJlZ2lubmluZyB3aGVuIGl0J3Mgb3ZlciAqLwogICAgd21tLT5kd1Bvc2l0aW9uTVMgPSAwOwogICAgCiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpKSB7CglUUkFDRShtY2ltaWRpLCAiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwoJbWNpRHJpdmVyTm90aWZ5MTYoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAoJCQkgIHdtbS0+d05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lSZWNvcmQJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lSZWNvcmQoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfUkVDT1JEX1BBUk1TIGxwUGFybXMpCnsKICAgIGludAkJCXN0YXJ0LCBlbmQ7CiAgICBMUE1JRElIRFIxNgkJbHBNaWRpSGRyOwogICAgRFdPUkQJCWR3UmV0OwogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIAogICAgVFJBQ0UobWNpbWlkaSwgIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKHdtbSA9PSAwKQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgCiAgICBpZiAod21tLT5oRmlsZSA9PSAwKSB7CglXQVJOKG1jaW1pZGksICJDYW4ndCBmaW5kIGZpbGU9JyUwOGx4JyAhXG4iLCAKCSAgICAgKERXT1JEKXdtbS0+b3BlblBhcm1zLmxwc3RyRWxlbWVudE5hbWUpOwoJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKICAgIH0KICAgIHN0YXJ0ID0gMTsgCQllbmQgPSA5OTk5OTsKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX0ZST00pKSB7CglzdGFydCA9IGxwUGFybXMtPmR3RnJvbTsgCglUUkFDRShtY2ltaWRpLCAiTUNJX0ZST009JWQgXG4iLCBzdGFydCk7CiAgICB9CiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9UTykpIHsKCWVuZCA9IGxwUGFybXMtPmR3VG87CglUUkFDRShtY2ltaWRpLCAiTUNJX1RPPSVkIFxuIiwgZW5kKTsKICAgIH0KICAgIGxwTWlkaUhkciA9IFVTRVJfSEVBUF9MSU5fQUREUih3bW0tPmhNaWRpSGRyKTsKICAgIGxwTWlkaUhkci0+bHBEYXRhID0gKExQU1RSKSB4bWFsbG9jKDEyMDApOwogICAgbHBNaWRpSGRyLT5kd0J1ZmZlckxlbmd0aCA9IDEwMjQ7CiAgICBscE1pZGlIZHItPmR3VXNlciA9IDBMOwogICAgbHBNaWRpSGRyLT5kd0ZsYWdzID0gMEw7CiAgICBkd1JldCA9IG1pZE1lc3NhZ2Uod0RldklELCBNSURNX1BSRVBBUkUsIDAsIChEV09SRClscE1pZGlIZHIsIHNpemVvZihNSURJSERSMTYpKTsKICAgIFRSQUNFKG1jaW1pZGksICJBZnRlciBNSURNX1BSRVBBUkUgXG4iKTsKICAgIHdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9SRUNPUkQ7CiAgICB3aGlsZSAod21tLT5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9TVE9QKSB7CglUUkFDRShtY2ltaWRpLCAid21tLT5kd1N0YXR1cz0lcCAlZFxuIiwKCSAgICAgICZ3bW0tPmR3U3RhdHVzLCB3bW0tPmR3U3RhdHVzKTsKCWxwTWlkaUhkci0+ZHdCeXRlc1JlY29yZGVkID0gMDsKCWR3UmV0ID0gbWlkTWVzc2FnZSh3RGV2SUQsIE1JRE1fU1RBUlQsIDAsIDBMLCAwTCk7CglUUkFDRShtY2ltaWRpLCAiQWZ0ZXIgTUlETV9TVEFSVCBscE1pZGlIZHI9JXAgZHdCeXRlc1JlY29yZGVkPSVsdVxuIiwKCSAgICAgIGxwTWlkaUhkciwgbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQpOwoJaWYgKGxwTWlkaUhkci0+ZHdCeXRlc1JlY29yZGVkID09IDApIGJyZWFrOwogICAgfQogICAgVFJBQ0UobWNpbWlkaSwgIkJlZm9yZSBNSURNX1VOUFJFUEFSRSBcbiIpOwogICAgZHdSZXQgPSBtaWRNZXNzYWdlKHdEZXZJRCwgTUlETV9VTlBSRVBBUkUsIDAsIChEV09SRClscE1pZGlIZHIsIHNpemVvZihNSURJSERSMTYpKTsKICAgIFRSQUNFKG1jaW1pZGksICJBZnRlciBNSURNX1VOUFJFUEFSRSBcbiIpOwogICAgaWYgKGxwTWlkaUhkci0+bHBEYXRhICE9IE5VTEwpIHsKCWZyZWUobHBNaWRpSGRyLT5scERhdGEpOwoJbHBNaWRpSGRyLT5scERhdGEgPSBOVUxMOwogICAgfQogICAgd21tLT5kd1N0YXR1cyA9IE1DSV9NT0RFX1NUT1A7CiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpKSB7CglUUkFDRShtY2ltaWRpLCAiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwoJbWNpRHJpdmVyTm90aWZ5MTYoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAoJCQkgIHdtbS0+d05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lQYXVzZQkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVBhdXNlKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKewogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIAogICAgVFJBQ0UobWNpbWlkaSwgIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKHdtbSA9PSBOVUxMKQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgCiAgICBpZiAod21tLT5kd1N0YXR1cyA9PSBNQ0lfTU9ERV9QTEFZKSB7CgkvKiBzdG9wIGFsbCBub3RlcyAqLwoJLyogc2VlIG5vdGUgaW4gTUlESV9tY2lQbGF5ICovCgl1bnNpZ25lZCBjaG47Cglmb3IgKGNobiA9IDA7IGNobiA8IDE2OyBjaG4rKykKCSAgICBtb2RNZXNzYWdlKHdEZXZJRCwgTU9ETV9EQVRBLCAwLCAweDc4QjAgfCBjaG4sIDApOwoJd21tLT5kd1N0YXR1cyA9IE1DSV9NT0RFX1BBVVNFOwogICAgfSAKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX05PVElGWSkpIHsKCVRSQUNFKG1jaW1pZGksICJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgltY2lEcml2ZXJOb3RpZnkxNigoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCgkJCSAgd21tLT53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAgICB9CiAgICAKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVzdW1lCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpUmVzdW1lKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKewogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIAogICAgVFJBQ0UobWNpbWlkaSwgIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKHdtbSA9PSBOVUxMKQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgCiAgICBpZiAod21tLT5kd1N0YXR1cyA9PSBNQ0lfTU9ERV9QQVVTRSkgewoJd21tLT53U3RhcnRlZFBsYXlpbmcgPSBGQUxTRTsKCXdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9QTEFZOwogICAgfSAKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX05PVElGWSkpIHsKCVRSQUNFKG1jaW1pZGksICJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgltY2lEcml2ZXJOb3RpZnkxNigoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCgkJCSAgd21tLT53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVNldAkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVNldChVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TRVRfUEFSTVMgbHBQYXJtcykKewogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIAogICAgVFJBQ0UobWNpbWlkaSwgIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKGxwUGFybXMgPT0gTlVMTCkJcmV0dXJuIE1DSUVSUl9OVUxMX1BBUkFNRVRFUl9CTE9DSzsKICAgIGlmICh3bW0gPT0gTlVMTCkJCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CiAgICAKICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFVF9USU1FX0ZPUk1BVCkgewoJc3dpdGNoIChscFBhcm1zLT5kd1RpbWVGb3JtYXQpIHsKCWNhc2UgTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM6CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9GT1JNQVRfTUlMTElTRUNPTkRTICFcbiIpOwoJICAgIHdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9GT1JNQVRfU01QVEVfMjQ6CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9GT1JNQVRfU01QVEVfMjQgIVxuIik7CgkgICAgd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1NNUFRFXzI0OwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzI1OgoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfRk9STUFUX1NNUFRFXzI1ICFcbiIpOwoJICAgIHdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9TTVBURV8yNTsKCSAgICBicmVhazsKCWNhc2UgTUNJX0ZPUk1BVF9TTVBURV8zMDoKCSAgICBUUkFDRShtY2ltaWRpLCAiTUNJX0ZPUk1BVF9TTVBURV8zMCAhXG4iKTsKCSAgICB3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfU01QVEVfMzA7CgkgICAgYnJlYWs7CglkZWZhdWx0OgoJICAgIFdBUk4obWNpbWlkaSwgIkJhZCB0aW1lIGZvcm1hdCAlbHUhXG4iLCBscFBhcm1zLT5kd1RpbWVGb3JtYXQpOwoJICAgIHJldHVybiBNQ0lFUlJfQkFEX1RJTUVfRk9STUFUOwoJfQogICAgfQogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX1ZJREVPKSB7CglUUkFDRShtY2ltaWRpLCAiTm8gc3VwcG9ydCBmb3IgdmlkZW8gIVxuIik7CglyZXR1cm4gTUNJRVJSX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOwogICAgfQogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX0RPT1JfT1BFTikgewoJVFJBQ0UobWNpbWlkaSwgIk5vIHN1cHBvcnQgZm9yIGRvb3Igb3BlbiAhXG4iKTsKCXJldHVybiBNQ0lFUlJfVU5TVVBQT1JURURfRlVOQ1RJT047CiAgICB9CiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVRfRE9PUl9DTE9TRUQpIHsKCVRSQUNFKG1jaW1pZGksICJObyBzdXBwb3J0IGZvciBkb29yIGNsb3NlICFcbiIpOwoJcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsKICAgIH0KICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFVF9BVURJTykgewoJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX09OKSB7CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9TRVRfT04gYXVkaW8gIVxuIik7Cgl9IGVsc2UgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX09GRikgewoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfU0VUX09GRiBhdWRpbyAhXG4iKTsKCX0gZWxzZSB7CgkgICAgV0FSTihtY2ltaWRpLCAiTUNJX1NFVF9BVURJTyB3aXRob3V0IFNFVF9PTiBvciBTRVRfT0ZGXG4iKTsKCSAgICByZXR1cm4gTUNJRVJSX0JBRF9JTlRFR0VSOwoJfQoJCglpZiAobHBQYXJtcy0+ZHdBdWRpbyAmIE1DSV9TRVRfQVVESU9fQUxMKQoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfU0VUX0FVRElPX0FMTCAhXG4iKTsKCWlmIChscFBhcm1zLT5kd0F1ZGlvICYgTUNJX1NFVF9BVURJT19MRUZUKQoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfU0VUX0FVRElPX0xFRlQgIVxuIik7CglpZiAobHBQYXJtcy0+ZHdBdWRpbyAmIE1DSV9TRVRfQVVESU9fUklHSFQpCgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9TRVRfQVVESU9fUklHSFQgIVxuIik7CiAgICB9CiAgICAKICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFUV9TRVRfTUFTVEVSKQoJVFJBQ0UobWNpbWlkaSwgIk1DSV9TRVFfU0VUX01BU1RFUiAhXG4iKTsKICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFUV9TRVRfU0xBVkUpCglUUkFDRShtY2ltaWRpLCAiTUNJX1NFUV9TRVRfU0xBVkUgIVxuIik7CiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVFfU0VUX09GRlNFVCkKCVRSQUNFKG1jaW1pZGksICJNQ0lfU0VRX1NFVF9PRkZTRVQgIVxuIik7CiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVFfU0VUX1BPUlQpCglUUkFDRShtY2ltaWRpLCAiTUNJX1NFUV9TRVRfUE9SVCAhXG4iKTsKICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFUV9TRVRfVEVNUE8pCglUUkFDRShtY2ltaWRpLCAiTUNJX1NFUV9TRVRfVEVNUE8gIVxuIik7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVN0YXR1cwkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVN0YXR1cyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TVEFUVVNfUEFSTVMgbHBQYXJtcykKewogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIAogICAgVFJBQ0UobWNpbWlkaSwgIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKGxwUGFybXMgPT0gTlVMTCkgCXJldHVybiBNQ0lFUlJfTlVMTF9QQVJBTUVURVJfQkxPQ0s7CiAgICBpZiAod21tID09IE5VTEwpCQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgCiAgICBpZiAoZHdGbGFncyAmIE1DSV9TVEFUVVNfSVRFTSkgewoJc3dpdGNoIChscFBhcm1zLT5kd0l0ZW0pIHsKCWNhc2UgTUNJX1NUQVRVU19DVVJSRU5UX1RSQUNLOgoJICAgIC8qIEZJWE1FIGluIEZvcm1hdCAyICovCgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSAxOwoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfU1RBVFVTX0NVUlJFTlRfVFJBQ0sgPT4gJWx1XG4iLCBscFBhcm1zLT5kd1JldHVybik7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TVEFUVVNfTEVOR1RIOgoJICAgIGlmICgoZHdGbGFncyAmIE1DSV9UUkFDSykgJiYgd21tLT53Rm9ybWF0ID09IDIpIHsKCQlpZiAobHBQYXJtcy0+ZHdUcmFjayA+PSB3bW0tPm5UcmFja3MpCgkJICAgIHJldHVybiBNQ0lFUlJfQkFEX0lOVEVHRVI7CgkJLyogRklYTUU6IHRoaXMgaXMgd3JvbmcgaWYgdGhlcmUgaXMgYSB0ZW1wbyBjaGFuZ2UgaW5zaWRlIHRoZSBmaWxlICovCgkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBNSURJX0NvbnZlcnRQdWxzZVRvTVMod21tLCB3bW0tPnRyYWNrc1tscFBhcm1zLT5kd1RyYWNrXS5kd0xlbmd0aCk7CgkgICAgfSBlbHNlIHsKCQlscFBhcm1zLT5kd1JldHVybiA9IE1JRElfR2V0TVRoZExlbmd0aE1TKHdtbSk7CgkgICAgfQoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gTUlESV9Db252ZXJ0TVNUb1RpbWVGb3JtYXQod21tLCBscFBhcm1zLT5kd1JldHVybik7CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9TVEFUVVNfTEVOR1RIID0+ICVsdVxuIiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU1RBVFVTX01PREU6CiAJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gd21tLT5kd1N0YXR1czsKCSAgICBUUkFDRShtY2ltaWRpLCAiTUNJX1NUQVRVU19NT0RFID0+ICVsdVxuIiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU1RBVFVTX01FRElBX1BSRVNFTlQ6CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9TVEFUVVNfTUVESUFfUFJFU0VOVCA9PiBUUlVFXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IFRSVUU7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TVEFUVVNfTlVNQkVSX09GX1RSQUNLUzoKCSAgICBscFBhcm1zLT5kd1JldHVybiA9ICh3bW0tPndGb3JtYXQgPT0gMikgPyB3bW0tPm5UcmFja3MgOiAxOwoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfU1RBVFVTX05VTUJFUl9PRl9UUkFDS1MgPT4gJWx1XG4iLCBscFBhcm1zLT5kd1JldHVybik7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TVEFUVVNfUE9TSVRJT046CgkgICAgLyogRklYTUU6IGRvIEkgbmVlZCB0byB1c2UgTUNJX1RSQUNLID8gKi8KCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1JRElfQ29udmVydE1TVG9UaW1lRm9ybWF0KHdtbSwgCgkJCQkJCQkgICAoZHdGbGFncyAmIE1DSV9TVEFUVVNfU1RBUlQpID8gMCA6IHdtbS0+ZHdQb3NpdGlvbk1TKTsKCSAgICBUUkFDRShtY2ltaWRpLCAiTUNJX1NUQVRVU19QT1NJVElPTiAlcyA9PiAlbHVcbiIsIAoJCSAgKGR3RmxhZ3MgJiBNQ0lfU1RBVFVTX1NUQVJUKSA/ICJzdGFydCIgOiAiY3VycmVudCIsIGxwUGFybXMtPmR3UmV0dXJuKTsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NUQVRVU19SRUFEWToKCSAgICBscFBhcm1zLT5kd1JldHVybiA9ICh3bW0tPmR3U3RhdHVzICE9IE1DSV9NT0RFX05PVF9SRUFEWSk7CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9TVEFUVVNfUkVBRFkgPSAlbHVcbiIsIGxwUGFybXMtPmR3UmV0dXJuKTsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NUQVRVU19USU1FX0ZPUk1BVDoKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IHdtbS0+ZHdNY2lUaW1lRm9ybWF0OwoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfU1RBVFVTX1RJTUVfRk9STUFUID0+ICVsdVxuIiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU0VRX1NUQVRVU19ESVZUWVBFOgoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfU0VRX1NUQVRVU19ESVZUWVBFICFcbiIpOwoJICAgIGlmICh3bW0tPm5EaXZpc2lvbiA+IDB4ODAwMCkgewoJCXN3aXRjaCAod21tLT5uRGl2aXNpb24pIHsKCQljYXNlIDB4RTg6CWxwUGFybXMtPmR3UmV0dXJuID0gTUNJX1NFUV9ESVZfU01QVEVfMjQ7CWJyZWFrOwkvKiAtMjQgKi8KCQljYXNlIDB4RTc6CWxwUGFybXMtPmR3UmV0dXJuID0gTUNJX1NFUV9ESVZfU01QVEVfMjU7CWJyZWFrOwkvKiAtMjUgKi8KCQljYXNlIDB4RTM6CWxwUGFybXMtPmR3UmV0dXJuID0gTUNJX1NFUV9ESVZfU01QVEVfMzBEUk9QOwlicmVhazsJLyogLTI5ICovIC8qIGlzIHRoZSBNQ0kgY29uc3RhbnQgY29ycmVjdCA/ICovCgkJY2FzZSAweEUyOglscFBhcm1zLT5kd1JldHVybiA9IE1DSV9TRVFfRElWX1NNUFRFXzMwOwlicmVhazsJLyogLTMwICovCgkJZGVmYXVsdDoJRklYTUUobWNpbWlkaSwgIlRoZXJlIGlzIGEgYmFkIGJhZCBwcm9ncmFtbWVyXG4iKTsKCQl9CgkgICAgfSBlbHNlIHsKCQlscFBhcm1zLT5kd1JldHVybiA9IE1DSV9TRVFfRElWX1BQUU47CgkgICAgfQoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU0VRX1NUQVRVU19NQVNURVI6CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9TRVFfU1RBVFVTX01BU1RFUiAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IDA7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TRVFfU1RBVFVTX1NMQVZFOgoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfU0VRX1NUQVRVU19TTEFWRSAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IDA7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TRVFfU1RBVFVTX09GRlNFVDoKCSAgICBUUkFDRShtY2ltaWRpLCAiTUNJX1NFUV9TVEFUVVNfT0ZGU0VUICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gMDsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NFUV9TVEFUVVNfUE9SVDoKCSAgICBUUkFDRShtY2ltaWRpLCAiTUNJX1NFUV9TVEFUVVNfUE9SVCAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IDA7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TRVFfU1RBVFVTX1RFTVBPOgoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfU0VRX1NUQVRVU19URU1QTyAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IHdtbS0+ZHdUZW1wbzsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgV0FSTihtY2ltaWRpLCAiVW5rbm93bSBjb21tYW5kICUwOGxYICFcbiIsIGxwUGFybXMtPmR3SXRlbSk7CgkgICAgcmV0dXJuIE1DSUVSUl9VTlJFQ09HTklaRURfQ09NTUFORDsKCX0KICAgIH0gZWxzZSB7CglXQVJOKG1jaW1pZGksICJObyBTdGF0dXMtSXRlbSFcbiIpOwoJcmV0dXJuIE1DSUVSUl9VTlJFQ09HTklaRURfQ09NTUFORDsKICAgIH0KICAgIGlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewoJVFJBQ0UobWNpbWlkaSwgIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKCW1jaURyaXZlck5vdGlmeTE2KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKCQkJICB3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpR2V0RGV2Q2FwcwkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpR2V0RGV2Q2FwcyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCAKCQkJCUxQTUNJX0dFVERFVkNBUFNfUEFSTVMgbHBQYXJtcykKewogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIAogICAgVFJBQ0UobWNpbWlkaSwgIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKGxwUGFybXMgPT0gTlVMTCkgCXJldHVybiBNQ0lFUlJfTlVMTF9QQVJBTUVURVJfQkxPQ0s7CiAgICBpZiAod21tID09IE5VTEwpCQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgCiAgICBpZiAoZHdGbGFncyAmIE1DSV9HRVRERVZDQVBTX0lURU0pIHsKCXN3aXRjaCAobHBQYXJtcy0+ZHdJdGVtKSB7CgljYXNlIE1DSV9HRVRERVZDQVBTX0RFVklDRV9UWVBFOgoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfR0VUREVWQ0FQU19ERVZJQ0VfVFlQRSAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IE1DSV9ERVZUWVBFX1NFUVVFTkNFUjsKCSAgICBicmVhazsKCWNhc2UgTUNJX0dFVERFVkNBUFNfSEFTX0FVRElPOgoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfR0VUREVWQ0FQU19IQVNfQVVESU8gIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBUUlVFOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19IQVNfVklERU86CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9HRVRERVZDQVBTX0hBU19WSURFTyAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IEZBTFNFOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19VU0VTX0ZJTEVTOgoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfR0VUREVWQ0FQU19VU0VTX0ZJTEVTICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKCSAgICBicmVhazsKCWNhc2UgTUNJX0dFVERFVkNBUFNfQ09NUE9VTkRfREVWSUNFOgoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfR0VUREVWQ0FQU19DT01QT1VORF9ERVZJQ0UgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBUUlVFOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19DQU5fRUpFQ1Q6CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9HRVRERVZDQVBTX0NBTl9FSkVDVCAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IEZBTFNFOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19DQU5fUExBWToKCSAgICBUUkFDRShtY2ltaWRpLCAiTUNJX0dFVERFVkNBUFNfQ0FOX1BMQVkgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBUUlVFOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19DQU5fUkVDT1JEOgoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfR0VUREVWQ0FQU19DQU5fUkVDT1JEICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKCSAgICBicmVhazsKCWNhc2UgTUNJX0dFVERFVkNBUFNfQ0FOX1NBVkU6CgkgICAgVFJBQ0UobWNpbWlkaSwgIk1DSV9HRVRERVZDQVBTX0NBTl9TQVZFICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gRkFMU0U7CgkgICAgYnJlYWs7CglkZWZhdWx0OgoJICAgIFRSQUNFKG1jaW1pZGksICJVbmtub3duIGNhcGFiaWxpdHkgKCUwOGx4KSAhXG4iLCBscFBhcm1zLT5kd0l0ZW0pOwoJICAgIHJldHVybiBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ7Cgl9CiAgICB9IGVsc2UgewoJVFJBQ0UobWNpbWlkaSwgIk5vIEdldERldkNhcHMtSXRlbSAhXG4iKTsKCXJldHVybiBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaUluZm8JCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lJbmZvKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0lORk9fUEFSTVNBIGxwUGFybXMpCnsKICAgIERXT1JECQlyZXQgPSAwOwogICAgTFBTVFIJCXN0ciA9IDA7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgCiAgICBUUkFDRShtY2ltaWRpLCAiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogICAgCiAgICBpZiAobHBQYXJtcyA9PSBOVUxMIHx8IGxwUGFybXMtPmxwc3RyUmV0dXJuID09IE5VTEwpIHsKCXJldCA9IE1DSUVSUl9OVUxMX1BBUkFNRVRFUl9CTE9DSzsKICAgIH0gZWxzZSBpZiAod21tID09IE5VTEwpIHsKCXJldCA9IE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIH0gZWxzZSB7CglUUkFDRShtY2ltaWRpLCAiYnVmPSVwLCBsZW49JWx1XG4iLCBscFBhcm1zLT5scHN0clJldHVybiwgbHBQYXJtcy0+ZHdSZXRTaXplKTsKCQoJc3dpdGNoIChkd0ZsYWdzKSB7CgljYXNlIE1DSV9JTkZPX1BST0RVQ1Q6CgkgICAgc3RyID0gIldpbmUncyBNSURJIHNlcXVlbmNlciI7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9JTkZPX0ZJTEU6CgkgICAgc3RyID0gd21tLT5vcGVuUGFybXMubHBzdHJFbGVtZW50TmFtZTsKCSAgICBicmVhazsKI2lmIDAKCSAgICAvKiBGSVhNRTogdGhlIGZvbGxvd2luZyBtYW5pZmVzdCBjb25zdGFudHMgYXJlIG5vdCBkZWZpbmVkIGluIDxXSU5FPi9pbmNsdWRlL21tc3lzdGVtLmggKi8KCWNhc2UgTUNJX0lORk9fQ09QWVJJR0hUOgoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfSU5GT19OQU1FOgoJICAgIGJyZWFrOwojZW5kaWYKCWRlZmF1bHQ6CgkgICAgV0FSTihtY2ltaWRpLCAiRG9uJ3Qga25vdyB0aGlzIGluZm8gY29tbWFuZCAoJWx1KVxuIiwgZHdGbGFncyk7CgkgICAgcmV0ID0gTUNJRVJSX1VOUkVDT0dOSVpFRF9DT01NQU5EOwoJfQogICAgfQogICAgaWYgKHN0cikgewoJcmV0ID0gTUNJX1dyaXRlU3RyaW5nKGxwUGFybXMtPmxwc3RyUmV0dXJuLCBscFBhcm1zLT5kd1JldFNpemUsIHN0cik7CiAgICB9IGVsc2UgewoJbHBQYXJtcy0+bHBzdHJSZXR1cm5bMF0gPSAwOwogICAgfQogICAgCiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpU2VlawkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVNlZWsoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VFS19QQVJNUyBscFBhcm1zKQp7CiAgICBEV09SRAkJcmV0ID0gMDsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CiAgICAKICAgIFRSQUNFKG1jaW1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAgICAKICAgIGlmIChscFBhcm1zID09IE5VTEwpIHsKCXJldCA9IE1DSUVSUl9OVUxMX1BBUkFNRVRFUl9CTE9DSzsKICAgIH0gZWxzZSBpZiAod21tID09IE5VTEwpIHsKCXJldCA9IE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIH0gZWxzZSB7CglNSURJX21jaVN0b3Aod0RldklELCBNQ0lfV0FJVCwgMCk7CgkKCWlmIChkd0ZsYWdzICYgTUNJX1NFRUtfVE9fU1RBUlQpIHsKCSAgICB3bW0tPmR3UG9zaXRpb25NUyA9IDA7Cgl9IGVsc2UgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VFS19UT19FTkQpIHsKCSAgICB3bW0tPmR3UG9zaXRpb25NUyA9IDB4RkZGRkZGRkY7IC8qIGZpeG1lICovCgl9IGVsc2UgaWYgKGR3RmxhZ3MgJiBNQ0lfVE8pIHsKCSAgICB3bW0tPmR3UG9zaXRpb25NUyA9IE1JRElfQ29udmVydFRpbWVGb3JtYXRUb01TKHdtbSwgbHBQYXJtcy0+ZHdUbyk7Cgl9IGVsc2UgewoJICAgIFdBUk4obWNpbWlkaSwgImR3RmxhZyBkb2Vzbid0IHRlbGwgd2hlcmUgdG8gc2VlayB0by4uLlxuIik7CgkgICAgcmV0dXJuIE1DSUVSUl9NSVNTSU5HX1BBUkFNRVRFUjsKCX0KCQoJVFJBQ0UobWNpbWlkaSwgIlNlZWtpbmcgdG8gcG9zaXRpb249JWx1IG1zXG4iLCB3bW0tPmR3UG9zaXRpb25NUyk7CgkKCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewoJICAgIFRSQUNFKG1jaW1pZGksICJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgkgICAgbWNpRHJpdmVyTm90aWZ5MTYoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAoJCQkgICAgICB3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKCX0KICAgIH0KICAgIHJldHVybiByZXQ7CQp9ICAgIAojZW5kaWYKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSoKICogICAgICAgICAgICAgICAgICAJICAgIE1JREkgZW50cnkgcG9pbnRzIAkJCQkqCiAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1DSU1JRElfRHJpdmVyUHJvYwkgICAgIFtzYW1wbGUgZHJpdmVyXQogKi8KTE9ORyBNQ0lNSURJX0RyaXZlclByb2MoRFdPUkQgZHdEZXZJRCwgSERSVlIxNiBoRHJpdiwgRFdPUkQgd01zZywgCgkJCURXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKewogICAgc3dpdGNoICh3TXNnKSB7CiAgICBjYXNlIERSVl9MT0FEOgkJcmV0dXJuIDE7CiAgICBjYXNlIERSVl9GUkVFOgkJcmV0dXJuIDE7CiAgICBjYXNlIERSVl9PUEVOOgkJcmV0dXJuIDE7CiAgICBjYXNlIERSVl9DTE9TRToJCXJldHVybiAxOwogICAgY2FzZSBEUlZfRU5BQkxFOgkJcmV0dXJuIDE7CiAgICBjYXNlIERSVl9ESVNBQkxFOgkJcmV0dXJuIDE7CiAgICBjYXNlIERSVl9RVUVSWUNPTkZJR1VSRToJcmV0dXJuIDE7CiAgICBjYXNlIERSVl9DT05GSUdVUkU6CQlNZXNzYWdlQm94QSgwLCAiU2FtcGxlIE1pZGkgTGludXggRHJpdmVyICEiLCAiTU1MaW51eCBEcml2ZXIiLCBNQl9PSyk7IHJldHVybiAxOwogICAgY2FzZSBEUlZfSU5TVEFMTDoJCXJldHVybiBEUlZDTkZfUkVTVEFSVDsKICAgIGNhc2UgRFJWX1JFTU9WRToJCXJldHVybiBEUlZDTkZfUkVTVEFSVDsKI2lmZGVmIFNORENUTF9NSURJX0lORk8KICAgIGNhc2UgTUNJX09QRU5fRFJJVkVSOglyZXR1cm4gTUlESV9tY2lPcGVuICAgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfT1BFTl9QQVJNU0EpICAgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9DTE9TRV9EUklWRVI6CXJldHVybiBNSURJX21jaUNsb3NlICAgICAoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9HRU5FUklDX1BBUk1TKSAgIGR3UGFyYW0yKTsKICAgIGNhc2UgTUNJX1BMQVk6CQlyZXR1cm4gTUlESV9tY2lQbGF5ICAgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfUExBWV9QQVJNUykgICAgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9SRUNPUkQ6CQlyZXR1cm4gTUlESV9tY2lSZWNvcmQgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfUkVDT1JEX1BBUk1TKSAgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9TVE9QOgkJcmV0dXJuIE1JRElfbWNpU3RvcCAgICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX0dFTkVSSUNfUEFSTVMpICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfU0VUOgkJcmV0dXJuIE1JRElfbWNpU2V0ICAgICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX1NFVF9QQVJNUykgICAgICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfUEFVU0U6CQlyZXR1cm4gTUlESV9tY2lQYXVzZSAgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VORVJJQ19QQVJNUykgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9SRVNVTUU6CQlyZXR1cm4gTUlESV9tY2lSZXN1bWUgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VORVJJQ19QQVJNUykgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9TVEFUVVM6CQlyZXR1cm4gTUlESV9tY2lTdGF0dXMgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfU1RBVFVTX1BBUk1TKSAgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9HRVRERVZDQVBTOglyZXR1cm4gTUlESV9tY2lHZXREZXZDYXBzKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VUREVWQ0FQU19QQVJNUylkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9JTkZPOgkJcmV0dXJuIE1JRElfbWNpSW5mbyAgICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX0lORk9fUEFSTVNBKSAgICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfU0VFSzoJCXJldHVybiBNSURJX21jaVNlZWsgICAgICAoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9TRUVLX1BBUk1TKSAgICAgIGR3UGFyYW0yKTsKI2Vsc2UKICAgIGNhc2UgTUNJX09QRU5fRFJJVkVSOgogICAgY2FzZSBNQ0lfQ0xPU0VfRFJJVkVSOgogICAgY2FzZSBNQ0lfUExBWToKICAgIGNhc2UgTUNJX1JFQ09SRDoKICAgIGNhc2UgTUNJX1NUT1A6CiAgICBjYXNlIE1DSV9TRVQ6CiAgICBjYXNlIE1DSV9QQVVTRToKICAgIGNhc2UgTUNJX1JFU1VNRToKICAgIGNhc2UgTUNJX1NUQVRVUzoKICAgIGNhc2UgTUNJX0dFVERFVkNBUFM6CiAgICBjYXNlIE1DSV9JTkZPOgogICAgY2FzZSBNQ0lfU0VFSzoKI2VuZGlmCiAgICBjYXNlIE1DSV9MT0FEOgkJCiAgICBjYXNlIE1DSV9TQVZFOgkJCiAgICBjYXNlIE1DSV9GUkVFWkU6CQkKICAgIGNhc2UgTUNJX1BVVDoJCQogICAgY2FzZSBNQ0lfUkVBTElaRToJCQogICAgY2FzZSBNQ0lfVU5GUkVFWkU6CQkKICAgIGNhc2UgTUNJX1VQREFURToJCQogICAgY2FzZSBNQ0lfV0hFUkU6CQkKICAgIGNhc2UgTUNJX1dJTkRPVzoJCQogICAgY2FzZSBNQ0lfU1RFUDoJCQogICAgY2FzZSBNQ0lfU1BJTjoJCQogICAgY2FzZSBNQ0lfRVNDQVBFOgkJCiAgICBjYXNlIE1DSV9DT1BZOgkJCiAgICBjYXNlIE1DSV9DVVQ6CQkKICAgIGNhc2UgTUNJX0RFTEVURToJCQogICAgY2FzZSBNQ0lfUEFTVEU6CQkKCVdBUk4obWNpbWlkaSwgIlVuc3VwcG9ydGVkIGNvbW1hbmQ9JXNcbiIsIE1DSV9Db21tYW5kVG9TdHJpbmcod01zZykpOwoJYnJlYWs7CiAgICBjYXNlIE1DSV9PUEVOOgogICAgY2FzZSBNQ0lfQ0xPU0U6CglGSVhNRShtY2ltaWRpLCAiU2hvdWxkbid0IHJlY2VpdmUgYSBNQ0lfT1BFTiBvciBDTE9TRSBtZXNzYWdlXG4iKTsKCWJyZWFrOwogICAgZGVmYXVsdDoJCQkKCVRSQUNFKG1jaW1pZGksICJTZW5kaW5nIG1zZz0lcyB0byBkZWZhdWx0IGRyaXZlciBwcm9jXG4iLCBNQ0lfQ29tbWFuZFRvU3RyaW5nKHdNc2cpKTsKCXJldHVybiBEZWZEcml2ZXJQcm9jKGR3RGV2SUQsIGhEcml2LCB3TXNnLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogICAgfQogICAgcmV0dXJuIE1DSUVSUl9VTlJFQ09HTklaRURfQ09NTUFORDsKfQoKICAgIAo=