LyogLSotIHRhYi13aWR0aDogODsgYy1iYXNpYy1vZmZzZXQ6IDQgLSotICovCgovKgogKiBTYW1wbGUgTUlESSBXaW5lIERyaXZlciBmb3IgTGludXgKICoKICogQ29weXJpZ2h0IDE5OTQgTWFydGluIEF5b3R0ZQogKi8KCi8qIAogKiBFcmljIFBPVUVDSCA6IAogKiA5OC83IGNoYW5nZXMgZm9yIG1ha2luZyB0aGlzIE1JREkgZHJpdmVyIHdvcmsgb24gT1NTCiAqIAljdXJyZW50IHN1cHBvcnQgaXMgbGltaXRlZCB0byBNSURJIHBvcnRzIG9mIE9TUyBzeXN0ZW1zCiAqIDk4LzkJcmV3cml0aW5nIE1DSSBjb2RlIGZvciBNSURJCiAqIDk4LzExIHNwbGl0dGVkIGluIG1pZGkuYyBhbmQgbWNpbWlkaS5jCiAqLwoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAibXVsdGltZWRpYS5oIgojaW5jbHVkZSAidXNlci5oIgojaW5jbHVkZSAiZHJpdmVyLmgiCiNpbmNsdWRlICJoZWFwLmgiCiNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCgpERUZBVUxUX0RFQlVHX0NIQU5ORUwobWNpbWlkaSkKCnR5cGVkZWYgc3RydWN0IHsKICAgIERXT1JECQlkd0ZpcnN0OwkJLyogb2Zmc2V0IGluIGZpbGUgb2YgdHJhY2sgKi8KICAgIERXT1JECQlkd0xhc3Q7CQkJLyogbnVtYmVyIG9mIGJ5dGVzIGluIGZpbGUgb2YgdHJhY2sgKi8KICAgIERXT1JECQlkd0luZGV4OwkJLyogY3VycmVudCBpbmRleCBpbiBmaWxlIChkd0ZpcnN0IDw9IGR3SW5kZXggPCBkd0xhc3QpICovCiAgICBEV09SRAkJZHdMZW5ndGg7CQkvKiBudW1iZXIgb2YgcHVsc2VzIGluIHRoaXMgdHJhY2sgKi8KICAgIERXT1JECQlkd0V2ZW50UHVsc2U7CQkvKiBjdXJyZW50IHB1bHNlICMgKGV2ZW50KSBwb2ludGVkIGJ5IGR3SW5kZXggKi8KICAgIERXT1JECQlkd0V2ZW50RGF0YTsJCS8qIGN1cnJlbnQgZGF0YSAgICAoZXZlbnQpIHBvaW50ZWQgYnkgZHdJbmRleCAqLwogICAgV09SRAkJd0V2ZW50TGVuZ3RoOwkJLyogY3VycmVudCBsZW5ndGggIChldmVudCkgcG9pbnRlZCBieSBkd0luZGV4ICovCiAgICBXT1JECQl3U3RhdHVzIDogMSwJCS8qIDEgOiBwbGF5aW5nLCAwIDogZG9uZSAqLwoJICAgICAgICAgICAgICAgIHdUcmFja05yIDogNywKCSAgICAgICAgICAgICAgICB3TGFzdENvbW1hbmQgOiA4Owp9IE1DSV9NSURJVFJBQ0s7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBVSU5UMTYJCXdEZXZJRDsKICAgIFVJTlQxNgkJd01pZGlJRDsKICAgIGludAkJCW5Vc2VDb3VudDsgICAgICAgICAgCS8qIEluY3JlbWVudGVkIGZvciBlYWNoIHNoYXJlZCBvcGVuICAgICAgICAgICovCiAgICBXT1JECQl3Tm90aWZ5RGV2aWNlSUQ7ICAgIAkvKiBNQ0kgZGV2aWNlIElEIHdpdGggYSBwZW5kaW5nIG5vdGlmaWNhdGlvbiAqLwogICAgSEFORExFMTYgCQloQ2FsbGJhY2s7ICAgICAgICAgCS8qIENhbGxiYWNrIGhhbmRsZSBmb3IgcGVuZGluZyBub3RpZmljYXRpb24gICovCiAgICBITU1JTwkJaEZpbGU7CSAgICAgICAgICAgIAkvKiBtbWlvIGZpbGUgaGFuZGxlIG9wZW4gYXMgRWxlbWVudCAgICAgICAgICAqLwogICAgTUNJX09QRU5fUEFSTVNBIAlvcGVuUGFybXM7CiAgICBITE9DQUwxNgkJaE1pZGlIZHI7CiAgICBXT1JECQlkd1N0YXR1czsJCS8qIG9uZSBmcm9tIE1DSV9NT0RFX3h4eHggKi8KICAgIERXT1JECQlkd01jaVRpbWVGb3JtYXQ7CS8qIE9uZSBvZiB0aGUgc3VwcG9ydGVkIE1DSV9GT1JNQVRfeHh4eCAqLwkgICAgICAgCiAgICBXT1JECQl3Rm9ybWF0OwkJLyogRm9ybWF0IG9mIE1JREkgaEZpbGUgKDAsIDEgb3IgMikgKi8KICAgIFdPUkQJCW5UcmFja3M7CQkvKiBOdW1iZXIgb2YgdHJhY2tzIGluIGhGaWxlICovCiAgICBXT1JECQluRGl2aXNpb247CQkvKiBOdW1iZXIgb2YgZGl2aXNpb24gaW4gaEZpbGUgUFBRTiBvciBTTVBURSAqLwogICAgV09SRAkJd1N0YXJ0ZWRQbGF5aW5nOwogICAgRFdPUkQJCWR3VGVtcG87CQkvKiBUZW1wbyAoIyBvZiAxLzQgbm90ZSBwZXIgc2Vjb25kICovCiAgICBNQ0lfTUlESVRSQUNLKiAgICAgCXRyYWNrczsJCQkvKiBDb250ZW50IG9mIGVhY2ggdHJhY2sgKi8KICAgIERXT1JECQlkd1B1bHNlOwkJCiAgICBEV09SRAkJZHdQb3NpdGlvbk1TOwogICAgRFdPUkQJCWR3U3RhcnRUaWNrczsKfSBXSU5FX01DSU1JREk7CgojZGVmaW5lIE1BWF9NQ0lNSURJRFJWIAkoMSkKc3RhdGljIFdJTkVfTUNJTUlESQlNQ0lNaWRpRGV2W01BWF9NQ0lNSURJRFJWXTsKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSoKICogICAgICAgICAgICAgICAgICAJICAgIE1DSSBNSURJIGltcGxlbWFudGF0aW9uCQkJKgogKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKI2lmZGVmIFNORENUTF9NSURJX0lORk8KCnN0YXRpYyBEV09SRCBNSURJX21jaVJlc3VtZShVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX2RydkdldERydgkJW2ludGVybmFsXQkKICovCnN0YXRpYyBXSU5FX01DSU1JREkqICBNSURJX2RydkdldERydihVSU5UMTYgd0RldklEKQp7CiAgICBpbnQJaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01DSU1JRElEUlY7IGkrKykgewoJaWYgKE1DSU1pZGlEZXZbaV0ud0RldklEID09IHdEZXZJRCkgewoJICAgIHJldHVybiAmTUNJTWlkaURldltpXTsKCX0KICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfZHJ2T3BlbgkJCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMJRFdPUkQJTUlESV9kcnZPcGVuKExQU1RSIHN0ciwgTFBNQ0lfT1BFTl9EUklWRVJfUEFSTVNBIG1vZHApCnsKICAgIGludAlpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUNJTUlESURSVjsgaSsrKSB7CglpZiAoTUNJTWlkaURldltpXS53RGV2SUQgPT0gMCkgewoJICAgIE1DSU1pZGlEZXZbaV0ud0RldklEID0gbW9kcC0+d0RldmljZUlEOwoJICAgIG1vZHAtPndDdXN0b21Db21tYW5kVGFibGUgPSAtMTsKCSAgICBtb2RwLT53VHlwZSA9IE1DSV9ERVZUWVBFX0NEX0FVRElPOwoJICAgIHJldHVybiBtb2RwLT53RGV2aWNlSUQ7Cgl9CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNQ0lNSURJX2RydkNsb3NlCQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljCURXT1JECU1JRElfZHJ2Q2xvc2UoRFdPUkQgZHdEZXZJRCkKewogICAgV0lORV9NQ0lNSURJKiAgd21tID0gTUlESV9kcnZHZXREcnYoZHdEZXZJRCk7CgogICAgaWYgKHdtbSkgewoJd21tLT53RGV2SUQgPSAwOwoJcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaUdldE9wZW5EZXYJCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMgV0lORV9NQ0lNSURJKiAgTUlESV9tY2lHZXRPcGVuRGV2KFVJTlQxNiB3RGV2SUQpCnsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9kcnZHZXREcnYod0RldklEKTsKICAgIAogICAgaWYgKHdtbSA9PSBOVUxMIHx8IHdtbS0+blVzZUNvdW50ID09IDApIHsKCVdBUk4oIkludmFsaWQgd0RldklEPSV1XG4iLCB3RGV2SUQpOwoJcmV0dXJuIDA7CiAgICB9CiAgICByZXR1cm4gd21tOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVhZEJ5dGUJCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lSZWFkQnl0ZShXSU5FX01DSU1JREkqIHdtbSwgQllURSAqbHBieXQpCnsKICAgIERXT1JECXJldCA9IDA7CiAgICAKICAgIGlmIChscGJ5dCA9PSBOVUxMIHx8IAoJbW1pb1JlYWQod21tLT5oRmlsZSwgKEhQU1RSKWxwYnl0LCAobG9uZylzaXplb2YoQllURSkpICE9IChsb25nKXNpemVvZihCWVRFKSkgewoJV0FSTigiRXJyb3IgcmVhZGluZyB3bW09JXBcbiIsIHdtbSk7CglyZXQgPSBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgfQogICAgCiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVhZFdvcmQJCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lSZWFkV29yZChXSU5FX01DSU1JREkqIHdtbSwgTFBXT1JEIGxwdykKewogICAgQllURQloaWJ5dGUsIGxvYnl0ZTsKICAgIERXT1JECXJldCA9IE1DSUVSUl9JTlZBTElEX0ZJTEU7CiAgICAKICAgIGlmIChscHcgIT0gTlVMTCAmJiAKCU1JRElfbWNpUmVhZEJ5dGUod21tLCAmaGlieXRlKSA9PSAwICYmIAoJTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZsb2J5dGUpID09IDApIHsKCSpscHcgPSAoKFdPUkQpaGlieXRlIDw8IDgpICsgbG9ieXRlOwoJcmV0ID0gMDsKICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lSZWFkTG9uZwkJW2ludGVybmFsXQkKICovCnN0YXRpYyBEV09SRCBNSURJX21jaVJlYWRMb25nKFdJTkVfTUNJTUlESSogd21tLCBMUERXT1JEIGxwZHcpCnsKICAgIFdPUkQJaGl3b3JkLCBsb3dvcmQ7CiAgICBEV09SRAlyZXQgPSBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgCiAgICBpZiAobHBkdyAhPSBOVUxMICYmCglNSURJX21jaVJlYWRXb3JkKHdtbSwgJmhpd29yZCkgPT0gMCAmJgoJTUlESV9tY2lSZWFkV29yZCh3bW0sICZsb3dvcmQpID09IDApIHsKCSpscGR3ID0gTUFLRUxPTkcobG93b3JkLCBoaXdvcmQpOwoJcmV0ID0gMDsKICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgCQkJCU1JRElfbWNpUmVhZFZhcnlMZW4JCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMgV09SRCBNSURJX21jaVJlYWRWYXJ5TGVuKFdJTkVfTUNJTUlESSogd21tLCBMUERXT1JEIGxwZHcpCnsKICAgIEJZVEUJYnl0ZTsKICAgIERXT1JECXZhbHVlID0gMDsKICAgIFdPUkQJcmV0ID0gMDsKICAgIAogICAgaWYgKGxwZHcgPT0gTlVMTCkgewoJcmV0ID0gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0gZWxzZSB7CglkbyB7CgkgICAgaWYgKE1JRElfbWNpUmVhZEJ5dGUod21tLCAmYnl0ZSkgIT0gMCkgewoJCXJldHVybiAwOwoJICAgIH0KCSAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA3KSArIChieXRlICYgMHg3Rik7CgkgICAgcmV0Kys7IAoJfSB3aGlsZSAoYnl0ZSAmIDB4ODApOwoJKmxwZHcgPSB2YWx1ZTsKCS8qCgkgIFRSQUNFKCJ2YWw9JTA4bFggXG4iLCB2YWx1ZSk7CgkqLwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVJlYWROZXh0RXZlbnQJCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMgRFdPUkQJTUlESV9tY2lSZWFkTmV4dEV2ZW50KFdJTkVfTUNJTUlESSogd21tLCBNQ0lfTUlESVRSQUNLKiBtbXQpIAp7CiAgICBCWVRFCWIxLCBiMiA9IDAsIGIzOwogICAgV09SRAlodyA9IDA7CiAgICBEV09SRAlldnRQdWxzZTsKICAgIERXT1JECWV2dExlbmd0aDsKICAgIERXT1JECXRtcDsKICAgIAogICAgaWYgKG1taW9TZWVrKHdtbS0+aEZpbGUsIG1tdC0+ZHdJbmRleCwgU0VFS19TRVQpICE9IG1tdC0+ZHdJbmRleCkgewoJV0FSTigiQ2FuJ3Qgc2VlayBhdCAlMDhsWCBcbiIsIG1tdC0+ZHdJbmRleCk7CglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0KICAgIGV2dExlbmd0aCA9IE1JRElfbWNpUmVhZFZhcnlMZW4od21tLCAmZXZ0UHVsc2UpICsgMTsJLyogPiAwICovCiAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmIxKTsKICAgIHN3aXRjaCAoYjEpIHsKICAgIGNhc2UgMHhGMDoKICAgIGNhc2UgMHhGNzoKCWV2dExlbmd0aCArPSBNSURJX21jaVJlYWRWYXJ5TGVuKHdtbSwgJnRtcCk7CglldnRMZW5ndGggKz0gdG1wOwoJYnJlYWs7CiAgICBjYXNlIDB4RkY6CglNSURJX21jaVJlYWRCeXRlKHdtbSwgJmIyKTsJZXZ0TGVuZ3RoKys7CgkKCWV2dExlbmd0aCArPSBNSURJX21jaVJlYWRWYXJ5TGVuKHdtbSwgJnRtcCk7CglpZiAoZXZ0TGVuZ3RoID49IDB4MTAwMDB1KSB7CgkgICAgLyogdGhpcyBsaW1pdGF0aW9uIHNob3VsZG4ndCBiZSBhIHByb2JsZW0gKi8KCSAgICBXQVJOKCJPdWNoICEhIEltcGxlbWVudGF0aW9uIGxpbWl0YXRpb24gdG8gNjRrIGJ5dGVzIGZvciBhIE1JREkgZXZlbnQgaXMgb3ZlcmZsb3dlZFxuIik7CgkgICAgaHcgPSAweEZGRkY7Cgl9IGVsc2UgewoJICAgIGh3ID0gTE9XT1JEKGV2dExlbmd0aCk7Cgl9CglldnRMZW5ndGggKz0gdG1wOwoJYnJlYWs7CiAgICBkZWZhdWx0OgoJaWYgKGIxICYgMHg4MCkgeyAvKiB1c2UgcnVubmluZyBzdGF0dXMgPyAqLwoJICAgIG1tdC0+d0xhc3RDb21tYW5kID0gYjE7CgkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZiMik7CWV2dExlbmd0aCsrOwoJfSBlbHNlIHsKCSAgICBiMiA9IGIxOwoJICAgIGIxID0gbW10LT53TGFzdENvbW1hbmQ7Cgl9Cglzd2l0Y2ggKChiMSA+PiA0KSAmIDB4MDcpIHsKCWNhc2UgMDoJY2FzZSAxOgljYXNlIDI6IGNhc2UgMzogY2FzZSA2OgoJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmYjMpOwlldnRMZW5ndGgrKzsKCSAgICBodyA9IGIzOwoJICAgIGJyZWFrOwoJY2FzZSA0OgljYXNlIDU6CgkgICAgYnJlYWs7CgljYXNlIDc6CgkgICAgV0FSTigiU3RyYW5nZSBpbmRlZWQgYjE9MHglMDJ4XG4iLCBiMSk7Cgl9CglicmVhazsKICAgIH0KICAgIGlmIChtbXQtPmR3SW5kZXggKyBldnRMZW5ndGggPiBtbXQtPmR3TGFzdCkKCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAgICAKICAgIG1tdC0+ZHdFdmVudFB1bHNlICs9IGV2dFB1bHNlOwogICAgbW10LT5kd0V2ZW50RGF0YSAgID0gKGh3IDw8IDE2KSArIChiMiA8PCA4KSArIGIxOwogICAgbW10LT53RXZlbnRMZW5ndGggID0gZXZ0TGVuZ3RoOwogICAgCiAgICAvKgogICAgICBUUkFDRSgiWyV1XSA9PiBwdWxzZT0lMDhseCglMDhseCksIGRhdGE9JTA4bHgsIGxlbmd0aD0ldVxuIiwgCiAgICAgIG1tdC0+d1RyYWNrTnIsIG1tdC0+ZHdFdmVudFB1bHNlLCBldnRQdWxzZSwgCiAgICAgIG1tdC0+ZHdFdmVudERhdGEsIG1tdC0+d0V2ZW50TGVuZ3RoKTsKICAgICovCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVJlYWRNVHJrCQlbaW50ZXJuYWxdCQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpUmVhZE1UcmsoV0lORV9NQ0lNSURJKiB3bW0sIE1DSV9NSURJVFJBQ0sqIG1tdCkKewogICAgRFdPUkQJCXRvYmVyZWFkOwogICAgRk9VUkNDCQlmb3VyY2M7CiAgICAKICAgIGlmIChtbWlvUmVhZCh3bW0tPmhGaWxlLCAoSFBTVFIpJmZvdXJjYywgKGxvbmcpc2l6ZW9mKEZPVVJDQykpICE9IAoJKGxvbmcpc2l6ZW9mKEZPVVJDQykpIHsKCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgfQogICAgCiAgICBpZiAoZm91cmNjICE9IG1taW9GT1VSQ0MoJ00nLCAnVCcsICdyJywgJ2snKSkgewoJV0FSTigiQ2FuJ3Qgc3luY2hyb25pemUgb24gJ01UcmsnICFcbiIpOwoJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7CiAgICB9CiAgICAKICAgIGlmIChNSURJX21jaVJlYWRMb25nKHdtbSwgJnRvYmVyZWFkKSAhPSAwKSB7CglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0KICAgIG1tdC0+ZHdGaXJzdCA9IG1taW9TZWVrKHdtbS0+aEZpbGUsIDAsIFNFRUtfQ1VSKTsgLyogPj0gMCAqLwogICAgbW10LT5kd0xhc3QgPSBtbXQtPmR3Rmlyc3QgKyB0b2JlcmVhZDsKICAgIAogICAgLyogY29tcHV0ZSAjIG9mIHB1bHNlcyBpbiB0aGlzIHRyYWNrICovCiAgICBtbXQtPmR3SW5kZXggPSBtbXQtPmR3Rmlyc3Q7CiAgICBtbXQtPmR3RXZlbnRQdWxzZSA9IDA7CiAgICAKICAgIHdoaWxlIChNSURJX21jaVJlYWROZXh0RXZlbnQod21tLCBtbXQpID09IDAgJiYgCgkgICBMT1dPUkQobW10LT5kd0V2ZW50RGF0YSkgIT0gMHgyRkZGKSB7CQoJbW10LT5kd0luZGV4ICs9IG1tdC0+d0V2ZW50TGVuZ3RoOwogICAgfQogICAgbW10LT5kd0xlbmd0aCA9IG1tdC0+ZHdFdmVudFB1bHNlOwogICAgCiAgICBUUkFDRSgiVHJhY2sgJXUgaGFzICVsdSBieXRlcyBhbmQgJWx1IHB1bHNlc1xuIiwgbW10LT53VHJhY2tOciwgdG9iZXJlYWQsIG1tdC0+ZHdMZW5ndGgpOwogICAgCiAgICAvKiByZXNldCB0cmFjayBkYXRhICovCiAgICBtbXQtPndTdGF0dXMgPSAxOwkvKiBvaywgcGxheWluZyAqLwogICAgbW10LT5kd0luZGV4ID0gbW10LT5kd0ZpcnN0OwogICAgbW10LT5kd0V2ZW50UHVsc2UgPSAwOwogICAgCiAgICBpZiAobW1pb1NlZWsod21tLT5oRmlsZSwgMCwgU0VFS19DVVIpICE9IG1tdC0+ZHdMYXN0KSB7CglXQVJOKCJPdWNoLCBvdXQgb2Ygc3luYyBzZWVrPSVsdSB0cmFjaz0lbHVcbiIsIAoJICAgICBtbWlvU2Vlayh3bW0tPmhGaWxlLCAwLCBTRUVLX0NVUiksIG1tdC0+ZHdMYXN0KTsKCS8qIHBvc2l0aW9uIGF0IGVuZCBvZiB0aGlzIHRyYWNrLCB0byBiZSByZWFkeSB0byByZWFkIG5leHQgdHJhY2sgKi8KCW1taW9TZWVrKHdtbS0+aEZpbGUsIG1tdC0+ZHdMYXN0LCBTRUVLX1NFVCk7CiAgICB9CiAgICAKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVhZE1UaGQJCVtpbnRlcm5hbF0JCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lSZWFkTVRoZChXSU5FX01DSU1JREkqIHdtbSwgRFdPUkQgZHdPZmZzZXQpCnsKICAgIERXT1JECXRvYmVyZWFkOwogICAgRk9VUkNDCWZvdXJjYzsKICAgIFdPUkQJbnQ7CiAgICAKICAgIFRSQUNFKCIoJXAsICUwOGxYKTtcbiIsIHdtbSwgZHdPZmZzZXQpOwogICAgCiAgICBpZiAobW1pb1NlZWsod21tLT5oRmlsZSwgZHdPZmZzZXQsIFNFRUtfU0VUKSAhPSBkd09mZnNldCkgewoJV0FSTigiQ2FuJ3Qgc2VlayBhdCAlMDhsWCBiZWdpbiBvZiAnTVRoZCcgXG4iLCBkd09mZnNldCk7CglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0KICAgIGlmIChtbWlvUmVhZCh3bW0tPmhGaWxlLCAoSFBTVFIpJmZvdXJjYywKCQkgICAobG9uZykgc2l6ZW9mKEZPVVJDQykpICE9IChsb25nKSBzaXplb2YoRk9VUkNDKSkKCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgCiAgICBpZiAoZm91cmNjICE9IG1taW9GT1VSQ0MoJ00nLCAnVCcsICdoJywgJ2QnKSkgewoJV0FSTigiQ2FuJ3Qgc3luY2hyb25pemUgb24gJ01UaGQnICFcbiIpOwoJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7CiAgICB9CiAgICAKICAgIGlmIChNSURJX21jaVJlYWRMb25nKHdtbSwgJnRvYmVyZWFkKSAhPSAwIHx8IHRvYmVyZWFkIDwgMyAqIHNpemVvZihXT1JEKSkKCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgCiAgICBpZiAoTUlESV9tY2lSZWFkV29yZCh3bW0sICZ3bW0tPndGb3JtYXQpICE9IDAgfHwKCU1JRElfbWNpUmVhZFdvcmQod21tLCAmd21tLT5uVHJhY2tzKSAhPSAwIHx8CglNSURJX21jaVJlYWRXb3JkKHdtbSwgJndtbS0+bkRpdmlzaW9uKSAhPSAwKSB7CglyZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKICAgIH0KICAgIAogICAgVFJBQ0UoInRvYmVyZWFkPTB4JTA4bFgsIHdGb3JtYXQ9MHglMDRYIG5UcmFja3M9MHglMDRYIG5EaXZpc2lvbj0weCUwNFhcbiIsCgkgIHRvYmVyZWFkLCB3bW0tPndGb3JtYXQsIHdtbS0+blRyYWNrcywgd21tLT5uRGl2aXNpb24pOwogICAgCiAgICAvKiBNUyBkb2Mgc2F5cyB0aGF0IHRoZSBNSURJIE1DSSB0aW1lIGZvcm1hdCBtdXN0IGJlIHB1dCBieSBkZWZhdWx0IHRvIHRoZSBmb3JtYXQKICAgICAqIHN0b3JlZCBpbiB0aGUgTUlESSBmaWxlLi4uCiAgICAgKi8KICAgIGlmICh3bW0tPm5EaXZpc2lvbiA+IDB4ODAwMCkgewoJLyogZXJpYy5wb3VlY2hAbGVtZWwuZnIgOTgvMTEKCSAqIEluIGRpZCBub3QgY2hlY2sgdGhpcyB2ZXJ5IGNvZGUgKHB1bHNlcyBhcmUgZXhwcmVzc2VkIGFzIFNNUFRFIHN1Yi1mcmFtZXMpLgoJICogSW4gYWJvdXQgNDAgTUIgb2YgTUlESSBmaWxlcyBJIGhhdmUsIG5vbmUgd2FzIFNNUFRFIGJhc2VkLi4uCgkgKiBJJ20ganVzdCB3b25kZXJpbmcgaWYgdGhpcyBpcyB3aWRlbHkgdXNlZCA6LSkuIFNvLCBpZiBzb21lb25lIGhhcyBvbmUgb2YgCgkgKiB0aGVzZSBmaWxlcywgSSdkIGxpa2UgdG8ga25vdyBhYm91dC4KCSAqLwoJRklYTUUoIkhhbmRsaW5nIFNNUFRFIHRpbWUgaW4gTUlESSBmaWxlcyBoYXMgbm90IGJlZW4gdGVzdGVkXG4iCgkgICAgICAiUGxlYXNlIHJlcG9ydCB0byBjb21wLmVtdWxhdG9ycy5tcy13aW5kb3dzLndpbmUgd2l0aCBNSURJIGZpbGUgIVxuIik7CgkKCXN3aXRjaCAoSElCWVRFKHdtbS0+bkRpdmlzaW9uKSkgewoJY2FzZSAweEU4Ogl3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfU01QVEVfMjQ7CWJyZWFrOwkvKiAtMjQgKi8KCWNhc2UgMHhFNzoJd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1NNUFRFXzI1OwlicmVhazsJLyogLTI1ICovCgljYXNlIDB4RTM6CXdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9TTVBURV8zMERST1A7CWJyZWFrOwkvKiAtMjkgKi8gLyogaXMgdGhlIE1DSSBjb25zdGFudCBjb3JyZWN0ID8gKi8KCWNhc2UgMHhFMjoJd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1NNUFRFXzMwOwlicmVhazsJLyogLTMwICovCglkZWZhdWx0OgoJICAgIFdBUk4oIlVuc3VwcG9ydGVkIG51bWJlciBvZiBmcmFtZXMgJWRcbiIsIC0oY2hhcilISUJZVEUod21tLT5uRGl2aXNpb24pKTsKCSAgICByZXR1cm4gTUNJRVJSX0lOVkFMSURfRklMRTsKCX0KCXN3aXRjaCAoTE9CWVRFKHdtbS0+bkRpdmlzaW9uKSkgewoJY2FzZSA0OgkvKiBNSURJIFRpbWUgQ29kZSAqLwoJY2FzZSA4OgoJY2FzZSAxMDoKCWNhc2UgODA6IC8qIFNNUFRFIGJpdCByZXNvbHV0aW9uICovCgljYXNlIDEwMDoKCWRlZmF1bHQ6CgkgICAgV0FSTigiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHN1Yi1mcmFtZXMgJWRcbiIsIExPQllURSh3bW0tPm5EaXZpc2lvbikpOwoJICAgIHJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwoJfQogICAgfSBlbHNlIGlmICh3bW0tPm5EaXZpc2lvbiA9PSAwKSB7CglXQVJOKCJOdW1iZXIgb2YgZGl2aXNpb24gaXMgMCwgY2FuJ3Qgc3VwcG9ydCB0aGF0ICEhXG4iKTsKCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwogICAgfSBlbHNlIHsKCXdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM7CiAgICB9CiAgICAKICAgIHN3aXRjaCAod21tLT53Rm9ybWF0KSB7CiAgICBjYXNlIDA6CglpZiAod21tLT5uVHJhY2tzICE9IDEpIHsKCSAgICBXQVJOKCJHb3QgdHlwZSAwIGZpbGUgd2hvc2UgbnVtYmVyIG9mIHRyYWNrIGlzIG5vdCAxLiBTZXR0aW5nIGl0IHRvIDFcbiIpOwoJICAgIHdtbS0+blRyYWNrcyA9IDE7Cgl9CglicmVhazsKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKCWJyZWFrOwogICAgZGVmYXVsdDoKCVdBUk4oIkhhbmRsaW5nIE1JREkgZmlsZXMgd2hpY2ggZm9ybWF0ID0gJWQgaXMgbm90ICh5ZXQpIHN1cHBvcnRlZFxuIgoJICAgICAiUGxlYXNlIHJlcG9ydCB3aXRoIE1JREkgZmlsZSAhXG4iLCB3bW0tPndGb3JtYXQpOwoJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0ZJTEU7CiAgICB9CiAgICAKICAgIGlmICh3bW0tPm5UcmFja3MgJiAweDgwMDApIHsKCS8qIHRoaXMgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4uLiAqLwoJV0FSTigiT3VjaCAhISBJbXBsZW1lbnRhdGlvbiBsaW1pdGF0aW9uIHRvIDMyayB0cmFja3MgcGVyIE1JREkgZmlsZSBpcyBvdmVyZmxvd2VkXG4iKTsKCXdtbS0+blRyYWNrcyA9IDB4N0ZGRjsKICAgIH0KICAgIAogICAgaWYgKCh3bW0tPnRyYWNrcyA9IG1hbGxvYyhzaXplb2YoTUNJX01JRElUUkFDSykgKiB3bW0tPm5UcmFja3MpKSA9PSBOVUxMKSB7CglyZXR1cm4gTUNJRVJSX09VVF9PRl9NRU1PUlk7CiAgICB9CiAgICAKICAgIHRvYmVyZWFkIC09IDMgKiBzaXplb2YoV09SRCk7IAogICAgaWYgKHRvYmVyZWFkID4gMCkgewoJVFJBQ0UoIlNpemUgb2YgTVRoZCA+IDYsIHNraXBwaW5nICVsZCBleHRyYSBieXRlc1xuIiwgdG9iZXJlYWQpOwoJbW1pb1NlZWsod21tLT5oRmlsZSwgdG9iZXJlYWQsIFNFRUtfQ1VSKTsKICAgIH0KICAgIAogICAgZm9yIChudCA9IDA7IG50IDwgd21tLT5uVHJhY2tzOyBudCsrKSB7Cgl3bW0tPnRyYWNrc1tudF0ud1RyYWNrTnIgPSBudDsKCWlmIChNSURJX21jaVJlYWRNVHJrKHdtbSwgJndtbS0+dHJhY2tzW250XSkgIT0gMCkgewoJICAgIFdBUk4oIkNhbid0IHJlYWQgJ01UcmsnIGhlYWRlciBcbiIpOwoJICAgIHJldHVybiBNQ0lFUlJfSU5WQUxJRF9GSUxFOwoJfQogICAgfQogICAgCiAgICB3bW0tPmR3VGVtcG8gPSA1MDAwMDA7CiAgICAKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJTUlESV9Db252ZXJ0UHVsc2VUb01TCQkJW2ludGVybmFsXQogKi8Kc3RhdGljCURXT1JECU1JRElfQ29udmVydFB1bHNlVG9NUyhXSU5FX01DSU1JREkqIHdtbSwgRFdPUkQgcHVsc2UpCnsKICAgIERXT1JECXJldCA9IDA7CiAgICAKICAgIC8qIEZJWE1FOiB0aGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gZmFsc2UgdmFsdWVzIHNpbmNlIHRoZSB0ZW1wbyAod21tLT5kd1RlbXBvKQogICAgICogbWF5IGNoYW5nZSBkdXJpbmcgZmlsZSBwbGF5aW5nCiAgICAgKi8KICAgIGlmICh3bW0tPm5EaXZpc2lvbiA9PSAwKSB7CglGSVhNRSgiU2hvdWxkbid0IGhhcHBlbi4gd21tLT5uRGl2aXNpb24gPSAwXG4iKTsKICAgIH0gZWxzZSBpZiAod21tLT5uRGl2aXNpb24gPiAweDgwMDApIHsgLyogU01QVEUsIHVuY2hlY2tlZCBGSVhNRT8gKi8KCWludAluZiA9IC0oY2hhcilISUJZVEUod21tLT5uRGl2aXNpb24pOwkvKiBudW1iZXIgb2YgZnJhbWVzICAgICAqLwoJaW50CW5zZiA9IExPQllURSh3bW0tPm5EaXZpc2lvbik7CQkvKiBudW1iZXIgb2Ygc3ViLWZyYW1lcyAqLwoJcmV0ID0gKHB1bHNlICogMTAwMCkgLyAobmYgKiBuc2YpOwogICAgfSBlbHNlIHsKCXJldCA9IChEV09SRCkoKGRvdWJsZSlwdWxzZSAqICgoZG91YmxlKXdtbS0+ZHdUZW1wbyAvIDEwMDApIC8JCgkJICAgICAgKGRvdWJsZSl3bW0tPm5EaXZpc2lvbik7CiAgICB9CiAgICAKICAgIC8qCiAgICAgIFRSQUNFKCJwdWxzZT0lbHUgdGVtcG89JWx1IGRpdmlzaW9uPSV1PTB4JTA0eCA9PiBtcz0lbHVcbiIsIAogICAgICBwdWxzZSwgd21tLT5kd1RlbXBvLCB3bW0tPm5EaXZpc2lvbiwgd21tLT5uRGl2aXNpb24sIHJldCk7CiAgICAqLwogICAgCiAgICByZXR1cm4gcmV0Owp9CgojZGVmaW5lIFRJTUVfTVNfSU5fT05FX0hPVVIJKDYwKjYwKjEwMDApCiNkZWZpbmUgVElNRV9NU19JTl9PTkVfTUlOVVRFCSg2MCoxMDAwKQojZGVmaW5lIFRJTUVfTVNfSU5fT05FX1NFQ09ORAkoMTAwMCkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQlNSURJX0NvbnZlcnRUaW1lRm9ybWF0VG9NUwkJW2ludGVybmFsXQogKi8Kc3RhdGljCURXT1JECU1JRElfQ29udmVydFRpbWVGb3JtYXRUb01TKFdJTkVfTUNJTUlESSogd21tLCBEV09SRCB2YWwpCnsKICAgIERXT1JECXJldCA9IDA7CiAgICAKICAgIHN3aXRjaCAod21tLT5kd01jaVRpbWVGb3JtYXQpIHsKICAgIGNhc2UgTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM6CQoJcmV0ID0gdmFsOwkJCglicmVhazsKICAgIGNhc2UgTUNJX0ZPUk1BVF9TTVBURV8yNDoKCXJldCA9IAoJICAgIChISUJZVEUoSElXT1JEKHZhbCkpICogMTI1KSAvIDMgKyAgICAgICAgICAgICBMT0JZVEUoSElXT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfU0VDT05EICsKCSAgICBISUJZVEUoTE9XT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfTUlOVVRFICsgTE9CWVRFKExPV09SRCh2YWwpKSAqIFRJTUVfTVNfSU5fT05FX0hPVVI7CglicmVhazsKICAgIGNhc2UgTUNJX0ZPUk1BVF9TTVBURV8yNToJCQoJcmV0ID0gCgkgICAgSElCWVRFKEhJV09SRCh2YWwpKSAqIDQwICsgCQkgIAkgIExPQllURShISVdPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9TRUNPTkQgKwoJICAgIEhJQllURShMT1dPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9NSU5VVEUgKyBMT0JZVEUoTE9XT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfSE9VUjsKCWJyZWFrOwogICAgY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzMwOgkJCglyZXQgPSAKCSAgICAoSElCWVRFKEhJV09SRCh2YWwpKSAqIDEwMCkgLyAzICsgCQkgIExPQllURShISVdPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9TRUNPTkQgKwoJICAgIEhJQllURShMT1dPUkQodmFsKSkgKiBUSU1FX01TX0lOX09ORV9NSU5VVEUgKyBMT0JZVEUoTE9XT1JEKHZhbCkpICogVElNRV9NU19JTl9PTkVfSE9VUjsKCWJyZWFrOwogICAgZGVmYXVsdDoKCVdBUk4oIkJhZCB0aW1lIGZvcm1hdCAlbHUhXG4iLCB3bW0tPmR3TWNpVGltZUZvcm1hdCk7CiAgICB9CiAgICAvKgogICAgICBUUkFDRSgidmFsPSVsdT0weCUwOGx4IFt0Zj0lbHVdID0+IHJldD0lbHVcbiIsIHZhbCwgdmFsLCB3bW0tPmR3TWNpVGltZUZvcm1hdCwgcmV0KTsKICAgICovCiAgICByZXR1cm4gcmV0Owp9CQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCU1JRElfQ29udmVydE1TVG9UaW1lRm9ybWF0CQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMJRFdPUkQJTUlESV9Db252ZXJ0TVNUb1RpbWVGb3JtYXQoV0lORV9NQ0lNSURJKiB3bW0sIERXT1JEIF92YWwpCnsKICAgIERXT1JECXJldCA9IDAsIHZhbCA9IF92YWw7CiAgICBEV09SRAloLCBtLCBzLCBmOwogICAgCiAgICBzd2l0Y2ggKHdtbS0+ZHdNY2lUaW1lRm9ybWF0KSB7CiAgICBjYXNlIE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOgkKCXJldCA9IHZhbDsJCQoJYnJlYWs7CiAgICBjYXNlIE1DSV9GT1JNQVRfU01QVEVfMjQ6CiAgICBjYXNlIE1DSV9GT1JNQVRfU01QVEVfMjU6CQkKICAgIGNhc2UgTUNJX0ZPUk1BVF9TTVBURV8zMDoJCQoJaCA9IHZhbCAvIFRJTUVfTVNfSU5fT05FX0hPVVI7CQoJbSA9ICh2YWwgLT0gaCAqIFRJTUVfTVNfSU5fT05FX0hPVVIpICAgLyBUSU1FX01TX0lOX09ORV9NSU5VVEU7CQoJcyA9ICh2YWwgLT0gbSAqIFRJTUVfTVNfSU5fT05FX01JTlVURSkgLyBUSU1FX01TX0lOX09ORV9TRUNPTkQ7Cglzd2l0Y2ggKHdtbS0+ZHdNY2lUaW1lRm9ybWF0KSB7CgljYXNlIE1DSV9GT1JNQVRfU01QVEVfMjQ6CgkgICAgLyogb25lIGZyYW1lIGlzIDEwMDAvMjQgdmFsIGxvbmcsIDEwMDAvMjQgPT0gMTI1LzMgKi8KCSAgICBmID0gKHZhbCAqIDMpIC8gMTI1OyAJdmFsIC09IChmICogMTI1KSAvIDM7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9GT1JNQVRfU01QVEVfMjU6CQkKCSAgICAvKiBvbmUgZnJhbWUgaXMgMTAwMC8yNSBtcyBsb25nLCAxMDAwLzI1ID09IDQwICovCgkgICAgZiA9IHZhbCAvIDQwOyAJCXZhbCAtPSBmICogNDA7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9GT1JNQVRfU01QVEVfMzA6CQkKCSAgICAvKiBvbmUgZnJhbWUgaXMgMTAwMC8zMCBtcyBsb25nLCAxMDAwLzMwID09IDEwMC8zICovCgkgICAgZiA9ICh2YWwgKiAzKSAvIDEwMDsgCXZhbCAtPSAoZiAqIDEwMCkgLyAzOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBGSVhNRSgiVGhlcmUgbXVzdCBiZSBzb21lIGJhZCBiYWQgcHJvZ3JhbW1lclxuIik7CgkgICAgZiA9IDA7Cgl9CgkvKiB2YWwgY29udGFpbnMgdGhlIG51bWJlciBvZiBtcyB3aGljaCBjYW5ub3QgbWFrZSBhIGNvbXBsZXRlIGZyYW1lICovCgkvKiBGSVhNRTogaXMgdGhpcyBjb3JyZWN0ID8gcHJvZ3JhbXMgc2VlbSB0byBiZSBoYXBweSB3aXRoIHRoYXQgKi8KCXJldCA9IChmIDw8IDI0KSB8IChzIDw8IDE2KSB8IChtIDw8IDgpIHwgKGggPDwgMCk7CglicmVhazsKICAgIGRlZmF1bHQ6CglXQVJOKCJCYWQgdGltZSBmb3JtYXQgJWx1IVxuIiwgd21tLT5kd01jaVRpbWVGb3JtYXQpOwogICAgfQogICAgLyoKICAgICAgVFJBQ0UoInZhbD0lbHUgW3RmPSVsdV0gPT4gcmV0PSVsdT0weCUwOGx4XG4iLCBfdmFsLCB3bW0tPmR3TWNpVGltZUZvcm1hdCwgcmV0LCByZXQpOwogICAgKi8KICAgIHJldHVybiByZXQ7Cn0JCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJTUlESV9HZXRNVGhkTGVuZ3RoTVMJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMJRFdPUkQJTUlESV9HZXRNVGhkTGVuZ3RoTVMoV0lORV9NQ0lNSURJKiB3bW0pCnsKICAgIFdPUkQJbnQ7CiAgICBEV09SRAlyZXQgPSAwOwogICAgCiAgICBmb3IgKG50ID0gMDsgbnQgPCB3bW0tPm5UcmFja3M7IG50KyspIHsKCWlmICh3bW0tPndGb3JtYXQgPT0gMikgewoJICAgIHJldCArPSB3bW0tPnRyYWNrc1tudF0uZHdMZW5ndGg7Cgl9IGVsc2UgaWYgKHdtbS0+dHJhY2tzW250XS5kd0xlbmd0aCA+IHJldCkgewoJICAgIHJldCA9IHdtbS0+dHJhY2tzW250XS5kd0xlbmd0aDsKCX0KICAgIH0KICAgIC8qIEZJWE1FOiB0aGlzIGlzIHdyb25nIGlmIHRoZXJlIGlzIGEgdGVtcG8gY2hhbmdlIGluc2lkZSB0aGUgZmlsZSAqLwogICAgcmV0dXJuIE1JRElfQ29udmVydFB1bHNlVG9NUyh3bW0sIHJldCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lPcGVuCQkJW2ludGVybmFsXQkKICovCnN0YXRpYyBEV09SRCBNSURJX21jaU9wZW4oVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfT1BFTl9QQVJNU0EgbHBQYXJtcykKewogICAgTUlESU9QRU5ERVNDIAltaWRpT3BlbkRlc2M7CiAgICBEV09SRAkJZHdSZXQgPSAwOwogICAgRFdPUkQJCWR3RGV2aWNlSUQ7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfZHJ2R2V0RHJ2KHdEZXZJRCk7CiAgICAKICAgIFRSQUNFKCIoJTA0eCwgJTA4bFgsICVwKVxuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKGxwUGFybXMgPT0gTlVMTCkgCXJldHVybiBNQ0lFUlJfTlVMTF9QQVJBTUVURVJfQkxPQ0s7CiAgICBpZiAod21tID09IE5VTEwpCQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfT1BFTl9TSEFSRUFCTEUpCglyZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwoKICAgIGlmICh3bW0tPm5Vc2VDb3VudCA+IDApIHsKCS8qIFRoZSBkcml2ZXIgaXMgYWxyZWFkeSBvcGVuZWQgb24gdGhpcyBjaGFubmVsCgkgKiBNSURJIHNlcXVlbmNlciBjYW5ub3QgYmUgc2hhcmVkCgkgKi8KCXJldHVybiBNQ0lFUlJfREVWSUNFX09QRU47CiAgICB9CiAgICB3bW0tPm5Vc2VDb3VudCsrOwogICAgCiAgICB3bW0tPmhGaWxlID0gMDsKICAgIHdtbS0+d01pZGlJRCA9IDA7CiAgICBkd0RldmljZUlEID0gbHBQYXJtcy0+d0RldmljZUlEOwogICAgCiAgICBUUkFDRSgid0RldklEPSUwNFggKGxwUGFyYW1zLT53RGV2aWNlSUQ9JTA4bFgpXG4iLCB3RGV2SUQsIGR3RGV2aWNlSUQpOwogICAgLyoJbHBQYXJtcy0+d0RldmljZUlEID0gd0RldklEOyovCiAgICAKICAgIGlmIChkd0ZsYWdzICYgTUNJX09QRU5fRUxFTUVOVCkgewoJTFBTVFIJCWxwc3RyRWxlbWVudE5hbWU7CgkKCWxwc3RyRWxlbWVudE5hbWUgPSBscFBhcm1zLT5scHN0ckVsZW1lbnROYW1lOwoJCglUUkFDRSgiTUNJX09QRU5fRUxFTUVOVCAnJXMnICFcbiIsIGxwc3RyRWxlbWVudE5hbWUpOwoJaWYgKGxwc3RyRWxlbWVudE5hbWUgJiYgc3RybGVuKGxwc3RyRWxlbWVudE5hbWUpID4gMCkgewoJICAgIHdtbS0+aEZpbGUgPSBtbWlvT3BlbkEobHBzdHJFbGVtZW50TmFtZSwgTlVMTCwgCgkJCQkgICAgIE1NSU9fQUxMT0NCVUYgfCBNTUlPX1JFQURXUklURSB8IE1NSU9fREVOWVdSSVRFKTsKCSAgICBpZiAod21tLT5oRmlsZSA9PSAwKSB7CgkJV0FSTigiQ2FuJ3QgZmluZCBmaWxlPSclcycgIVxuIiwgbHBzdHJFbGVtZW50TmFtZSk7CgkJd21tLT5uVXNlQ291bnQtLTsKCQlyZXR1cm4gTUNJRVJSX0ZJTEVfTk9UX0ZPVU5EOwoJICAgIH0KCX0gZWxzZSB7CgkgICAgd21tLT5oRmlsZSA9IDA7Cgl9CiAgICB9CiAgICBUUkFDRSgiaEZpbGU9JXVcbiIsIHdtbS0+aEZpbGUpOwogICAgCiAgICBtZW1jcHkoJndtbS0+b3BlblBhcm1zLCBscFBhcm1zLCBzaXplb2YoTUNJX09QRU5fUEFSTVNBKSk7CiAgICAKICAgIHdtbS0+d05vdGlmeURldmljZUlEID0gZHdEZXZpY2VJRDsKICAgIHdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9OT1RfUkVBRFk7CS8qIHdoaWxlIGxvYWRpbmcgZmlsZSBjb250ZW50cyAqLwogICAgLyogc3BlYyBzYXlzIGl0IHNob3VsZCBiZSB0aGUgZGVmYXVsdCBmb3JtYXQgZnJvbSB0aGUgTUlESSBmaWxlLi4uICovCiAgICB3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOwogICAgCiAgICBtaWRpT3BlbkRlc2MuaE1pZGkgPSAwOwogICAgCiAgICBpZiAod21tLT5oRmlsZSAhPSAwKSB7CglNTUNLSU5GTwlja01haW5SSUZGOwoJTU1DS0lORk8JbW1ja0luZm87CglEV09SRAkJZHdPZmZzZXQgPSAwOwoJCglpZiAobW1pb0Rlc2NlbmQod21tLT5oRmlsZSwgJmNrTWFpblJJRkYsIE5VTEwsIDApICE9IDApIHsKCSAgICBkd1JldCA9IE1DSUVSUl9JTlZBTElEX0ZJTEU7Cgl9IGVsc2UgewoJICAgIFRSQUNFKCJQYXJlbnRDaHVuayBja2lkPSUuNHMgZmNjVHlwZT0lLjRzIGNrc2l6ZT0lMDhsWCBcbiIsCgkJICAoTFBTVFIpJmNrTWFpblJJRkYuY2tpZCwgKExQU1RSKSZja01haW5SSUZGLmZjY1R5cGUsIGNrTWFpblJJRkYuY2tzaXplKTsKCSAgICAKCSAgICBpZiAoY2tNYWluUklGRi5ja2lkID09IEZPVVJDQ19SSUZGICYmIGNrTWFpblJJRkYuZmNjVHlwZSA9PSBtbWlvRk9VUkNDKCdSJywgJ00nLCAnSScsICdEJykpIHsKCQltbWNrSW5mby5ja2lkID0gbW1pb0ZPVVJDQygnZCcsICdhJywgJ3QnLCAnYScpOwoJCWlmIChtbWlvRGVzY2VuZCh3bW0tPmhGaWxlLCAmbW1ja0luZm8sICZja01haW5SSUZGLCBNTUlPX0ZJTkRDSFVOSykgPT0gMCkgewoJCSAgICBUUkFDRSgiLi4uIGlzIGEgJ1JNSUQnIGZpbGUgXG4iKTsKCQkgICAgZHdPZmZzZXQgPSBtbWNrSW5mby5kd0RhdGFPZmZzZXQ7CgkJfSBlbHNlIHsKCQkgICAgZHdSZXQgPSBNQ0lFUlJfSU5WQUxJRF9GSUxFOwoJCX0KCSAgICB9CgkgICAgaWYgKGR3UmV0ID09IDAgJiYgTUlESV9tY2lSZWFkTVRoZCh3bW0sIGR3T2Zmc2V0KSAhPSAwKSB7CgkJV0FSTigiQ2FuJ3QgcmVhZCAnTVRoZCcgaGVhZGVyIFxuIik7CgkJZHdSZXQgPSBNQ0lFUlJfSU5WQUxJRF9GSUxFOwoJICAgIH0KCX0KICAgIH0gZWxzZSB7CglUUkFDRSgiaEZpbGU9PTAsIHNldHRpbmcgI3RyYWNrcyB0byAwOyBpcyB0aGlzIGNvcnJlY3QgP1xuIik7Cgl3bW0tPm5UcmFja3MgPSAwOwoJd21tLT53Rm9ybWF0ID0gMDsKCXdtbS0+bkRpdmlzaW9uID0gMTsKICAgIH0KICAgIGlmIChkd1JldCAhPSAwKSB7Cgl3bW0tPm5Vc2VDb3VudC0tOwoJaWYgKHdtbS0+aEZpbGUgIT0gMCkKCSAgICBtbWlvQ2xvc2Uod21tLT5oRmlsZSwgMCk7Cgl3bW0tPmhGaWxlID0gMDsKICAgIH0gZWxzZSB7Cgl3bW0tPmR3UG9zaXRpb25NUyA9IDA7Cgl3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKCXdtbS0+aE1pZGlIZHIgPSBVU0VSX0hFQVBfQUxMT0Moc2l6ZW9mKE1JRElIRFIxNikpOwoJCglkd1JldCA9IG1vZE1lc3NhZ2Uod21tLT53TWlkaUlELCBNT0RNX09QRU4sIDAsIChEV09SRCkmbWlkaU9wZW5EZXNjLCBDQUxMQkFDS19OVUxMKTsKCS8qCWR3UmV0ID0gbWlkTWVzc2FnZSh3bW0tPndNaWRpSUQsIE1JRE1fT1BFTiwgMCwgKERXT1JEKSZtaWRpT3BlbkRlc2MsIENBTExCQUNLX05VTEwpOyovCiAgICB9CiAgICByZXR1cm4gZHdSZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lTdG9wCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpU3RvcChVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCnsgICAgCiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgCiAgICBUUkFDRSgiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogICAgCiAgICBpZiAod21tID09IE5VTEwpCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CiAgICAKICAgIHdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOwogICAgVFJBQ0UoIndtbS0+ZHdTdGF0dXM9JWRcbiIsIHdtbS0+ZHdTdGF0dXMpOwogICAgCiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpKSB7CglUUkFDRSgiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwoJbWNpRHJpdmVyTm90aWZ5MTYoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAoJCQkgIHdtbS0+d05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lDbG9zZQkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaUNsb3NlKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKewogICAgRFdPUkQJCWR3UmV0OwogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIAogICAgVFJBQ0UoIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKHdtbSA9PSBOVUxMKQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgCiAgICBpZiAod21tLT5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9TVE9QKSB7CglNSURJX21jaVN0b3Aod0RldklELCBNQ0lfV0FJVCwgbHBQYXJtcyk7CiAgICB9CiAgICAKICAgIHdtbS0+ZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOwogICAgd21tLT5uVXNlQ291bnQtLTsKICAgIGlmICh3bW0tPm5Vc2VDb3VudCA9PSAwKSB7CglpZiAod21tLT5oRmlsZSAhPSAwKSB7CgkgICAgbW1pb0Nsb3NlKHdtbS0+aEZpbGUsIDApOwoJICAgIHdtbS0+aEZpbGUgPSAwOwoJICAgIFRSQUNFKCJoRmlsZSBjbG9zZWQgIVxuIik7Cgl9CglVU0VSX0hFQVBfRlJFRSh3bW0tPmhNaWRpSGRyKTsKCWZyZWUod21tLT50cmFja3MpOwoJZHdSZXQgPSBtb2RNZXNzYWdlKHdtbS0+d01pZGlJRCwgTU9ETV9DTE9TRSwgMCwgMEwsIDBMKTsKCWlmIChkd1JldCAhPSBNTVNZU0VSUl9OT0VSUk9SKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwoJLyoKCSAgZHdSZXQgPSBtaWRNZXNzYWdlKHdtbS0+d01pZGlJRCwgTUlETV9DTE9TRSwgMCwgMEwsIDBMKTsKCSAgaWYgKGR3UmV0ICE9IE1NU1lTRVJSX05PRVJST1IpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CgkqLwogICAgfSBlbHNlIHsKCVRSQUNFKCJTaG91bGRuJ3QgaGFwcGVuLi4uIG5Vc2VDb3VudD0lZFxuIiwgd21tLT5uVXNlQ291bnQpOwoJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKICAgIH0KICAgIAogICAgaWYgKGxwUGFybXMgJiYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSkgewoJVFJBQ0UoIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKCW1jaURyaXZlck5vdGlmeTE2KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKCQkJICB3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpRmluZE5leHRFdmVudAkJW2ludGVybmFsXQogKi8Kc3RhdGljIE1DSV9NSURJVFJBQ0sqCU1JRElfbWNpRmluZE5leHRFdmVudChXSU5FX01DSU1JREkqIHdtbSwgTFBEV09SRCBoaVB1bHNlKSAKewogICAgV09SRAkJY250LCBudDsKICAgIE1DSV9NSURJVFJBQ0sqCW1tdDsKICAgIAogICAgKmhpUHVsc2UgPSAweEZGRkZGRkZGdWw7CiAgICBjbnQgPSAweEZGRkZ1OwogICAgZm9yIChudCA9IDA7IG50IDwgd21tLT5uVHJhY2tzOyBudCsrKSB7CgltbXQgPSAmd21tLT50cmFja3NbbnRdOwoJCglpZiAobW10LT53U3RhdHVzID09IDApCgkgICAgY29udGludWU7CglpZiAobW10LT5kd0V2ZW50UHVsc2UgPCAqaGlQdWxzZSkgewoJICAgICpoaVB1bHNlID0gbW10LT5kd0V2ZW50UHVsc2U7CgkgICAgY250ID0gbnQ7Cgl9CiAgICB9CiAgICByZXR1cm4gKGNudCA9PSAweEZGRkZ1KSA/IDAgLyogbm8gbW9yZSBldmVudCBvbiBhbGwgdHJhY2tzICovCgk6ICZ3bW0tPnRyYWNrc1tjbnRdOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUGxheQkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaVBsYXkoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfUExBWV9QQVJNUyBscFBhcm1zKQp7CiAgICBEV09SRAkJZHdTdGFydE1TLCBkd0VuZE1TLCBkd1JldDsKICAgIFdPUkQJCWRvUGxheSwgbnQ7CiAgICBNQ0lfTUlESVRSQUNLKgltbXQ7CiAgICBEV09SRAkJaGlQdWxzZTsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CiAgICAKICAgIFRSQUNFKCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAgICAKICAgIGlmICh3bW0gPT0gTlVMTCkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIAogICAgaWYgKHdtbS0+aEZpbGUgPT0gMCkgewoJV0FSTigiQ2FuJ3QgcGxheTogbm8gZmlsZSAnJXMnICFcbiIsIHdtbS0+b3BlblBhcm1zLmxwc3RyRWxlbWVudE5hbWUpOwoJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKICAgIH0KICAgIAogICAgaWYgKHdtbS0+ZHdTdGF0dXMgIT0gTUNJX01PREVfU1RPUCkgewoJaWYgKHdtbS0+ZHdTdGF0dXMgPT0gTUNJX01PREVfUEFVU0UpIHsKCSAgICAvKiBGSVhNRTogcGFyYW1ldGVycyAoc3RhcnQvZW5kKSBpbiBscFBhcmFtcyBtYXkgbm90IGJlIHVzZWQgKi8KCSAgICByZXR1cm4gTUlESV9tY2lSZXN1bWUod0RldklELCBkd0ZsYWdzLCAoTFBNQ0lfR0VORVJJQ19QQVJNUylscFBhcm1zKTsKCX0KCVdBUk4oIkNhbid0IHBsYXk6IGRldmljZSBpcyBub3Qgc3RvcHBlZCAhXG4iKTsKCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAgICB9CiAgICAKICAgIGlmICghKGR3RmxhZ3MgJiBNQ0lfV0FJVCkpIHsJCgkvKiogRklYTUU6IEknbSBub3QgMTAwJSBzdXJlIHRoYXQgd05vdGlmeURldmljZUlEIGlzIHRoZSByaWdodCB2YWx1ZSBpbiBhbGwgY2FzZXMgPz8/ICovCglyZXR1cm4gTUNJX1NlbmRDb21tYW5kQXN5bmMod21tLT53Tm90aWZ5RGV2aWNlSUQsIE1DSV9QTEFZLCBkd0ZsYWdzLCAoRFdPUkQpbHBQYXJtcywgc2l6ZW9mKExQTUNJX1BMQVlfUEFSTVMpKTsKICAgIH0KICAgIAogICAgaWYgKGxwUGFybXMgJiYgKGR3RmxhZ3MgJiBNQ0lfRlJPTSkpIHsKCWR3U3RhcnRNUyA9IE1JRElfQ29udmVydFRpbWVGb3JtYXRUb01TKHdtbSwgbHBQYXJtcy0+ZHdGcm9tKTsgCiAgICB9IGVsc2UgewoJZHdTdGFydE1TID0gd21tLT5kd1Bvc2l0aW9uTVM7CiAgICB9CiAgICAKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX1RPKSkgewoJZHdFbmRNUyA9IE1JRElfQ29udmVydFRpbWVGb3JtYXRUb01TKHdtbSwgbHBQYXJtcy0+ZHdUbyk7CiAgICB9IGVsc2UgewoJZHdFbmRNUyA9IDB4RkZGRkZGRkZ1bDsKICAgIH0KICAgIAogICAgVFJBQ0UoIlBsYXlpbmcgZnJvbSAlbHUgdG8gJWx1XG4iLCBkd1N0YXJ0TVMsIGR3RW5kTVMpOwogICAgCiAgICAvKiBpbml0IHRyYWNrcyAqLwogICAgZm9yIChudCA9IDA7IG50IDwgd21tLT5uVHJhY2tzOyBudCsrKSB7CgltbXQgPSAmd21tLT50cmFja3NbbnRdOwoJCgltbXQtPndTdGF0dXMgPSAxOwkvKiBvaywgcGxheWluZyAqLwoJbW10LT5kd0luZGV4ID0gbW10LT5kd0ZpcnN0OwoJaWYgKHdtbS0+d0Zvcm1hdCA9PSAyICYmIG50ID4gMCkgewoJICAgIG1tdC0+ZHdFdmVudFB1bHNlID0gd21tLT50cmFja3NbbnQgLSAxXS5kd0xlbmd0aDsKCX0gZWxzZSB7CgkgICAgbW10LT5kd0V2ZW50UHVsc2UgPSAwOwoJfQoJTUlESV9tY2lSZWFkTmV4dEV2ZW50KHdtbSwgbW10KTsgLyogRklYTUUgPT0gMCAqLwogICAgfQogICAgCiAgICB3bW0tPmR3UHVsc2UgPSAwOwogICAgd21tLT5kd1RlbXBvID0gNTAwMDAwOwogICAgd21tLT5kd1N0YXR1cyA9IE1DSV9NT0RFX1BMQVk7CiAgICB3bW0tPmR3UG9zaXRpb25NUyA9IDA7CiAgICB3bW0tPndTdGFydGVkUGxheWluZyA9IEZBTFNFOwogICAgCiAgICB3aGlsZSAod21tLT5kd1N0YXR1cyAhPSBNQ0lfTU9ERV9TVE9QKSB7CgkvKiBpdCBzZWVtcyB0aGF0IGluIGNhc2Ugb2YgbXVsdGktdGhyZWFkaW5nLCBnY2MgaXMgb3B0aW1pemluZyBqdXN0IGEgbGl0dGxlIGJpdCAKCSAqIHRvbyBtdWNoLiBUZWxsIGdjYyBub3QgdG8gb3B0aW1pemUgc3RhdHVzIHZhbHVlIHVzaW5nIHZvbGF0aWxlLiAKCSAqLwoJd2hpbGUgKCgodm9sYXRpbGUgV0lORV9NQ0lNSURJKil3bW0pLT5kd1N0YXR1cyA9PSBNQ0lfTU9ERV9QQVVTRSk7CgkKCWRvUGxheSA9ICh3bW0tPmR3UG9zaXRpb25NUyA+PSBkd1N0YXJ0TVMgJiYgd21tLT5kd1Bvc2l0aW9uTVMgPD0gZHdFbmRNUyk7CgkKCVRSQUNFKCJ3bW0tPmR3U3RhdHVzPSVkLCBkb1BsYXk9JXNcbiIsIHdtbS0+ZHdTdGF0dXMsIGRvUGxheSA/ICJUIiA6ICJGIik7CgkKCWlmICgobW10ID0gTUlESV9tY2lGaW5kTmV4dEV2ZW50KHdtbSwgJmhpUHVsc2UpKSA9PSBOVUxMKQoJICAgIGJyZWFrOyAgLyogbm8gbW9yZSBldmVudCBvbiB0cmFja3MgKi8KCQoJLyogaWYgc3RhcnRpbmcgcGxheWluZywgdGhlbiBzZXQgU3RhcnRUaWNrcyB0byB0aGUgdmFsdWUgaXQgd291bGQgaGF2ZSBoYWQKCSAqIGlmIHBsYXkgaGFkIHN0YXJ0ZWQgYXQgcG9zaXRpb24gMAoJICovCglpZiAoZG9QbGF5ICYmICF3bW0tPndTdGFydGVkUGxheWluZykgewoJICAgIHdtbS0+ZHdTdGFydFRpY2tzID0gR2V0VGlja0NvdW50KCkgLSBNSURJX0NvbnZlcnRQdWxzZVRvTVMod21tLCB3bW0tPmR3UHVsc2UpOwoJICAgIHdtbS0+d1N0YXJ0ZWRQbGF5aW5nID0gVFJVRTsKCSAgICBUUkFDRSgiU2V0dGluZyBkd1N0YXJ0VGlja3MgdG8gJWx1XG4iLCB3bW0tPmR3U3RhcnRUaWNrcyk7Cgl9CgkKCWlmIChoaVB1bHNlID4gd21tLT5kd1B1bHNlKSB7CgkgICAgd21tLT5kd1Bvc2l0aW9uTVMgKz0gTUlESV9Db252ZXJ0UHVsc2VUb01TKHdtbSwgaGlQdWxzZSAtIHdtbS0+ZHdQdWxzZSk7CgkgICAgaWYgKGRvUGxheSkgewoJCURXT1JECXRvZ28gPSB3bW0tPmR3U3RhcnRUaWNrcyArIHdtbS0+ZHdQb3NpdGlvbk1TOwoJCURXT1JECXRjID0gR2V0VGlja0NvdW50KCk7CgkJCgkJVFJBQ0UoIlB1bHNlcyBoaT0weCUwOGx4IDw+IGN1cj0weCUwOGx4XG4iLCBoaVB1bHNlLCB3bW0tPmR3UHVsc2UpOwoJCVRSQUNFKCJXYWl0IHVudGlsICVsdSA9PiAlbHUgbXNcbiIsIAkKCQkgICAgICB0YyAtIHdtbS0+ZHdTdGFydFRpY2tzLCB0b2dvIC0gd21tLT5kd1N0YXJ0VGlja3MpOwoJCWlmICh0YyA8IHRvZ28pCQoJCSAgICBTbGVlcCh0b2dvIC0gdGMpOwoJICAgIH0KCSAgICB3bW0tPmR3UHVsc2UgPSBoaVB1bHNlOwoJfQoJCglzd2l0Y2ggKExPQllURShMT1dPUkQobW10LT5kd0V2ZW50RGF0YSkpKSB7CgljYXNlIDB4RjA6CgljYXNlIDB4Rjc6CS8qIHN5c2V4IGV2ZW50cyAqLwoJICAgIHsKCQlGSVhNRSgiTm90IGhhbmRsaW5nIFN5c0V4IGV2ZW50cyAoeWV0KVxuIik7CgkgICAgfQoJICAgIGJyZWFrOwoJY2FzZSAweEZGOgoJICAgIC8qIHBvc2l0aW9uIGFmdGVyIG1ldGEgZGF0YSBoZWFkZXIgKi8KCSAgICBtbWlvU2Vlayh3bW0tPmhGaWxlLCBtbXQtPmR3SW5kZXggKyBISVdPUkQobW10LT5kd0V2ZW50RGF0YSksIFNFRUtfU0VUKTsKCSAgICBzd2l0Y2ggKEhJQllURShMT1dPUkQobW10LT5kd0V2ZW50RGF0YSkpKSB7CgkgICAgY2FzZSAweDAwOiAvKiAxNi1iaXQgc2VxdWVuY2UgbnVtYmVyICovCgkJaWYgKFRSQUNFX09OKG1jaW1pZGkpKSB7CgkJICAgIFdPUkQJdHdkOwoJCSAgICAKCQkgICAgTUlESV9tY2lSZWFkV29yZCh3bW0sICZ0d2QpOwkvKiA9PSAwICovCgkJICAgIFRSQUNFKCJHb3Qgc2VxdWVuY2UgbnVtYmVyICV1XG4iLCB0d2QpOwoJCX0KCQlicmVhazsKCSAgICBjYXNlIDB4MDE6IC8qIGFueSB0ZXh0ICovCgkgICAgY2FzZSAweDAyOiAvKiBDb3B5cmlnaHQgTWVzc2FnZSB0ZXh0ICovCgkgICAgY2FzZSAweDAzOiAvKiBTZXF1ZW5jZS9UcmFjayBOYW1lIHRleHQgKi8KCSAgICBjYXNlIDB4MDQ6IC8qIEluc3RydW1lbnQgTmFtZSB0ZXh0ICovCgkgICAgY2FzZSAweDA1OiAvKiBMeXJpYyB0ZXh0ICovCgkgICAgY2FzZSAweDA2OiAvKiBNYXJrZXIgdGV4dCAqLwoJICAgIGNhc2UgMHgwNzogLyogQ3VlLXBvaW50IHRleHQgKi8KCQlpZiAoVFJBQ0VfT04obWNpbWlkaSkpIHsKCQkgICAgY2hhcglidWZbMTAyNF07CgkJICAgIFdPUkQJbGVuID0gbW10LT53RXZlbnRMZW5ndGggLSBISVdPUkQobW10LT5kd0V2ZW50RGF0YSk7CgkJICAgIHN0YXRpYwljaGFyKglpbmZvWzhdID0geyIiLCAiVGV4dCIsICJDb3B5cmlnaHQiLCAiU2VxL1RyayBuYW1lIiwgCgkJCQkJCSAgICJJbnN0cnVtZW50IiwgIkx5cmljIiwgIk1hcmtlciIsICJDdWUtcG9pbnQifTsKCQkgICAgV09SRAlpZHggPSBISUJZVEUoTE9XT1JEKG1tdC0+ZHdFdmVudERhdGEpKTsKCQkgICAgCgkJICAgIGlmIChsZW4gPj0gc2l6ZW9mKGJ1ZikpIHsKCQkJV0FSTigiQnVmZmVyIGZvciB0ZXh0IGlzIHRvbyBzbWFsbCAoJWQgYnl0ZXMsIHdoZW4gJXUgYXJlIG5lZWRlZClcbiIsIHNpemVvZihidWYpIC0gMSwgbGVuKTsKCQkJbGVuID0gc2l6ZW9mKGJ1ZikgLSAxOwoJCSAgICB9CgkJICAgIGlmIChtbWlvUmVhZCh3bW0tPmhGaWxlLCAoSFBTVFIpYnVmLCBsZW4pID09IGxlbikgewoJCQlidWZbbGVuXSA9IDA7CS8qIGVuZCBzdHJpbmcgaW4gY2FzZSAqLwoJCQlUUkFDRSgiJXMgPT4gXCIlc1wiXG4iLCAoaWR4IDwgOCApID8gaW5mb1tpZHhdIDogIiIsIGJ1Zik7CgkJICAgIH0gZWxzZSB7CgkJCVdBUk4oIkNvdWxkbid0IHJlYWQgZGF0YSBmb3IgJXNcbiIsIChpZHggPCA4ICkgPyBpbmZvW2lkeF0gOiAiIik7CgkJICAgIH0KCQl9CgkJYnJlYWs7CgkgICAgY2FzZSAweDIwOiAKCQkvKiBNSURJIGNoYW5uZWwgKGNjKSAqLwoJCWlmIChGSVhNRV9PTihtY2ltaWRpKSkgewoJCSAgICBCWVRFCWJ0OwoJCSAgICAKCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZidCk7CS8qID09IDAgKi8KCQkgICAgRklYTUUoIk5JWTogTUlESSBjaGFubmVsPSV1LCB0cmFjaz0ldVxuIiwgYnQsIG1tdC0+d1RyYWNrTnIpOwoJCX0KCQlicmVhazsKCSAgICBjYXNlIDB4MjE6CgkJLyogTUlESSBwb3J0IChwcCkgKi8KCQlpZiAoRklYTUVfT04obWNpbWlkaSkpIHsKCQkgICAgQllURQlidDsKCQkgICAgCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmYnQpOwkvKiA9PSAwICovCgkJICAgIEZJWE1FKCJOSVk6IE1JREkgcG9ydD0ldSwgdHJhY2s9JXVcbiIsIGJ0LCBtbXQtPndUcmFja05yKTsKCQl9CgkJYnJlYWs7CgkgICAgY2FzZSAweDJGOiAvKiBlbmQgb2YgdHJhY2sgKi8KCQltbXQtPndTdGF0dXMgPSAwOwoJCWJyZWFrOwoJICAgIGNhc2UgMHg1MTovKiBzZXQgdGVtcG8gKi8KCQkvKiBUZW1wbyBpcyBleHByZXNzZWQgaW4gtS1zZWNvbmRzIHBlciBtaWRpIHF1YXJ0ZXIgbm90ZQoJCSAqIGZvciBmb3JtYXQgMSBNSURJIGZpbGVzLCB0aGlzIGNhbiBvbmx5IGJlIHByZXNlbnQgb24gdHJhY2sgIzAKCQkgKi8KCQlpZiAobW10LT53VHJhY2tOciAhPSAwICYmIHdtbS0+d0Zvcm1hdCA9PSAxKSB7CgkJICAgIFdBUk4oIkZvciBmb3JtYXQgIzEgTUlESSBmaWxlcywgdGVtcG8gY2FuIG9ubHkgYmUgY2hhbmdlZCBvbiB0cmFjayAjMCAoJXUpXG4iLCBtbXQtPndUcmFja05yKTsKCQl9IGVsc2UgeyAKCQkgICAgQllURQl0YnQ7CgkJICAgIERXT1JECXZhbHVlID0gMDsKCQkgICAgCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmdGJ0KTsJdmFsdWUgID0gKChEV09SRCl0YnQpIDw8IDE2OwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJnRidCk7CXZhbHVlIHw9ICgoRFdPUkQpdGJ0KSA8PCA4OwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJnRidCk7CXZhbHVlIHw9ICgoRFdPUkQpdGJ0KSA8PCAwOwoJCSAgICBUUkFDRSgiU2V0dGluZyB0ZW1wbyB0byAlbGQgKEJQTT0lbGQpXG4iLCB3bW0tPmR3VGVtcG8sICh2YWx1ZSkgPyAoNjAwMDAwMDBsIC8gdmFsdWUpIDogMCk7CgkJICAgIHdtbS0+ZHdUZW1wbyA9IHZhbHVlOwoJCX0KCQlicmVhazsKCSAgICBjYXNlIDB4NTQ6IC8qIChob3VyKSAobWluKSAoc2Vjb25kKSAoZnJhbWUpIChmcmFjdGlvbmFsLWZyYW1lKSAtIFNNUFRFIHRyYWNrIHN0YXJ0ICovCgkJaWYgKG1tdC0+d1RyYWNrTnIgIT0gMCAmJiB3bW0tPndGb3JtYXQgPT0gMSkgewoJCSAgICBXQVJOKCJGb3IgZm9ybWF0ICMxIE1JREkgZmlsZXMsIFNNUFRFIHRyYWNrIHN0YXJ0IGNhbiBvbmx5IGJlIGV4cHJlc3NlZCBvbiB0cmFjayAjMCAoJXUpXG4iLCBtbXQtPndUcmFja05yKTsKCQl9IGlmIChtbXQtPmR3RXZlbnRQdWxzZSAhPSAwKSB7CgkJICAgIFdBUk4oIlNNUFRFIHRyYWNrIHN0YXJ0IGNhbiBvbmx5IGJlIGV4cHJlc3NlZCBhdCBzdGFydCBvZiB0cmFjayAoJWx1KVxuIiwgbW10LT5kd0V2ZW50UHVsc2UpOwoJCX0gZWxzZSB7CgkJICAgIEJZVEUJaCwgbSwgcywgZiwgZmY7CgkJICAgIAoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmgpOwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJm0pOwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJnMpOwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmYpOwoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmZmKTsKCQkgICAgRklYTUUoIk5JWTogU01QVEUgdHJhY2sgc3RhcnQgJXU6JXU6JXUgJXUuJXVcbiIsIGgsIG0sIHMsIGYsIGZmKTsKCQl9CgkJYnJlYWs7CgkgICAgY2FzZSAweDU4OiAvKiBmaWxlIHJ5dGhtICovCgkJaWYgKFRSQUNFX09OKG1jaW1pZGkpKSB7CgkJICAgIEJZVEUJbnVtLCBkZW4sIGNwbWMsIF8zMm5wcW47CgkJICAgIAoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJm51bSk7CQoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJmRlbik7CQkvKiB0byBub3RhdGUgZS5nLiA2LzggKi8KCQkgICAgTUlESV9tY2lSZWFkQnl0ZSh3bW0sICZjcG1jKTsJCS8qIG51bWJlciBvZiBNSURJIGNsb2NrcyBwZXIgbWV0cm9ub21lIGNsaWNrICovIAoJCSAgICBNSURJX21jaVJlYWRCeXRlKHdtbSwgJl8zMm5wcW4pOwkJLyogbnVtYmVyIG9mIG5vdGF0ZWQgMzJuZCBub3RlcyBwZXIgTUlESSBxdWFydGVyIG5vdGUgKi8KCQkgICAgCgkJICAgIFRSQUNFKCIldS8ldSwgY2xvY2sgcGVyIG1ldHJvbm9tZSBjbGljaz0ldSwgMzJuZCBub3RlcyBieSAxLzQgbm90ZT0ldVxuIiwgbnVtLCAxIDw8IGRlbiwgY3BtYywgXzMybnBxbik7CgkJfQoJCWJyZWFrOwoJICAgIGNhc2UgMHg1OTogLyoga2V5IHNpZ25hdHVyZSAqLwoJCWlmIChUUkFDRV9PTihtY2ltaWRpKSkgewoJCSAgICBCWVRFCXNmLCBtbTsKCQkgICAgCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmc2YpOwkJCgkJICAgIE1JRElfbWNpUmVhZEJ5dGUod21tLCAmbW0pOwkKCQkgICAgCgkJICAgIGlmIChzZiA+PSAweDgwKSAJVFJBQ0UoIiVkIGZsYXRzXG4iLCAtKGNoYXIpc2YpOwkgCgkJICAgIGVsc2UgaWYgKHNmID4gMCkgCVRSQUNFKCIlZCBzaGFycHNcbiIsIChjaGFyKXNmKTsJIAoJCSAgICBlbHNlIAkJVFJBQ0UoIktleSBvZiBDXG4iKTsKCQkgICAgVFJBQ0UoIk1vZGU6ICVzXG4iLCAobW0gPSAwKSA/ICJtYWpvciIgOiAibWlub3IiKTsKCQl9CgkJYnJlYWs7CgkgICAgZGVmYXVsdDoKCQlXQVJOKCJVbmtub3duIE1JREkgbWV0YSBldmVudCAlMDJ4LiBTa2lwcGluZy4uLlxuIiwgSElCWVRFKExPV09SRChtbXQtPmR3RXZlbnREYXRhKSkpOwoJCWJyZWFrOwoJICAgIH0KCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgaWYgKGRvUGxheSkgewoJCWR3UmV0ID0gbW9kTWVzc2FnZSh3bW0tPndNaWRpSUQsIE1PRE1fREFUQSwgMCwgbW10LT5kd0V2ZW50RGF0YSwgMCk7CgkgICAgfSBlbHNlIHsKCQlzd2l0Y2ggKExPQllURShMT1dPUkQobW10LT5kd0V2ZW50RGF0YSkpICYgMHhGMCkgewoJCWNhc2UgTUlESV9OT1RFT046CgkJY2FzZSBNSURJX05PVEVPRkY6CgkJICAgIGR3UmV0ID0gMDsJCgkJICAgIGJyZWFrOwoJCWRlZmF1bHQ6CgkJICAgIGR3UmV0ID0gbW9kTWVzc2FnZSh3bW0tPndNaWRpSUQsIE1PRE1fREFUQSwgMCwgbW10LT5kd0V2ZW50RGF0YSwgMCk7CgkJfQoJICAgIH0KCX0KCW1tdC0+ZHdJbmRleCArPSBtbXQtPndFdmVudExlbmd0aDsKCWlmIChtbXQtPmR3SW5kZXggPCBtbXQtPmR3Rmlyc3QgfHwgbW10LT5kd0luZGV4ID49IG1tdC0+ZHdMYXN0KSB7CgkgICAgbW10LT53U3RhdHVzID0gMDsKCX0gCglpZiAobW10LT53U3RhdHVzKSB7CQoJICAgIE1JRElfbWNpUmVhZE5leHRFdmVudCh3bW0sIG1tdCk7Cgl9CiAgICB9CiAgICAKICAgIC8qIHN0b3AgYWxsIG5vdGVzICovCiAgICAvKiBzaG91bGQgYmUgKDB4NzgwMCB8IE1JRElfQ1RMX0NIQU5HRSkgaW5zdGVhZCBvZiAweDc4QjAsCiAgICAgKiBidXQgTUlESV9DVExfQ0hBTkdFIGlzIGRlZmluZWQgaW4gT1NTJ3Mgc291bmRjYXJkLmggYW5kIE1DSSBtdXN0IGNvbXBpbGUKICAgICAqIHdpdGhvdXQgYW55IHJlZmVyZW5jZSB0byBPU1MKICAgICAqLwogICAgLyogRklYTUU6IGNoZWNrIGlmIDB4NzhCMCBpcyBjaGFubmVsIGRlcGVuZGFudCBvciBub3QuIEkgY29kZWQgaXQgc28gdGhhdCAKICAgICAqIGl0J3MgY2hhbm5lbCBkZXBlbmRlbnQuLi4KICAgICAqLwogICAgewoJdW5zaWduZWQgY2huOwoJZm9yIChjaG4gPSAwOyBjaG4gPCAxNjsgY2huKyspCgkgICAgbW9kTWVzc2FnZSh3bW0tPndNaWRpSUQsIE1PRE1fREFUQSwgMCwgMHg3OEIwIHwgY2huLCAwKTsKICAgIH0KICAgIAogICAgd21tLT5kd1N0YXR1cyA9IE1DSV9NT0RFX1NUT1A7CiAgICAKICAgIC8qIHRvIHJlc3RhcnQgcGxheWluZyBhdCBiZWdpbm5pbmcgd2hlbiBpdCdzIG92ZXIgKi8KICAgIHdtbS0+ZHdQb3NpdGlvbk1TID0gMDsKICAgIAogICAgaWYgKGxwUGFybXMgJiYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSkgewoJVFJBQ0UoIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKCW1jaURyaXZlck5vdGlmeTE2KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKCQkJICB3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpUmVjb3JkCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpUmVjb3JkKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1JFQ09SRF9QQVJNUyBscFBhcm1zKQp7CiAgICBpbnQJCQlzdGFydCwgZW5kOwogICAgTFBNSURJSERSMTYJCWxwTWlkaUhkcjsKICAgIERXT1JECQlkd1JldDsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CiAgICAKICAgIFRSQUNFKCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAgICAKICAgIGlmICh3bW0gPT0gMCkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIAogICAgaWYgKHdtbS0+aEZpbGUgPT0gMCkgewoJV0FSTigiQ2FuJ3QgZmluZCBmaWxlPSclMDhseCcgIVxuIiwgCgkgICAgIChEV09SRCl3bW0tPm9wZW5QYXJtcy5scHN0ckVsZW1lbnROYW1lKTsKCXJldHVybiBNQ0lFUlJfRklMRV9OT1RfRk9VTkQ7CiAgICB9CiAgICBzdGFydCA9IDE7IAkJZW5kID0gOTk5OTk7CiAgICBpZiAobHBQYXJtcyAmJiAoZHdGbGFncyAmIE1DSV9GUk9NKSkgewoJc3RhcnQgPSBscFBhcm1zLT5kd0Zyb207IAoJVFJBQ0UoIk1DSV9GUk9NPSVkIFxuIiwgc3RhcnQpOwogICAgfQogICAgaWYgKGxwUGFybXMgJiYgKGR3RmxhZ3MgJiBNQ0lfVE8pKSB7CgllbmQgPSBscFBhcm1zLT5kd1RvOwoJVFJBQ0UoIk1DSV9UTz0lZCBcbiIsIGVuZCk7CiAgICB9CiAgICBscE1pZGlIZHIgPSBVU0VSX0hFQVBfTElOX0FERFIod21tLT5oTWlkaUhkcik7CiAgICBscE1pZGlIZHItPmxwRGF0YSA9IChMUFNUUikgbWFsbG9jKDEyMDApOwogICAgaWYgKCFscE1pZGlIZHIpCglyZXR1cm4gTUNJRVJSX09VVF9PRl9NRU1PUlk7CiAgICBscE1pZGlIZHItPmR3QnVmZmVyTGVuZ3RoID0gMTAyNDsKICAgIGxwTWlkaUhkci0+ZHdVc2VyID0gMEw7CiAgICBscE1pZGlIZHItPmR3RmxhZ3MgPSAwTDsKICAgIGR3UmV0ID0gbWlkTWVzc2FnZSh3bW0tPndNaWRpSUQsIE1JRE1fUFJFUEFSRSwgMCwgKERXT1JEKWxwTWlkaUhkciwgc2l6ZW9mKE1JRElIRFIxNikpOwogICAgVFJBQ0UoIkFmdGVyIE1JRE1fUFJFUEFSRSBcbiIpOwogICAgd21tLT5kd1N0YXR1cyA9IE1DSV9NT0RFX1JFQ09SRDsKICAgIHdoaWxlICh3bW0tPmR3U3RhdHVzICE9IE1DSV9NT0RFX1NUT1ApIHsKCVRSQUNFKCJ3bW0tPmR3U3RhdHVzPSVwICVkXG4iLAoJICAgICAgJndtbS0+ZHdTdGF0dXMsIHdtbS0+ZHdTdGF0dXMpOwoJbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQgPSAwOwoJZHdSZXQgPSBtaWRNZXNzYWdlKHdtbS0+d01pZGlJRCwgTUlETV9TVEFSVCwgMCwgMEwsIDBMKTsKCVRSQUNFKCJBZnRlciBNSURNX1NUQVJUIGxwTWlkaUhkcj0lcCBkd0J5dGVzUmVjb3JkZWQ9JWx1XG4iLAoJICAgICAgbHBNaWRpSGRyLCBscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZCk7CglpZiAobHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQgPT0gMCkgYnJlYWs7CiAgICB9CiAgICBUUkFDRSgiQmVmb3JlIE1JRE1fVU5QUkVQQVJFIFxuIik7CiAgICBkd1JldCA9IG1pZE1lc3NhZ2Uod21tLT53TWlkaUlELCBNSURNX1VOUFJFUEFSRSwgMCwgKERXT1JEKWxwTWlkaUhkciwgc2l6ZW9mKE1JRElIRFIxNikpOwogICAgVFJBQ0UoIkFmdGVyIE1JRE1fVU5QUkVQQVJFIFxuIik7CiAgICBpZiAobHBNaWRpSGRyLT5scERhdGEgIT0gTlVMTCkgewoJZnJlZShscE1pZGlIZHItPmxwRGF0YSk7CglscE1pZGlIZHItPmxwRGF0YSA9IE5VTEw7CiAgICB9CiAgICB3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKICAgIGlmIChscFBhcm1zICYmIChkd0ZsYWdzICYgTUNJX05PVElGWSkpIHsKCVRSQUNFKCJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CgltY2lEcml2ZXJOb3RpZnkxNigoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCgkJCSAgd21tLT53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlNSURJX21jaVBhdXNlCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpUGF1c2UoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQp7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgCiAgICBUUkFDRSgiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogICAgCiAgICBpZiAod21tID09IE5VTEwpCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CiAgICAKICAgIGlmICh3bW0tPmR3U3RhdHVzID09IE1DSV9NT0RFX1BMQVkpIHsKCS8qIHN0b3AgYWxsIG5vdGVzICovCgkvKiBzZWUgbm90ZSBpbiBNSURJX21jaVBsYXkgKi8KCXVuc2lnbmVkIGNobjsKCWZvciAoY2huID0gMDsgY2huIDwgMTY7IGNobisrKQoJICAgIG1vZE1lc3NhZ2Uod21tLT53TWlkaUlELCBNT0RNX0RBVEEsIDAsIDB4NzhCMCB8IGNobiwgMCk7Cgl3bW0tPmR3U3RhdHVzID0gTUNJX01PREVfUEFVU0U7CiAgICB9IAogICAgaWYgKGxwUGFybXMgJiYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSkgewoJVFJBQ0UoIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKCW1jaURyaXZlck5vdGlmeTE2KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKCQkJICB3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KICAgIAogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lSZXN1bWUJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lSZXN1bWUoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQp7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgCiAgICBUUkFDRSgiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogICAgCiAgICBpZiAod21tID09IE5VTEwpCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CiAgICAKICAgIGlmICh3bW0tPmR3U3RhdHVzID09IE1DSV9NT0RFX1BBVVNFKSB7Cgl3bW0tPndTdGFydGVkUGxheWluZyA9IEZBTFNFOwoJd21tLT5kd1N0YXR1cyA9IE1DSV9NT0RFX1BMQVk7CiAgICB9IAogICAgaWYgKGxwUGFybXMgJiYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSkgewoJVFJBQ0UoIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKCW1jaURyaXZlck5vdGlmeTE2KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKCQkJICB3bW0tPndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpU2V0CQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpU2V0KFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NFVF9QQVJNUyBscFBhcm1zKQp7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgCiAgICBUUkFDRSgiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogICAgCiAgICBpZiAobHBQYXJtcyA9PSBOVUxMKQlyZXR1cm4gTUNJRVJSX05VTExfUEFSQU1FVEVSX0JMT0NLOwogICAgaWYgKHdtbSA9PSBOVUxMKQkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKICAgIAogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX1RJTUVfRk9STUFUKSB7Cglzd2l0Y2ggKGxwUGFybXMtPmR3VGltZUZvcm1hdCkgewoJY2FzZSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzoKCSAgICBUUkFDRSgiTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFMgIVxuIik7CgkgICAgd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzsKCSAgICBicmVhazsKCWNhc2UgTUNJX0ZPUk1BVF9TTVBURV8yNDoKCSAgICBUUkFDRSgiTUNJX0ZPUk1BVF9TTVBURV8yNCAhXG4iKTsKCSAgICB3bW0tPmR3TWNpVGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfU01QVEVfMjQ7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9GT1JNQVRfU01QVEVfMjU6CgkgICAgVFJBQ0UoIk1DSV9GT1JNQVRfU01QVEVfMjUgIVxuIik7CgkgICAgd21tLT5kd01jaVRpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1NNUFRFXzI1OwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfRk9STUFUX1NNUFRFXzMwOgoJICAgIFRSQUNFKCJNQ0lfRk9STUFUX1NNUFRFXzMwICFcbiIpOwoJICAgIHdtbS0+ZHdNY2lUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9TTVBURV8zMDsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgV0FSTigiQmFkIHRpbWUgZm9ybWF0ICVsdSFcbiIsIGxwUGFybXMtPmR3VGltZUZvcm1hdCk7CgkgICAgcmV0dXJuIE1DSUVSUl9CQURfVElNRV9GT1JNQVQ7Cgl9CiAgICB9CiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVRfVklERU8pIHsKCVRSQUNFKCJObyBzdXBwb3J0IGZvciB2aWRlbyAhXG4iKTsKCXJldHVybiBNQ0lFUlJfVU5TVVBQT1JURURfRlVOQ1RJT047CiAgICB9CiAgICBpZiAoZHdGbGFncyAmIE1DSV9TRVRfRE9PUl9PUEVOKSB7CglUUkFDRSgiTm8gc3VwcG9ydCBmb3IgZG9vciBvcGVuICFcbiIpOwoJcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsKICAgIH0KICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFVF9ET09SX0NMT1NFRCkgewoJVFJBQ0UoIk5vIHN1cHBvcnQgZm9yIGRvb3IgY2xvc2UgIVxuIik7CglyZXR1cm4gTUNJRVJSX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOwogICAgfQogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX0FVRElPKSB7CglpZiAoZHdGbGFncyAmIE1DSV9TRVRfT04pIHsKCSAgICBUUkFDRSgiTUNJX1NFVF9PTiBhdWRpbyAhXG4iKTsKCX0gZWxzZSBpZiAoZHdGbGFncyAmIE1DSV9TRVRfT0ZGKSB7CgkgICAgVFJBQ0UoIk1DSV9TRVRfT0ZGIGF1ZGlvICFcbiIpOwoJfSBlbHNlIHsKCSAgICBXQVJOKCJNQ0lfU0VUX0FVRElPIHdpdGhvdXQgU0VUX09OIG9yIFNFVF9PRkZcbiIpOwoJICAgIHJldHVybiBNQ0lFUlJfQkFEX0lOVEVHRVI7Cgl9CgkKCWlmIChscFBhcm1zLT5kd0F1ZGlvICYgTUNJX1NFVF9BVURJT19BTEwpCgkgICAgVFJBQ0UoIk1DSV9TRVRfQVVESU9fQUxMICFcbiIpOwoJaWYgKGxwUGFybXMtPmR3QXVkaW8gJiBNQ0lfU0VUX0FVRElPX0xFRlQpCgkgICAgVFJBQ0UoIk1DSV9TRVRfQVVESU9fTEVGVCAhXG4iKTsKCWlmIChscFBhcm1zLT5kd0F1ZGlvICYgTUNJX1NFVF9BVURJT19SSUdIVCkKCSAgICBUUkFDRSgiTUNJX1NFVF9BVURJT19SSUdIVCAhXG4iKTsKICAgIH0KICAgIAogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9NQVNURVIpCglUUkFDRSgiTUNJX1NFUV9TRVRfTUFTVEVSICFcbiIpOwogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9TTEFWRSkKCVRSQUNFKCJNQ0lfU0VRX1NFVF9TTEFWRSAhXG4iKTsKICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFUV9TRVRfT0ZGU0VUKQoJVFJBQ0UoIk1DSV9TRVFfU0VUX09GRlNFVCAhXG4iKTsKICAgIGlmIChkd0ZsYWdzICYgTUNJX1NFUV9TRVRfUE9SVCkKCVRSQUNFKCJNQ0lfU0VRX1NFVF9QT1JUICFcbiIpOwogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9URU1QTykKCVRSQUNFKCJNQ0lfU0VRX1NFVF9URU1QTyAhXG4iKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpU3RhdHVzCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpU3RhdHVzKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NUQVRVU19QQVJNUyBscFBhcm1zKQp7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgCiAgICBUUkFDRSgiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogICAgCiAgICBpZiAobHBQYXJtcyA9PSBOVUxMKSAJcmV0dXJuIE1DSUVSUl9OVUxMX1BBUkFNRVRFUl9CTE9DSzsKICAgIGlmICh3bW0gPT0gTlVMTCkJCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CiAgICAKICAgIGlmIChkd0ZsYWdzICYgTUNJX1NUQVRVU19JVEVNKSB7Cglzd2l0Y2ggKGxwUGFybXMtPmR3SXRlbSkgewoJY2FzZSBNQ0lfU1RBVFVTX0NVUlJFTlRfVFJBQ0s6CgkgICAgLyogRklYTUUgaW4gRm9ybWF0IDIgKi8KCSAgICBscFBhcm1zLT5kd1JldHVybiA9IDE7CgkgICAgVFJBQ0UoIk1DSV9TVEFUVVNfQ1VSUkVOVF9UUkFDSyA9PiAlbHVcbiIsIGxwUGFybXMtPmR3UmV0dXJuKTsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NUQVRVU19MRU5HVEg6CgkgICAgaWYgKChkd0ZsYWdzICYgTUNJX1RSQUNLKSAmJiB3bW0tPndGb3JtYXQgPT0gMikgewoJCWlmIChscFBhcm1zLT5kd1RyYWNrID49IHdtbS0+blRyYWNrcykKCQkgICAgcmV0dXJuIE1DSUVSUl9CQURfSU5URUdFUjsKCQkvKiBGSVhNRTogdGhpcyBpcyB3cm9uZyBpZiB0aGVyZSBpcyBhIHRlbXBvIGNoYW5nZSBpbnNpZGUgdGhlIGZpbGUgKi8KCQlscFBhcm1zLT5kd1JldHVybiA9IE1JRElfQ29udmVydFB1bHNlVG9NUyh3bW0sIHdtbS0+dHJhY2tzW2xwUGFybXMtPmR3VHJhY2tdLmR3TGVuZ3RoKTsKCSAgICB9IGVsc2UgewoJCWxwUGFybXMtPmR3UmV0dXJuID0gTUlESV9HZXRNVGhkTGVuZ3RoTVMod21tKTsKCSAgICB9CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBNSURJX0NvbnZlcnRNU1RvVGltZUZvcm1hdCh3bW0sIGxwUGFybXMtPmR3UmV0dXJuKTsKCSAgICBUUkFDRSgiTUNJX1NUQVRVU19MRU5HVEggPT4gJWx1XG4iLCBscFBhcm1zLT5kd1JldHVybik7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TVEFUVVNfTU9ERToKIAkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSB3bW0tPmR3U3RhdHVzOwoJICAgIFRSQUNFKCJNQ0lfU1RBVFVTX01PREUgPT4gJWx1XG4iLCBscFBhcm1zLT5kd1JldHVybik7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TVEFUVVNfTUVESUFfUFJFU0VOVDoKCSAgICBUUkFDRSgiTUNJX1NUQVRVU19NRURJQV9QUkVTRU5UID0+IFRSVUVcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NUQVRVU19OVU1CRVJfT0ZfVFJBQ0tTOgoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gKHdtbS0+d0Zvcm1hdCA9PSAyKSA/IHdtbS0+blRyYWNrcyA6IDE7CgkgICAgVFJBQ0UoIk1DSV9TVEFUVVNfTlVNQkVSX09GX1RSQUNLUyA9PiAlbHVcbiIsIGxwUGFybXMtPmR3UmV0dXJuKTsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NUQVRVU19QT1NJVElPTjoKCSAgICAvKiBGSVhNRTogZG8gSSBuZWVkIHRvIHVzZSBNQ0lfVFJBQ0sgPyAqLwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gTUlESV9Db252ZXJ0TVNUb1RpbWVGb3JtYXQod21tLCAKCQkJCQkJCSAgIChkd0ZsYWdzICYgTUNJX1NUQVRVU19TVEFSVCkgPyAwIDogd21tLT5kd1Bvc2l0aW9uTVMpOwoJICAgIFRSQUNFKCJNQ0lfU1RBVFVTX1BPU0lUSU9OICVzID0+ICVsdVxuIiwgCgkJICAoZHdGbGFncyAmIE1DSV9TVEFUVVNfU1RBUlQpID8gInN0YXJ0IiA6ICJjdXJyZW50IiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU1RBVFVTX1JFQURZOgoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gKHdtbS0+ZHdTdGF0dXMgIT0gTUNJX01PREVfTk9UX1JFQURZKTsKCSAgICBUUkFDRSgiTUNJX1NUQVRVU19SRUFEWSA9ICVsdVxuIiwgbHBQYXJtcy0+ZHdSZXR1cm4pOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU1RBVFVTX1RJTUVfRk9STUFUOgoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gd21tLT5kd01jaVRpbWVGb3JtYXQ7CgkgICAgVFJBQ0UoIk1DSV9TVEFUVVNfVElNRV9GT1JNQVQgPT4gJWx1XG4iLCBscFBhcm1zLT5kd1JldHVybik7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TRVFfU1RBVFVTX0RJVlRZUEU6CgkgICAgVFJBQ0UoIk1DSV9TRVFfU1RBVFVTX0RJVlRZUEUgIVxuIik7CgkgICAgaWYgKHdtbS0+bkRpdmlzaW9uID4gMHg4MDAwKSB7CgkJc3dpdGNoICh3bW0tPm5EaXZpc2lvbikgewoJCWNhc2UgMHhFODoJbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQ0lfU0VRX0RJVl9TTVBURV8yNDsJYnJlYWs7CS8qIC0yNCAqLwoJCWNhc2UgMHhFNzoJbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQ0lfU0VRX0RJVl9TTVBURV8yNTsJYnJlYWs7CS8qIC0yNSAqLwoJCWNhc2UgMHhFMzoJbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQ0lfU0VRX0RJVl9TTVBURV8zMERST1A7CWJyZWFrOwkvKiAtMjkgKi8gLyogaXMgdGhlIE1DSSBjb25zdGFudCBjb3JyZWN0ID8gKi8KCQljYXNlIDB4RTI6CWxwUGFybXMtPmR3UmV0dXJuID0gTUNJX1NFUV9ESVZfU01QVEVfMzA7CWJyZWFrOwkvKiAtMzAgKi8KCQlkZWZhdWx0OglGSVhNRSgiVGhlcmUgaXMgYSBiYWQgYmFkIHByb2dyYW1tZXJcbiIpOwoJCX0KCSAgICB9IGVsc2UgewoJCWxwUGFybXMtPmR3UmV0dXJuID0gTUNJX1NFUV9ESVZfUFBRTjsKCSAgICB9CgkgICAgYnJlYWs7CgljYXNlIE1DSV9TRVFfU1RBVFVTX01BU1RFUjoKCSAgICBUUkFDRSgiTUNJX1NFUV9TVEFUVVNfTUFTVEVSICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gMDsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NFUV9TVEFUVVNfU0xBVkU6CgkgICAgVFJBQ0UoIk1DSV9TRVFfU1RBVFVTX1NMQVZFICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gMDsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NFUV9TVEFUVVNfT0ZGU0VUOgoJICAgIFRSQUNFKCJNQ0lfU0VRX1NUQVRVU19PRkZTRVQgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSAwOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfU0VRX1NUQVRVU19QT1JUOgoJICAgIFRSQUNFKCJNQ0lfU0VRX1NUQVRVU19QT1JUICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gMDsKCSAgICBicmVhazsKCWNhc2UgTUNJX1NFUV9TVEFUVVNfVEVNUE86CgkgICAgVFJBQ0UoIk1DSV9TRVFfU1RBVFVTX1RFTVBPICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gd21tLT5kd1RlbXBvOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICBXQVJOKCJVbmtub3dtIGNvbW1hbmQgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdJdGVtKTsKCSAgICByZXR1cm4gTUNJRVJSX1VOUkVDT0dOSVpFRF9DT01NQU5EOwoJfQogICAgfSBlbHNlIHsKCVdBUk4oIk5vIFN0YXR1cy1JdGVtIVxuIik7CglyZXR1cm4gTUNJRVJSX1VOUkVDT0dOSVpFRF9DT01NQU5EOwogICAgfQogICAgaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7CglUUkFDRSgiTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwoJbWNpRHJpdmVyTm90aWZ5MTYoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAoJCQkgIHdtbS0+d05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lHZXREZXZDYXBzCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgRFdPUkQgTUlESV9tY2lHZXREZXZDYXBzKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIAoJCQkJTFBNQ0lfR0VUREVWQ0FQU19QQVJNUyBscFBhcm1zKQp7CiAgICBXSU5FX01DSU1JREkqCXdtbSA9IE1JRElfbWNpR2V0T3BlbkRldih3RGV2SUQpOwogICAgCiAgICBUUkFDRSgiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogICAgCiAgICBpZiAobHBQYXJtcyA9PSBOVUxMKSAJcmV0dXJuIE1DSUVSUl9OVUxMX1BBUkFNRVRFUl9CTE9DSzsKICAgIGlmICh3bW0gPT0gTlVMTCkJCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfSUQ7CiAgICAKICAgIGlmIChkd0ZsYWdzICYgTUNJX0dFVERFVkNBUFNfSVRFTSkgewoJc3dpdGNoIChscFBhcm1zLT5kd0l0ZW0pIHsKCWNhc2UgTUNJX0dFVERFVkNBUFNfREVWSUNFX1RZUEU6CgkgICAgVFJBQ0UoIk1DSV9HRVRERVZDQVBTX0RFVklDRV9UWVBFICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gTUNJX0RFVlRZUEVfU0VRVUVOQ0VSOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19IQVNfQVVESU86CgkgICAgVFJBQ0UoIk1DSV9HRVRERVZDQVBTX0hBU19BVURJTyAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IFRSVUU7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9HRVRERVZDQVBTX0hBU19WSURFTzoKCSAgICBUUkFDRSgiTUNJX0dFVERFVkNBUFNfSEFTX1ZJREVPICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gRkFMU0U7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9HRVRERVZDQVBTX1VTRVNfRklMRVM6CgkgICAgVFJBQ0UoIk1DSV9HRVRERVZDQVBTX1VTRVNfRklMRVMgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBUUlVFOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19DT01QT1VORF9ERVZJQ0U6CgkgICAgVFJBQ0UoIk1DSV9HRVRERVZDQVBTX0NPTVBPVU5EX0RFVklDRSAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IFRSVUU7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9HRVRERVZDQVBTX0NBTl9FSkVDVDoKCSAgICBUUkFDRSgiTUNJX0dFVERFVkNBUFNfQ0FOX0VKRUNUICFcbiIpOwoJICAgIGxwUGFybXMtPmR3UmV0dXJuID0gRkFMU0U7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9HRVRERVZDQVBTX0NBTl9QTEFZOgoJICAgIFRSQUNFKCJNQ0lfR0VUREVWQ0FQU19DQU5fUExBWSAhXG4iKTsKCSAgICBscFBhcm1zLT5kd1JldHVybiA9IFRSVUU7CgkgICAgYnJlYWs7CgljYXNlIE1DSV9HRVRERVZDQVBTX0NBTl9SRUNPUkQ6CgkgICAgVFJBQ0UoIk1DSV9HRVRERVZDQVBTX0NBTl9SRUNPUkQgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBUUlVFOwoJICAgIGJyZWFrOwoJY2FzZSBNQ0lfR0VUREVWQ0FQU19DQU5fU0FWRToKCSAgICBUUkFDRSgiTUNJX0dFVERFVkNBUFNfQ0FOX1NBVkUgIVxuIik7CgkgICAgbHBQYXJtcy0+ZHdSZXR1cm4gPSBGQUxTRTsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgVFJBQ0UoIlVua25vd24gY2FwYWJpbGl0eSAoJTA4bHgpICFcbiIsIGxwUGFybXMtPmR3SXRlbSk7CgkgICAgcmV0dXJuIE1DSUVSUl9VTlJFQ09HTklaRURfQ09NTUFORDsKCX0KICAgIH0gZWxzZSB7CglUUkFDRSgiTm8gR2V0RGV2Q2Fwcy1JdGVtICFcbiIpOwoJcmV0dXJuIE1DSUVSUl9VTlJFQ09HTklaRURfQ09NTUFORDsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCU1JRElfbWNpSW5mbwkJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBEV09SRCBNSURJX21jaUluZm8oVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfSU5GT19QQVJNU0EgbHBQYXJtcykKewogICAgRFdPUkQJCXJldCA9IDA7CiAgICBMUFNUUgkJc3RyID0gMDsKICAgIFdJTkVfTUNJTUlESSoJd21tID0gTUlESV9tY2lHZXRPcGVuRGV2KHdEZXZJRCk7CiAgICAKICAgIFRSQUNFKCIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAgICAKICAgIGlmIChscFBhcm1zID09IE5VTEwgfHwgbHBQYXJtcy0+bHBzdHJSZXR1cm4gPT0gTlVMTCkgewoJcmV0ID0gTUNJRVJSX05VTExfUEFSQU1FVEVSX0JMT0NLOwogICAgfSBlbHNlIGlmICh3bW0gPT0gTlVMTCkgewoJcmV0ID0gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgfSBlbHNlIHsKCVRSQUNFKCJidWY9JXAsIGxlbj0lbHVcbiIsIGxwUGFybXMtPmxwc3RyUmV0dXJuLCBscFBhcm1zLT5kd1JldFNpemUpOwoJCglzd2l0Y2ggKGR3RmxhZ3MpIHsKCWNhc2UgTUNJX0lORk9fUFJPRFVDVDoKCSAgICBzdHIgPSAiV2luZSdzIE1JREkgc2VxdWVuY2VyIjsKCSAgICBicmVhazsKCWNhc2UgTUNJX0lORk9fRklMRToKCSAgICBzdHIgPSB3bW0tPm9wZW5QYXJtcy5scHN0ckVsZW1lbnROYW1lOwoJICAgIGJyZWFrOwojaWYgMAoJICAgIC8qIEZJWE1FOiB0aGUgZm9sbG93aW5nIG1hbmlmZXN0IGNvbnN0YW50cyBhcmUgbm90IGRlZmluZWQgaW4gPFdJTkU+L2luY2x1ZGUvbW1zeXN0ZW0uaCAqLwoJY2FzZSBNQ0lfSU5GT19DT1BZUklHSFQ6CgkgICAgYnJlYWs7CgljYXNlIE1DSV9JTkZPX05BTUU6CgkgICAgYnJlYWs7CiNlbmRpZgoJZGVmYXVsdDoKCSAgICBXQVJOKCJEb24ndCBrbm93IHRoaXMgaW5mbyBjb21tYW5kICglbHUpXG4iLCBkd0ZsYWdzKTsKCSAgICByZXQgPSBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ7Cgl9CiAgICB9CiAgICBpZiAoc3RyKSB7CglyZXQgPSBNQ0lfV3JpdGVTdHJpbmcobHBQYXJtcy0+bHBzdHJSZXR1cm4sIGxwUGFybXMtPmR3UmV0U2l6ZSwgc3RyKTsKICAgIH0gZWxzZSB7CglscFBhcm1zLT5scHN0clJldHVyblswXSA9IDA7CiAgICB9CiAgICAKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lTZWVrCQkJW2ludGVybmFsXQogKi8Kc3RhdGljIERXT1JEIE1JRElfbWNpU2VlayhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TRUVLX1BBUk1TIGxwUGFybXMpCnsKICAgIERXT1JECQlyZXQgPSAwOwogICAgV0lORV9NQ0lNSURJKgl3bW0gPSBNSURJX21jaUdldE9wZW5EZXYod0RldklEKTsKICAgIAogICAgVFJBQ0UoIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKICAgIAogICAgaWYgKGxwUGFybXMgPT0gTlVMTCkgewoJcmV0ID0gTUNJRVJSX05VTExfUEFSQU1FVEVSX0JMT0NLOwogICAgfSBlbHNlIGlmICh3bW0gPT0gTlVMTCkgewoJcmV0ID0gTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEOwogICAgfSBlbHNlIHsKCU1JRElfbWNpU3RvcCh3RGV2SUQsIE1DSV9XQUlULCAwKTsKCQoJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VFS19UT19TVEFSVCkgewoJICAgIHdtbS0+ZHdQb3NpdGlvbk1TID0gMDsKCX0gZWxzZSBpZiAoZHdGbGFncyAmIE1DSV9TRUVLX1RPX0VORCkgewoJICAgIHdtbS0+ZHdQb3NpdGlvbk1TID0gMHhGRkZGRkZGRjsgLyogZml4bWUgKi8KCX0gZWxzZSBpZiAoZHdGbGFncyAmIE1DSV9UTykgewoJICAgIHdtbS0+ZHdQb3NpdGlvbk1TID0gTUlESV9Db252ZXJ0VGltZUZvcm1hdFRvTVMod21tLCBscFBhcm1zLT5kd1RvKTsKCX0gZWxzZSB7CgkgICAgV0FSTigiZHdGbGFnIGRvZXNuJ3QgdGVsbCB3aGVyZSB0byBzZWVrIHRvLi4uXG4iKTsKCSAgICByZXR1cm4gTUNJRVJSX01JU1NJTkdfUEFSQU1FVEVSOwoJfQoJCglUUkFDRSgiU2Vla2luZyB0byBwb3NpdGlvbj0lbHUgbXNcbiIsIHdtbS0+ZHdQb3NpdGlvbk1TKTsKCQoJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7CgkgICAgVFJBQ0UoIk1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKCSAgICBtY2lEcml2ZXJOb3RpZnkxNigoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCgkJCSAgICAgIHdtbS0+d05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwoJfQogICAgfQogICAgcmV0dXJuIHJldDsJCn0gICAgCiNlbmRpZgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KgogKiAgICAgICAgICAgICAgICAgIAkgICAgTUlESSBlbnRyeSBwb2ludHMgCQkJCSoKICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUNJTUlESV9Ecml2ZXJQcm9jCSAgICAgW3NhbXBsZSBkcml2ZXJdCiAqLwpMT05HIENBTExCQUNLCU1DSU1JRElfRHJpdmVyUHJvYyhEV09SRCBkd0RldklELCBIRFJWUiBoRHJpdiwgRFdPUkQgd01zZywgCgkJCQkgICBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCnsKICAgIHN3aXRjaCAod01zZykgewogICAgY2FzZSBEUlZfTE9BRDoJCXJldHVybiAxOwogICAgY2FzZSBEUlZfRlJFRToJCXJldHVybiAxOwogICAgY2FzZSBEUlZfRU5BQkxFOgkJcmV0dXJuIDE7CiAgICBjYXNlIERSVl9ESVNBQkxFOgkJcmV0dXJuIDE7CiAgICBjYXNlIERSVl9RVUVSWUNPTkZJR1VSRToJcmV0dXJuIDE7CiAgICBjYXNlIERSVl9DT05GSUdVUkU6CQlNZXNzYWdlQm94QSgwLCAiU2FtcGxlIE1pZGkgRHJpdmVyICEiLCAiT1NTIERyaXZlciIsIE1CX09LKTsgcmV0dXJuIDE7CiAgICBjYXNlIERSVl9JTlNUQUxMOgkJcmV0dXJuIERSVkNORl9SRVNUQVJUOwogICAgY2FzZSBEUlZfUkVNT1ZFOgkJcmV0dXJuIERSVkNORl9SRVNUQVJUOwojaWZkZWYgU05EQ1RMX01JRElfSU5GTwogICAgY2FzZSBEUlZfT1BFTjoJCXJldHVybiBNSURJX2Rydk9wZW4oKExQU1RSKWR3UGFyYW0xLCAoTFBNQ0lfT1BFTl9EUklWRVJfUEFSTVNBKWR3UGFyYW0yKTsKICAgIGNhc2UgRFJWX0NMT1NFOgkJcmV0dXJuIE1JRElfZHJ2Q2xvc2UoZHdEZXZJRCk7CiAgICBjYXNlIE1DSV9PUEVOX0RSSVZFUjoJcmV0dXJuIE1JRElfbWNpT3BlbiAgICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX09QRU5fUEFSTVNBKSAgICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfQ0xPU0VfRFJJVkVSOglyZXR1cm4gTUlESV9tY2lDbG9zZSAgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VORVJJQ19QQVJNUykgICBkd1BhcmFtMik7CiAgICBjYXNlIE1DSV9QTEFZOgkJcmV0dXJuIE1JRElfbWNpUGxheSAgICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX1BMQVlfUEFSTVMpICAgICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfUkVDT1JEOgkJcmV0dXJuIE1JRElfbWNpUmVjb3JkICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX1JFQ09SRF9QQVJNUykgICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfU1RPUDoJCXJldHVybiBNSURJX21jaVN0b3AgICAgICAoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9HRU5FUklDX1BBUk1TKSAgIGR3UGFyYW0yKTsKICAgIGNhc2UgTUNJX1NFVDoJCXJldHVybiBNSURJX21jaVNldCAgICAgICAoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9TRVRfUEFSTVMpICAgICAgIGR3UGFyYW0yKTsKICAgIGNhc2UgTUNJX1BBVVNFOgkJcmV0dXJuIE1JRElfbWNpUGF1c2UgICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX0dFTkVSSUNfUEFSTVMpICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfUkVTVU1FOgkJcmV0dXJuIE1JRElfbWNpUmVzdW1lICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX0dFTkVSSUNfUEFSTVMpICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfU1RBVFVTOgkJcmV0dXJuIE1JRElfbWNpU3RhdHVzICAgIChkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX1NUQVRVU19QQVJNUykgICAgZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfR0VUREVWQ0FQUzoJcmV0dXJuIE1JRElfbWNpR2V0RGV2Q2Fwcyhkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX0dFVERFVkNBUFNfUEFSTVMpZHdQYXJhbTIpOwogICAgY2FzZSBNQ0lfSU5GTzoJCXJldHVybiBNSURJX21jaUluZm8gICAgICAoZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9JTkZPX1BBUk1TQSkgICAgIGR3UGFyYW0yKTsKICAgIGNhc2UgTUNJX1NFRUs6CQlyZXR1cm4gTUlESV9tY2lTZWVrICAgICAgKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfU0VFS19QQVJNUykgICAgICBkd1BhcmFtMik7CiNlbHNlCiAgICBjYXNlIERSVl9PUEVOOgkJcmV0dXJuIDE7CiAgICBjYXNlIERSVl9DTE9TRToJCXJldHVybiAxOwogICAgY2FzZSBNQ0lfT1BFTl9EUklWRVI6CiAgICBjYXNlIE1DSV9DTE9TRV9EUklWRVI6CiAgICBjYXNlIE1DSV9QTEFZOgogICAgY2FzZSBNQ0lfUkVDT1JEOgogICAgY2FzZSBNQ0lfU1RPUDoKICAgIGNhc2UgTUNJX1NFVDoKICAgIGNhc2UgTUNJX1BBVVNFOgogICAgY2FzZSBNQ0lfUkVTVU1FOgogICAgY2FzZSBNQ0lfU1RBVFVTOgogICAgY2FzZSBNQ0lfR0VUREVWQ0FQUzoKICAgIGNhc2UgTUNJX0lORk86CiAgICBjYXNlIE1DSV9TRUVLOgojZW5kaWYKICAgIGNhc2UgTUNJX0xPQUQ6CQkKICAgIGNhc2UgTUNJX1NBVkU6CQkKICAgIGNhc2UgTUNJX0ZSRUVaRToJCQogICAgY2FzZSBNQ0lfUFVUOgkJCiAgICBjYXNlIE1DSV9SRUFMSVpFOgkJCiAgICBjYXNlIE1DSV9VTkZSRUVaRToJCQogICAgY2FzZSBNQ0lfVVBEQVRFOgkJCiAgICBjYXNlIE1DSV9XSEVSRToJCQogICAgY2FzZSBNQ0lfV0lORE9XOgkJCiAgICBjYXNlIE1DSV9TVEVQOgkJCiAgICBjYXNlIE1DSV9TUElOOgkJCiAgICBjYXNlIE1DSV9FU0NBUEU6CQkKICAgIGNhc2UgTUNJX0NPUFk6CQkKICAgIGNhc2UgTUNJX0NVVDoJCQogICAgY2FzZSBNQ0lfREVMRVRFOgkJCiAgICBjYXNlIE1DSV9QQVNURToJCQoJV0FSTigiVW5zdXBwb3J0ZWQgY29tbWFuZD0lc1xuIiwgTUNJX0NvbW1hbmRUb1N0cmluZyh3TXNnKSk7CglicmVhazsKICAgIGNhc2UgTUNJX09QRU46CiAgICBjYXNlIE1DSV9DTE9TRToKCUZJWE1FKCJTaG91bGRuJ3QgcmVjZWl2ZSBhIE1DSV9PUEVOIG9yIENMT1NFIG1lc3NhZ2VcbiIpOwoJYnJlYWs7CiAgICBkZWZhdWx0OgkJCQoJVFJBQ0UoIlNlbmRpbmcgbXNnPSVzIHRvIGRlZmF1bHQgZHJpdmVyIHByb2NcbiIsIE1DSV9Db21tYW5kVG9TdHJpbmcod01zZykpOwoJcmV0dXJuIERlZkRyaXZlclByb2MoZHdEZXZJRCwgaERyaXYsIHdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAgICB9CiAgICByZXR1cm4gTUNJRVJSX1VOUkVDT0dOSVpFRF9DT01NQU5EOwp9CgogICAgCg==