LyoKICogYWJzdHJhY3Rpb24gb2YgdGhlIHNwaSBpbnRlcmZhY2Ugb2YgSG9wZVJmIHJmNjkgcmFkaW8gbW9kdWxlCiAqCiAqIENvcHlyaWdodCAoQykgMjAxNiBXb2xmLUVudHdpY2tsdW5nZW4KICoJTWFyY3VzIFdvbGYgPGxpbnV4QHdvbGYtZW50d2lja2x1bmdlbi5kZT4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICovCgovKiBlbmFibGUgcHJvc2EgZGVidWcgaW5mbyAqLwojdW5kZWYgREVCVUcKLyogZW5hYmxlIHByaW50IG9mIHZhbHVlcyBvbiByZWcgYWNjZXNzICovCiN1bmRlZiBERUJVR19WQUxVRVMKLyogZW5hYmxlIHByaW50IG9mIHZhbHVlcyBvbiBmaWZvIGFjY2VzcyAqLwojdW5kZWYgREVCVUdfRklGT19BQ0NFU1MKCiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgojaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgoKI2luY2x1ZGUgInJmNjkuaCIKI2luY2x1ZGUgInJmNjlfcmVnaXN0ZXJzLmgiCgojZGVmaW5lIEZfT1NDCSAgMzIwMDAwMDAgLyogaW4gSHogKi8KI2RlZmluZSBGSUZPX1NJWkUgNjYgCSAgIC8qIGluIGJ5dGUgKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgojZGVmaW5lIFJFQURfUkVHKHgpCXJmNjlfcmVhZF9yZWcgKHNwaSwgeCkKI2RlZmluZSBXUklURV9SRUcoeCwgeSkJcmY2OV93cml0ZV9yZWcoc3BpLCB4LCB5KQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCmludCByZjY5X3NldF9tb2RlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gbW9kZSBtb2RlKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogbW9kZSIpOwoJI2VuZGlmCgoJc3dpdGNoIChtb2RlKSB7CgljYXNlIHRyYW5zbWl0OgkgIHJldHVybiBXUklURV9SRUcoUkVHX09QTU9ERSwgKFJFQURfUkVHKFJFR19PUE1PREUpICYgfk1BU0tfT1BNT0RFX01PREUpIHwgT1BNT0RFX01PREVfVFJBTlNNSVQpOwoJY2FzZSByZWNlaXZlOgkgIHJldHVybiBXUklURV9SRUcoUkVHX09QTU9ERSwgKFJFQURfUkVHKFJFR19PUE1PREUpICYgfk1BU0tfT1BNT0RFX01PREUpIHwgT1BNT0RFX01PREVfUkVDRUlWRSk7CgljYXNlIHN5bnRoZXNpemVyOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PUE1PREUsIChSRUFEX1JFRyhSRUdfT1BNT0RFKSAmIH5NQVNLX09QTU9ERV9NT0RFKSB8IE9QTU9ERV9NT0RFX1NZTlRIRVNJWkVSKTsKCWNhc2Ugc3RhbmRieToJICByZXR1cm4gV1JJVEVfUkVHKFJFR19PUE1PREUsIChSRUFEX1JFRyhSRUdfT1BNT0RFKSAmIH5NQVNLX09QTU9ERV9NT0RFKSB8IE9QTU9ERV9NT0RFX1NUQU5EQlkpOwoJY2FzZSBtb2RlX3NsZWVwOiAgcmV0dXJuIFdSSVRFX1JFRyhSRUdfT1BNT0RFLCAoUkVBRF9SRUcoUkVHX09QTU9ERSkgJiB+TUFTS19PUE1PREVfTU9ERSkgfCBPUE1PREVfTU9ERV9TTEVFUCk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJLy8gd2UgYXJlIHVzaW5nIHBhY2tldCBtb2RlLCBzbyB0aGlzIGNoZWNrIGlzIG5vdCByZWFsbHkgbmVlZGVkCgkvLyBidXQgd2FpdGluZyBmb3IgbW9kZSByZWFkeSBpcyBuZWNlc3Nhcnkgd2hlbiBnb2luZyBmcm9tIHNsZWVwIGJlY2F1c2UgdGhlIEZJRk8gbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgZnJvbSBwcmV2aW91cyBtb2RlCgkvL3doaWxlIChfbW9kZSA9PSBSRjY5X01PREVfU0xFRVAgJiYgKFJFQURfUkVHKFJFR19JUlFGTEFHUzEpICYgUkZfSVJRRkxBR1MxX01PREVSRUFEWSkgPT0gMHgwMCk7IC8vIFdhaXQgZm9yIE1vZGVSZWFkeQoKfQoKaW50IHJmNjlfc2V0X2RhdGFfbW9kZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIGRhdGFNb2RlIGRhdGFNb2RlKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogZGF0YSBtb2RlIik7CgkjZW5kaWYKCglzd2l0Y2ggKGRhdGFNb2RlKSB7CgljYXNlIHBhY2tldDoJCXJldHVybiBXUklURV9SRUcoUkVHX0RBVEFNT0RVTCwgKFJFQURfUkVHKFJFR19EQVRBTU9EVUwpICYgfk1BU0tfREFUQU1PRFVMX01PREUpIHwgREFUQU1PRFVMX01PREVfUEFDS0VUKTsKCWNhc2UgY29udGludW91czoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfREFUQU1PRFVMLCAoUkVBRF9SRUcoUkVHX0RBVEFNT0RVTCkgJiB+TUFTS19EQVRBTU9EVUxfTU9ERSkgfCBEQVRBTU9EVUxfTU9ERV9DT05USU5VT1VTKTsKCWNhc2UgY29udGludW91c05vU3luYzogIHJldHVybiBXUklURV9SRUcoUkVHX0RBVEFNT0RVTCwgKFJFQURfUkVHKFJFR19EQVRBTU9EVUwpICYgfk1BU0tfREFUQU1PRFVMX01PREUpIHwgREFUQU1PRFVMX01PREVfQ09OVElOVU9VU19OT1NZTkMpOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgppbnQgcmY2OV9zZXRfbW9kdWxhdGlvbihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIG1vZHVsYXRpb24gbW9kdWxhdGlvbikKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IG1vZHVsYXRpb24iKTsKCSNlbmRpZgoKCXN3aXRjaCAobW9kdWxhdGlvbikgewoJY2FzZSBPT0s6ICAgcmV0dXJuIFdSSVRFX1JFRyhSRUdfREFUQU1PRFVMLCAoUkVBRF9SRUcoUkVHX0RBVEFNT0RVTCkgJiB+TUFTS19EQVRBTU9EVUxfTU9EVUxBVElPTl9UWVBFKSB8IERBVEFNT0RVTF9NT0RVTEFUSU9OX1RZUEVfT09LKTsKCWNhc2UgRlNLOiAgIHJldHVybiBXUklURV9SRUcoUkVHX0RBVEFNT0RVTCwgKFJFQURfUkVHKFJFR19EQVRBTU9EVUwpICYgfk1BU0tfREFUQU1PRFVMX01PRFVMQVRJT05fVFlQRSkgfCBEQVRBTU9EVUxfTU9EVUxBVElPTl9UWVBFX0ZTSyk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmVudW0gbW9kdWxhdGlvbiByZjY5X2dldF9tb2R1bGF0aW9uKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCnsKCXU4IGN1cnJlbnRWYWx1ZTsKCgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgImdldDogbW9kZSIpOwoJI2VuZGlmCgoJY3VycmVudFZhbHVlID0gUkVBRF9SRUcoUkVHX0RBVEFNT0RVTCk7CgoJc3dpdGNoIChjdXJyZW50VmFsdWUgJiBNQVNLX0RBVEFNT0RVTF9NT0RVTEFUSU9OX1RZUEUpIHsKCWNhc2UgREFUQU1PRFVMX01PRFVMQVRJT05fVFlQRV9PT0s6IHJldHVybiBPT0s7CgljYXNlIERBVEFNT0RVTF9NT0RVTEFUSU9OX1RZUEVfRlNLOiByZXR1cm4gRlNLOwoJZGVmYXVsdDoJCQkgICAgcmV0dXJuIHVuZGVmaW5lZDsKCX0KfQoKaW50IHJmNjlfc2V0X21vZHVsYXRpb25fc2hhcGluZyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIG1vZFNoYXBpbmcgbW9kU2hhcGluZykKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IG1vZCBzaGFwaW5nIik7CgkjZW5kaWYKCglpZiAocmY2OV9nZXRfbW9kdWxhdGlvbihzcGkpID09IEZTSykgewoJCXN3aXRjaCAobW9kU2hhcGluZykgewoJCWNhc2Ugc2hhcGluZ09mZjogcmV0dXJuIFdSSVRFX1JFRyhSRUdfREFUQU1PRFVMLCAoUkVBRF9SRUcoUkVHX0RBVEFNT0RVTCkgJiB+TUFTS19EQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRSkgfCBEQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRV9OT05FKTsKCQljYXNlIHNoYXBpbmcxXzA6IHJldHVybiBXUklURV9SRUcoUkVHX0RBVEFNT0RVTCwgKFJFQURfUkVHKFJFR19EQVRBTU9EVUwpICYgfk1BU0tfREFUQU1PRFVMX01PRFVMQVRJT05fU0hBUEUpIHwgREFUQU1PRFVMX01PRFVMQVRJT05fU0hBUEVfMV8wKTsKCQljYXNlIHNoYXBpbmcwXzU6IHJldHVybiBXUklURV9SRUcoUkVHX0RBVEFNT0RVTCwgKFJFQURfUkVHKFJFR19EQVRBTU9EVUwpICYgfk1BU0tfREFUQU1PRFVMX01PRFVMQVRJT05fU0hBUEUpIHwgREFUQU1PRFVMX01PRFVMQVRJT05fU0hBUEVfMF8zKTsKCQljYXNlIHNoYXBpbmcwXzM6IHJldHVybiBXUklURV9SRUcoUkVHX0RBVEFNT0RVTCwgKFJFQURfUkVHKFJFR19EQVRBTU9EVUwpICYgfk1BU0tfREFUQU1PRFVMX01PRFVMQVRJT05fU0hBUEUpIHwgREFUQU1PRFVMX01PRFVMQVRJT05fU0hBUEVfMF81KTsKCQlkZWZhdWx0OgoJCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCQlyZXR1cm4gLUVJTlZBTDsKCQl9Cgl9IGVsc2UgewoJCXN3aXRjaCAobW9kU2hhcGluZykgewoJCWNhc2Ugc2hhcGluZ09mZjogcmV0dXJuIFdSSVRFX1JFRyhSRUdfREFUQU1PRFVMLCAoUkVBRF9SRUcoUkVHX0RBVEFNT0RVTCkgJiB+TUFTS19EQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRSkgfCBEQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRV9OT05FKTsKCQljYXNlIHNoYXBpbmdCUjoJIHJldHVybiBXUklURV9SRUcoUkVHX0RBVEFNT0RVTCwgKFJFQURfUkVHKFJFR19EQVRBTU9EVUwpICYgfk1BU0tfREFUQU1PRFVMX01PRFVMQVRJT05fU0hBUEUpIHwgREFUQU1PRFVMX01PRFVMQVRJT05fU0hBUEVfQlIpOwoJCWNhc2Ugc2hhcGluZzJCUjogcmV0dXJuIFdSSVRFX1JFRyhSRUdfREFUQU1PRFVMLCAoUkVBRF9SRUcoUkVHX0RBVEFNT0RVTCkgJiB+TUFTS19EQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRSkgfCBEQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRV8yQlIpOwoJCWRlZmF1bHQ6CgkJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJCXJldHVybiAtRUlOVkFMOwoJCX0KCX0KfQoKaW50IHJmNjlfc2V0X2JpdF9yYXRlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHUxNiBiaXRSYXRlKQp7CglpbnQgcmV0dmFsOwoJdTMyIGJpdFJhdGVfbWluOwoJdTMyIGJpdFJhdGVfcmVnOwoJdTggbXNiOwoJdTggbHNiOwoKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBiaXQgcmF0ZSIpOwoJI2VuZGlmCgoJLy8gY2hlY2sgaW5wdXQgdmFsdWUKCWJpdFJhdGVfbWluID0gRl9PU0MgLyA4Mzg4NjA4OyAvLyA4Mzg4NjA4ID0gMl4yMzsKCWlmIChiaXRSYXRlIDwgYml0UmF0ZV9taW4pIHsKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldEJpdFJhdGU6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvLyBjYWxjdWxhdGUgcmVnIHNldHRpbmdzCgliaXRSYXRlX3JlZyA9IChGX09TQyAvIGJpdFJhdGUpOwoKCW1zYiA9IChiaXRSYXRlX3JlZyYweGZmMDApICAgPj4gIDg7Cglsc2IgPSAoYml0UmF0ZV9yZWcmMHhmZik7CgoJLy8gdHJhbnNtaXQgdG8gUkYgNjkKCXJldHZhbCA9IFdSSVRFX1JFRyhSRUdfQklUUkFURV9NU0IsIG1zYik7CglpZiAocmV0dmFsKQoJCXJldHVybiByZXR2YWw7CgoJcmV0dmFsID0gV1JJVEVfUkVHKFJFR19CSVRSQVRFX0xTQiwgbHNiKTsKCWlmIChyZXR2YWwpCgkJcmV0dXJuIHJldHZhbDsKCglyZXR1cm4gMDsKfQoKaW50IHJmNjlfc2V0X2RldmlhdGlvbihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1MzIgZGV2aWF0aW9uKQp7CglpbnQgcmV0dmFsOwovLwl1MzIgZl9tYXg7IFRPRE86IEFiaORuZ2lna2VpdCB2b24gQml0cmF0ZSBiZWFjaHRlbiEhCgl1NjQgZl9yZWc7Cgl1NjQgZl9zdGVwOwoJdTggbXNiOwoJdTggbHNiOwoJdTY0IGZhY3RvciA9IDEwMDAwMDA7IC8vIHRvIGltcHJvdmUgcHJlY2lzaW9uIG9mIGNhbGN1bGF0aW9uCgoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGRldmlhdGlvbiIpOwoJI2VuZGlmCgoJaWYgKGRldmlhdGlvbiA8IDYwMCB8fCBkZXZpYXRpb24gPiA1MDAwMDApIHsgLy9UT0RPOiBBYmjkbmdpZ2tlaXQgdm9uIEJpdHJhdGUgYmVhY2h0ZW4hIQoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0X2RldmlhdGlvbjogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCS8vIGNhbGN1bGF0IGYgc3RlcAoJZl9zdGVwID0gRl9PU0MgKiBmYWN0b3I7Cglkb19kaXYoZl9zdGVwLCA1MjQyODgpOyAvLyAgNTI0Mjg4ID0gMl4xOQoKCS8vIGNhbGN1bGF0ZSByZWdpc3RlciBzZXR0aW5ncwoJZl9yZWcgPSBkZXZpYXRpb24gKiBmYWN0b3I7Cglkb19kaXYoZl9yZWcsIGZfc3RlcCk7CgoJbXNiID0gKGZfcmVnJjB4ZmYwMCkgICA+PiAgODsKCWxzYiA9IChmX3JlZyYweGZmKTsKCgkvLyBjaGVjayBtc2IKCWlmIChtc2IgJiB+RkRFVk1BU0JfTUFTSykgewoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0X2RldmlhdGlvbjogZXJyIGluIGNhbGMgb2YgbXNiIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJLy8gd3JpdGUgdG8gY2hpcAoJcmV0dmFsID0gV1JJVEVfUkVHKFJFR19GREVWX01TQiwgbXNiKTsKCWlmIChyZXR2YWwpCgkJcmV0dXJuIHJldHZhbDsKCglyZXR2YWwgPSBXUklURV9SRUcoUkVHX0ZERVZfTFNCLCBsc2IpOwoJaWYgKHJldHZhbCkKCQlyZXR1cm4gcmV0dmFsOwoKCXJldHVybiAwOwp9CgppbnQgcmY2OV9zZXRfZnJlcXVlbmN5KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHUzMiBmcmVxdWVuY3kpCnsKCWludCByZXR2YWw7Cgl1MzIgZl9tYXg7Cgl1NjQgZl9yZWc7Cgl1NjQgZl9zdGVwOwoJdTggbXNiOwoJdTggbWlkOwoJdTggbHNiOwoJdTY0IGZhY3RvciA9IDEwMDAwMDA7IC8vIHRvIGltcHJvdmUgcHJlY2lzaW9uIG9mIGNhbGN1bGF0aW9uCgoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGZyZXF1ZW5jeSIpOwoJI2VuZGlmCgoJLy8gY2FsY3VsYXQgZiBzdGVwCglmX3N0ZXAgPSBGX09TQyAqIGZhY3RvcjsKCWRvX2RpdihmX3N0ZXAsIDUyNDI4OCk7IC8vICA1MjQyODggPSAyXjE5CgoJLy8gY2hlY2sgaW5wdXQgdmFsdWUKCWZfbWF4ID0gZGl2X3U2NChmX3N0ZXAgKiA4Mzg4NjA4LCBmYWN0b3IpOwoJaWYgKGZyZXF1ZW5jeSA+IGZfbWF4KSB7CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXRGcmVxdWVuY3k6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvLyBjYWxjdWxhdGUgcmVnIHNldHRpbmdzCglmX3JlZyA9IGZyZXF1ZW5jeSAqIGZhY3RvcjsKCWRvX2RpdihmX3JlZywgZl9zdGVwKTsKCgltc2IgPSAoZl9yZWcmMHhmZjAwMDApID4+IDE2OwoJbWlkID0gKGZfcmVnJjB4ZmYwMCkgICA+PiAgODsKCWxzYiA9IChmX3JlZyYweGZmKTsKCgkvLyB3cml0ZSB0byBjaGlwCglyZXR2YWwgPSBXUklURV9SRUcoUkVHX0ZSRl9NU0IsIG1zYik7CglpZiAocmV0dmFsKQoJCXJldHVybiByZXR2YWw7CgoJcmV0dmFsID0gV1JJVEVfUkVHKFJFR19GUkZfTUlELCBtaWQpOwoJaWYgKHJldHZhbCkKCQlyZXR1cm4gcmV0dmFsOwoKCXJldHZhbCA9IFdSSVRFX1JFRyhSRUdfRlJGX0xTQiwgbHNiKTsKCWlmIChyZXR2YWwpCgkJcmV0dXJuIHJldHZhbDsKCglyZXR1cm4gMDsKfQoKaW50IHJmNjlfc2V0X2FtcGxpZmllcl8wKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gb3B0aW9uT25PZmYgb3B0aW9uT25PZmYpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBhbXAgIzAiKTsKCSNlbmRpZgoKCXN3aXRjaCAob3B0aW9uT25PZmYpIHsKCWNhc2Ugb3B0aW9uT246CXJldHVybiBXUklURV9SRUcoUkVHX1BBTEVWRUwsIChSRUFEX1JFRyhSRUdfUEFMRVZFTCkgfCAgTUFTS19QQUxFVkVMX1BBMCkpOwoJY2FzZSBvcHRpb25PZmY6CXJldHVybiBXUklURV9SRUcoUkVHX1BBTEVWRUwsIChSRUFEX1JFRyhSRUdfUEFMRVZFTCkgJiB+TUFTS19QQUxFVkVMX1BBMCkpOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgppbnQgcmY2OV9zZXRfYW1wbGlmaWVyXzEoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSBvcHRpb25Pbk9mZiBvcHRpb25Pbk9mZikKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGFtcCAjMSIpOwoJI2VuZGlmCgoJc3dpdGNoIChvcHRpb25Pbk9mZikgewoJY2FzZSBvcHRpb25PbjoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFMRVZFTCwgKFJFQURfUkVHKFJFR19QQUxFVkVMKSB8ICBNQVNLX1BBTEVWRUxfUEExKSk7CgljYXNlIG9wdGlvbk9mZjogcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFMRVZFTCwgKFJFQURfUkVHKFJFR19QQUxFVkVMKSAmIH5NQVNLX1BBTEVWRUxfUEExKSk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9hbXBsaWZpZXJfMihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIG9wdGlvbk9uT2ZmIG9wdGlvbk9uT2ZmKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogYW1wICMyIik7CgkjZW5kaWYKCglzd2l0Y2ggKG9wdGlvbk9uT2ZmKSB7CgljYXNlIG9wdGlvbk9uOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQUxFVkVMLCAoUkVBRF9SRUcoUkVHX1BBTEVWRUwpIHwgIE1BU0tfUEFMRVZFTF9QQTIpKTsKCWNhc2Ugb3B0aW9uT2ZmOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQUxFVkVMLCAoUkVBRF9SRUcoUkVHX1BBTEVWRUwpICYgfk1BU0tfUEFMRVZFTF9QQTIpKTsKCWRlZmF1bHQ6CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KfQoKaW50IHJmNjlfc2V0X291dHB1dF9wb3dlcl9sZXZlbChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCBwb3dlckxldmVsKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogcG93ZXIgbGV2ZWwiKTsKCSNlbmRpZgoKCXBvd2VyTGV2ZWwgKz0gMTg7IC8vIFRPRE8gQWJo5G5naWdrZWl0IHZvbiBQQTAsMSwyIHNldHRpbmcKCgkvLyBjaGVjayBpbnB1dCB2YWx1ZQoJaWYgKHBvd2VyTGV2ZWwgPiAweDFmKSB7CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvLyB3cml0ZSB2YWx1ZQoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFMRVZFTCwgKFJFQURfUkVHKFJFR19QQUxFVkVMKSAmIH5NQVNLX1BBTEVWRUxfT1VUUFVUX1BPV0VSKSB8IHBvd2VyTGV2ZWwpOwp9CgppbnQgcmY2OV9zZXRfcGFfcmFtcChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIHBhUmFtcCBwYVJhbXApCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBwYSByYW1wIik7CgkjZW5kaWYKCglzd2l0Y2ggKHBhUmFtcCkgewoJY2FzZSByYW1wMzQwMDoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFSQU1QLCBQQVJBTVBfMzQwMCk7CgljYXNlIHJhbXAyMDAwOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQVJBTVAsIFBBUkFNUF8yMDAwKTsKCWNhc2UgcmFtcDEwMDA6CXJldHVybiBXUklURV9SRUcoUkVHX1BBUkFNUCwgUEFSQU1QXzEwMDApOwoJY2FzZSByYW1wNTAwOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQVJBTVAsIFBBUkFNUF81MDApOwoJY2FzZSByYW1wMjUwOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQVJBTVAsIFBBUkFNUF8yNTApOwoJY2FzZSByYW1wMTI1OglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQVJBTVAsIFBBUkFNUF8xMjUpOwoJY2FzZSByYW1wMTAwOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQVJBTVAsIFBBUkFNUF8xMDApOwoJY2FzZSByYW1wNjI6CXJldHVybiBXUklURV9SRUcoUkVHX1BBUkFNUCwgUEFSQU1QXzYyKTsKCWNhc2UgcmFtcDUwOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQVJBTVAsIFBBUkFNUF81MCk7CgljYXNlIHJhbXA0MDoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFSQU1QLCBQQVJBTVBfNDApOwoJY2FzZSByYW1wMzE6CXJldHVybiBXUklURV9SRUcoUkVHX1BBUkFNUCwgUEFSQU1QXzMxKTsKCWNhc2UgcmFtcDI1OglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQVJBTVAsIFBBUkFNUF8yNSk7CgljYXNlIHJhbXAyMDoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFSQU1QLCBQQVJBTVBfMjApOwoJY2FzZSByYW1wMTU6CXJldHVybiBXUklURV9SRUcoUkVHX1BBUkFNUCwgUEFSQU1QXzE1KTsKCWNhc2UgcmFtcDEyOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQVJBTVAsIFBBUkFNUF8xMik7CgljYXNlIHJhbXAxMDoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFSQU1QLCBQQVJBTVBfMTApOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgppbnQgcmY2OV9zZXRfYW50ZW5uYV9pbXBlZGFuY2Uoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSBhbnRlbm5hSW1wZWRhbmNlIGFudGVubmFJbXBlZGFuY2UpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBhbnRlbm5hIGltcGVkYW5jZSIpOwoJI2VuZGlmCgoJc3dpdGNoIChhbnRlbm5hSW1wZWRhbmNlKSB7CgljYXNlIGZpZnR5T2htOgkgICAgcmV0dXJuIFdSSVRFX1JFRyhSRUdfTE5BLCAoUkVBRF9SRUcoUkVHX0xOQSkgJiB+TUFTS19MTkFfWklOKSk7CgljYXNlIHR3b2h1bmRyZXRPaG06IHJldHVybiBXUklURV9SRUcoUkVHX0xOQSwgKFJFQURfUkVHKFJFR19MTkEpIHwgIE1BU0tfTE5BX1pJTikpOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgppbnQgcmY2OV9zZXRfbG5hX2dhaW4oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSBsbmFHYWluIGxuYUdhaW4pCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBsbmEgZ2FpbiIpOwoJI2VuZGlmCgoJc3dpdGNoIChsbmFHYWluKSB7CgljYXNlIGF1dG9tYXRpYzoJIHJldHVybiBXUklURV9SRUcoUkVHX0xOQSwgKChSRUFEX1JFRyhSRUdfTE5BKSAmIH5NQVNLX0xOQV9HQUlOKSAmIExOQV9HQUlOX0FVVE8pKTsKCWNhc2UgbWF4OgkgcmV0dXJuIFdSSVRFX1JFRyhSRUdfTE5BLCAoKFJFQURfUkVHKFJFR19MTkEpICYgfk1BU0tfTE5BX0dBSU4pICYgTE5BX0dBSU5fTUFYKSk7CgljYXNlIG1heE1pbnVzNjogIHJldHVybiBXUklURV9SRUcoUkVHX0xOQSwgKChSRUFEX1JFRyhSRUdfTE5BKSAmIH5NQVNLX0xOQV9HQUlOKSAmIExOQV9HQUlOX01BWF9NSU5VU182KSk7CgljYXNlIG1heE1pbnVzMTI6IHJldHVybiBXUklURV9SRUcoUkVHX0xOQSwgKChSRUFEX1JFRyhSRUdfTE5BKSAmIH5NQVNLX0xOQV9HQUlOKSAmIExOQV9HQUlOX01BWF9NSU5VU18xMikpOwoJY2FzZSBtYXhNaW51czI0OiByZXR1cm4gV1JJVEVfUkVHKFJFR19MTkEsICgoUkVBRF9SRUcoUkVHX0xOQSkgJiB+TUFTS19MTkFfR0FJTikgJiBMTkFfR0FJTl9NQVhfTUlOVVNfMjQpKTsKCWNhc2UgbWF4TWludXMzNjogcmV0dXJuIFdSSVRFX1JFRyhSRUdfTE5BLCAoKFJFQURfUkVHKFJFR19MTkEpICYgfk1BU0tfTE5BX0dBSU4pICYgTE5BX0dBSU5fTUFYX01JTlVTXzM2KSk7CgljYXNlIG1heE1pbnVzNDg6IHJldHVybiBXUklURV9SRUcoUkVHX0xOQSwgKChSRUFEX1JFRyhSRUdfTE5BKSAmIH5NQVNLX0xOQV9HQUlOKSAmIExOQV9HQUlOX01BWF9NSU5VU180OCkpOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgplbnVtIGxuYUdhaW4gcmY2OV9nZXRfbG5hX2dhaW4oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKewoJdTggY3VycmVudFZhbHVlOwoKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAiZ2V0OiBsbmEgZ2FpbiIpOwoJI2VuZGlmCgoJY3VycmVudFZhbHVlID0gUkVBRF9SRUcoUkVHX0xOQSk7CgoJc3dpdGNoIChjdXJyZW50VmFsdWUgJiBNQVNLX0xOQV9DVVJSRU5UX0dBSU4gPj4gMykgeyAvLyBpbXByb3ZlbWVudDogY2hhbmdlIDMgdG8gZGVmaW5lCgljYXNlIExOQV9HQUlOX0FVVE86CSAgICByZXR1cm4gYXV0b21hdGljOwoJY2FzZSBMTkFfR0FJTl9NQVg6CSAgICByZXR1cm4gbWF4OwoJY2FzZSBMTkFfR0FJTl9NQVhfTUlOVVNfNjogIHJldHVybiBtYXhNaW51czY7CgljYXNlIExOQV9HQUlOX01BWF9NSU5VU18xMjogcmV0dXJuIG1heE1pbnVzMTI7CgljYXNlIExOQV9HQUlOX01BWF9NSU5VU18yNDogcmV0dXJuIG1heE1pbnVzMjQ7CgljYXNlIExOQV9HQUlOX01BWF9NSU5VU18zNjogcmV0dXJuIG1heE1pbnVzMzY7CgljYXNlIExOQV9HQUlOX01BWF9NSU5VU180ODogcmV0dXJuIG1heE1pbnVzNDg7CglkZWZhdWx0OgkJICAgIHJldHVybiB1bmRlZmluZWQ7Cgl9Cn0KCmludCByZjY5X3NldF9kY19jdXRfb2ZmX2ZyZXF1ZW5jeV9pbnRlcm4oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggcmVnLCBlbnVtIGRjY1BlcmNlbnQgZGNjUGVyY2VudCkKewoJc3dpdGNoIChkY2NQZXJjZW50KSB7CgljYXNlIGRjYzE2UGVyY2VudDoJcmV0dXJuIFdSSVRFX1JFRyhyZWcsICgoUkVBRF9SRUcocmVnKSAmIH5NQVNLX0JXX0RDQ19GUkVRKSB8IEJXX0RDQ18xNl9QRVJDRU5UKSk7CgljYXNlIGRjYzhQZXJjZW50OglyZXR1cm4gV1JJVEVfUkVHKHJlZywgKChSRUFEX1JFRyhyZWcpICYgfk1BU0tfQldfRENDX0ZSRVEpIHwgQldfRENDXzhfUEVSQ0VOVCkpOwoJY2FzZSBkY2M0UGVyY2VudDoJcmV0dXJuIFdSSVRFX1JFRyhyZWcsICgoUkVBRF9SRUcocmVnKSAmIH5NQVNLX0JXX0RDQ19GUkVRKSB8IEJXX0RDQ180X1BFUkNFTlQpKTsKCWNhc2UgZGNjMlBlcmNlbnQ6CXJldHVybiBXUklURV9SRUcocmVnLCAoKFJFQURfUkVHKHJlZykgJiB+TUFTS19CV19EQ0NfRlJFUSkgfCBCV19EQ0NfMl9QRVJDRU5UKSk7CgljYXNlIGRjYzFQZXJjZW50OglyZXR1cm4gV1JJVEVfUkVHKHJlZywgKChSRUFEX1JFRyhyZWcpICYgfk1BU0tfQldfRENDX0ZSRVEpIHwgQldfRENDXzFfUEVSQ0VOVCkpOwoJY2FzZSBkY2MwXzVQZXJjZW50OglyZXR1cm4gV1JJVEVfUkVHKHJlZywgKChSRUFEX1JFRyhyZWcpICYgfk1BU0tfQldfRENDX0ZSRVEpIHwgQldfRENDXzBfNV9QRVJDRU5UKSk7CgljYXNlIGRjYzBfMjVQZXJjZW50OglyZXR1cm4gV1JJVEVfUkVHKHJlZywgKChSRUFEX1JFRyhyZWcpICYgfk1BU0tfQldfRENDX0ZSRVEpIHwgQldfRENDXzBfMjVfUEVSQ0VOVCkpOwoJY2FzZSBkY2MwXzEyNVBlcmNlbnQ6CXJldHVybiBXUklURV9SRUcocmVnLCAoKFJFQURfUkVHKHJlZykgJiB+TUFTS19CV19EQ0NfRlJFUSkgfCBCV19EQ0NfMF8xMjVfUEVSQ0VOVCkpOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgppbnQgcmY2OV9zZXRfZGNfY3V0X29mZl9mcmVxdWVuY3koc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSBkY2NQZXJjZW50IGRjY1BlcmNlbnQpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBjdXQgb2ZmIGZyZXEiKTsKCSNlbmRpZgoKCXJldHVybiByZjY5X3NldF9kY19jdXRfb2ZmX2ZyZXF1ZW5jeV9pbnRlcm4oc3BpLCBSRUdfUlhCVywgZGNjUGVyY2VudCk7Cn0KCmludCByZjY5X3NldF9kY19jdXRfb2ZmX2ZyZXF1ZW5jeV9kdXJpbmdfYWZjKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gZGNjUGVyY2VudCBkY2NQZXJjZW50KQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogY3V0IG9mZiBmcmVxIGR1cmluZyBhZmMiKTsKCSNlbmRpZgoKCXJldHVybiByZjY5X3NldF9kY19jdXRfb2ZmX2ZyZXF1ZW5jeV9pbnRlcm4oc3BpLCBSRUdfQUZDQlcsIGRjY1BlcmNlbnQpOwp9CgpzdGF0aWMgaW50IHJmNjlfc2V0X2JhbmR3aWR0aF9pbnRlcm4oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggcmVnLAoJCQkJICAgICBlbnVtIG1hbnRpc3NlIG1hbnRpc3NlLCB1OCBleHBvbmVudCkKewoJdTggbmV3VmFsdWU7CgoJLy8gY2hlY2sgdmFsdWUgZm9yIG1hbnRpc3NlIGFuZCBleHBvbmVudAoJaWYgKGV4cG9uZW50ID4gNykgewoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJaWYgKChtYW50aXNzZSAhPSBtYW50aXNzZTE2KSAmJgoJICAgIChtYW50aXNzZSAhPSBtYW50aXNzZTIwKSAmJgoJICAgIChtYW50aXNzZSAhPSBtYW50aXNzZTI0KSkgewoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJLy8gcmVhZCBvbGQgdmFsdWUKCW5ld1ZhbHVlID0gUkVBRF9SRUcocmVnKTsKCgkvLyAiZGVsZXRlIiBtYW50aXNzZSBhbmQgZXhwb25lbnQgPSBqdXN0IGtlZXAgdGhlIERDQyBzZXR0aW5nCgluZXdWYWx1ZSA9IG5ld1ZhbHVlICYgTUFTS19CV19EQ0NfRlJFUTsKCgkvLyBhZGQgbmV3IG1hbnRpc3NlCglzd2l0Y2ggKG1hbnRpc3NlKSB7CgljYXNlIG1hbnRpc3NlMTY6CgkJbmV3VmFsdWUgPSBuZXdWYWx1ZSB8IEJXX01BTlRfMTY7CgkJYnJlYWs7CgljYXNlIG1hbnRpc3NlMjA6CgkJbmV3VmFsdWUgPSBuZXdWYWx1ZSB8IEJXX01BTlRfMjA7CgkJYnJlYWs7CgljYXNlIG1hbnRpc3NlMjQ6CgkJbmV3VmFsdWUgPSBuZXdWYWx1ZSB8IEJXX01BTlRfMjQ7CgkJYnJlYWs7Cgl9CgoJLy8gYWRkIG5ldyBleHBvbmVudAoJbmV3VmFsdWUgPSBuZXdWYWx1ZSB8IGV4cG9uZW50OwoKCS8vIHdyaXRlIGJhY2sKCXJldHVybiBXUklURV9SRUcocmVnLCBuZXdWYWx1ZSk7Cn0KCmludCByZjY5X3NldF9iYW5kd2lkdGgoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSBtYW50aXNzZSBtYW50aXNzZSwgdTggZXhwb25lbnQpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBiYW5kIHdpZHRoIik7CgkjZW5kaWYKCglyZXR1cm4gcmY2OV9zZXRfYmFuZHdpZHRoX2ludGVybihzcGksIFJFR19SWEJXLCBtYW50aXNzZSwgZXhwb25lbnQpOwp9CgppbnQgcmY2OV9zZXRfYmFuZHdpZHRoX2R1cmluZ19hZmMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSBtYW50aXNzZSBtYW50aXNzZSwgdTggZXhwb25lbnQpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBiYW5kIHdpZHRoIGR1cmluZyBhZmMiKTsKCSNlbmRpZgoKCXJldHVybiByZjY5X3NldF9iYW5kd2lkdGhfaW50ZXJuKHNwaSwgUkVHX0FGQ0JXLCBtYW50aXNzZSwgZXhwb25lbnQpOwp9CgppbnQgcmY2OV9zZXRfb29rX3RocmVzaG9sZF90eXBlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gdGhyZXNob2xkVHlwZSB0aHJlc2hvbGRUeXBlKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogdGhyZXNob2xkIHR5cGUiKTsKCSNlbmRpZgoKCXN3aXRjaCAodGhyZXNob2xkVHlwZSkgewoJY2FzZSBmaXhlZDoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfT09LUEVBSywgKChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTVFlQRSkgfCBPT0tQRUFLX1RIUkVTSFRZUEVfRklYRUQpKTsKCWNhc2UgcGVhazoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfT09LUEVBSywgKChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTVFlQRSkgfCBPT0tQRUFLX1RIUkVTSFRZUEVfUEVBSykpOwoJY2FzZSBhdmVyYWdlOglyZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoKFJFQURfUkVHKFJFR19PT0tQRUFLKSAmIH5NQVNLX09PS1BFQUtfVEhSRVNUWVBFKSB8IE9PS1BFQUtfVEhSRVNIVFlQRV9BVkVSQUdFKSk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9vb2tfdGhyZXNob2xkX3N0ZXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSB0aHJlc2hvbGRTdGVwIHRocmVzaG9sZFN0ZXApCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiB0aHJlc2hvbGQgc3RlcCIpOwoJI2VuZGlmCgoJc3dpdGNoICh0aHJlc2hvbGRTdGVwKSB7CgljYXNlIHN0ZXBfMF81ZGI6IHJldHVybiBXUklURV9SRUcoUkVHX09PS1BFQUssICgoUkVBRF9SRUcoUkVHX09PS1BFQUspICYgfk1BU0tfT09LUEVBS19USFJFU1NURVApIHwgT09LUEVBS19USFJFU0hTVEVQXzBfNV9EQikpOwoJY2FzZSBzdGVwXzFfMGRiOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoKFJFQURfUkVHKFJFR19PT0tQRUFLKSAmIH5NQVNLX09PS1BFQUtfVEhSRVNTVEVQKSB8IE9PS1BFQUtfVEhSRVNIU1RFUF8xXzBfREIpKTsKCWNhc2Ugc3RlcF8xXzVkYjogcmV0dXJuIFdSSVRFX1JFRyhSRUdfT09LUEVBSywgKChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTU1RFUCkgfCBPT0tQRUFLX1RIUkVTSFNURVBfMV81X0RCKSk7CgljYXNlIHN0ZXBfMl8wZGI6IHJldHVybiBXUklURV9SRUcoUkVHX09PS1BFQUssICgoUkVBRF9SRUcoUkVHX09PS1BFQUspICYgfk1BU0tfT09LUEVBS19USFJFU1NURVApIHwgT09LUEVBS19USFJFU0hTVEVQXzJfMF9EQikpOwoJY2FzZSBzdGVwXzNfMGRiOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoKFJFQURfUkVHKFJFR19PT0tQRUFLKSAmIH5NQVNLX09PS1BFQUtfVEhSRVNTVEVQKSB8IE9PS1BFQUtfVEhSRVNIU1RFUF8zXzBfREIpKTsKCWNhc2Ugc3RlcF80XzBkYjogcmV0dXJuIFdSSVRFX1JFRyhSRUdfT09LUEVBSywgKChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTU1RFUCkgfCBPT0tQRUFLX1RIUkVTSFNURVBfNF8wX0RCKSk7CgljYXNlIHN0ZXBfNV8wZGI6IHJldHVybiBXUklURV9SRUcoUkVHX09PS1BFQUssICgoUkVBRF9SRUcoUkVHX09PS1BFQUspICYgfk1BU0tfT09LUEVBS19USFJFU1NURVApIHwgT09LUEVBS19USFJFU0hTVEVQXzVfMF9EQikpOwoJY2FzZSBzdGVwXzZfMGRiOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoKFJFQURfUkVHKFJFR19PT0tQRUFLKSAmIH5NQVNLX09PS1BFQUtfVEhSRVNTVEVQKSB8IE9PS1BFQUtfVEhSRVNIU1RFUF82XzBfREIpKTsKCWRlZmF1bHQ6CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KfQoKaW50IHJmNjlfc2V0X29va190aHJlc2hvbGRfZGVjKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gdGhyZXNob2xkRGVjcmVtZW50IHRocmVzaG9sZERlY3JlbWVudCkKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IHRocmVzaG9sZCBkZWNyZW1lbnQiKTsKCSNlbmRpZgoKCXN3aXRjaCAodGhyZXNob2xkRGVjcmVtZW50KSB7CgljYXNlIGRlY19ldmVyeTh0aDogcmV0dXJuIFdSSVRFX1JFRyhSRUdfT09LUEVBSywgKChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTREVDKSB8IE9PS1BFQUtfVEhSRVNIREVDX0VWRVJZXzhUSCkpOwoJY2FzZSBkZWNfZXZlcnk0dGg6IHJldHVybiBXUklURV9SRUcoUkVHX09PS1BFQUssICgoUkVBRF9SRUcoUkVHX09PS1BFQUspICYgfk1BU0tfT09LUEVBS19USFJFU0RFQykgfCBPT0tQRUFLX1RIUkVTSERFQ19FVkVSWV80VEgpKTsKCWNhc2UgZGVjX2V2ZXJ5Mm5kOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoKFJFQURfUkVHKFJFR19PT0tQRUFLKSAmIH5NQVNLX09PS1BFQUtfVEhSRVNERUMpIHwgT09LUEVBS19USFJFU0hERUNfRVZFUllfMk5EKSk7CgljYXNlIGRlY19vbmNlOgkgICByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoKFJFQURfUkVHKFJFR19PT0tQRUFLKSAmIH5NQVNLX09PS1BFQUtfVEhSRVNERUMpIHwgT09LUEVBS19USFJFU0hERUNfT05DRSkpOwoJY2FzZSBkZWNfdHdpY2U6CSAgIHJldHVybiBXUklURV9SRUcoUkVHX09PS1BFQUssICgoUkVBRF9SRUcoUkVHX09PS1BFQUspICYgfk1BU0tfT09LUEVBS19USFJFU0RFQykgfCBPT0tQRUFLX1RIUkVTSERFQ19UV0lDRSkpOwoJY2FzZSBkZWNfNHRpbWVzOiAgIHJldHVybiBXUklURV9SRUcoUkVHX09PS1BFQUssICgoUkVBRF9SRUcoUkVHX09PS1BFQUspICYgfk1BU0tfT09LUEVBS19USFJFU0RFQykgfCBPT0tQRUFLX1RIUkVTSERFQ180X1RJTUVTKSk7CgljYXNlIGRlY184dGltZXM6ICAgcmV0dXJuIFdSSVRFX1JFRyhSRUdfT09LUEVBSywgKChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTREVDKSB8IE9PS1BFQUtfVEhSRVNIREVDXzhfVElNRVMpKTsKCWNhc2UgZGVjXzE2dGltZXM6ICByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoKFJFQURfUkVHKFJFR19PT0tQRUFLKSAmIH5NQVNLX09PS1BFQUtfVEhSRVNERUMpIHwgT09LUEVBS19USFJFU0hERUNfMTZfVElNRVMpKTsKCWRlZmF1bHQ6CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KfQoKaW50IHJmNjlfc2V0X2Rpb19tYXBwaW5nKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4IERJT051bWJlciwgdTggdmFsdWUpCnsKCXU4IG1hc2s7Cgl1OCBzaGlmdDsKCXU4IHJlZ2FkZHI7Cgl1OCByZWdWYWx1ZTsKCgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogRElPIG1hcHBpbmciKTsKCSNlbmRpZgoKCXN3aXRjaCAoRElPTnVtYmVyKSB7CgljYXNlIDA6CgkJbWFzayA9IE1BU0tfRElPMDsgc2hpZnQgPSBTSElGVF9ESU8wOyByZWdhZGRyID0gUkVHX0RJT01BUFBJTkcxOwoJCWJyZWFrOwoJY2FzZSAxOgoJCW1hc2sgPSBNQVNLX0RJTzE7IHNoaWZ0ID0gU0hJRlRfRElPMTsgcmVnYWRkciA9IFJFR19ESU9NQVBQSU5HMTsKCQlicmVhazsKCWNhc2UgMjoKCQltYXNrID0gTUFTS19ESU8yOyBzaGlmdCA9IFNISUZUX0RJTzI7IHJlZ2FkZHIgPSBSRUdfRElPTUFQUElORzE7CgkJYnJlYWs7CgljYXNlIDM6CgkJbWFzayA9IE1BU0tfRElPMzsgc2hpZnQgPSBTSElGVF9ESU8zOyByZWdhZGRyID0gUkVHX0RJT01BUFBJTkcxOwoJCWJyZWFrOwoJY2FzZSA0OgoJCW1hc2sgPSBNQVNLX0RJTzQ7IHNoaWZ0ID0gU0hJRlRfRElPNDsgcmVnYWRkciA9IFJFR19ESU9NQVBQSU5HMjsKCQlicmVhazsKCWNhc2UgNToKCQltYXNrID0gTUFTS19ESU81OyBzaGlmdCA9IFNISUZUX0RJTzU7IHJlZ2FkZHIgPSBSRUdfRElPTUFQUElORzI7CgkJYnJlYWs7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJLy8gcmVhZCByZWcKCXJlZ1ZhbHVlID0gUkVBRF9SRUcocmVnYWRkcik7CgkvLyBkZWxldGUgb2xkIHZhbHVlCglyZWdWYWx1ZSA9IHJlZ1ZhbHVlICYgfm1hc2s7CgkvLyBhZGQgbmV3IHZhbHVlCglyZWdWYWx1ZSA9IHJlZ1ZhbHVlIHwgdmFsdWUgPDwgc2hpZnQ7CgkvLyB3cml0ZSBiYWNrCglyZXR1cm4gV1JJVEVfUkVHKHJlZ2FkZHIsIHJlZ1ZhbHVlKTsKfQoKYm9vbCByZjY5X2dldF9mbGFnKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gZmxhZyBmbGFnKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgImdldDogZmxhZyIpOwoJI2VuZGlmCgoJc3dpdGNoIChmbGFnKSB7CgljYXNlIG1vZGVTd2l0Y2hDb21wbGV0ZWQ6ICAgICByZXR1cm4gKFJFQURfUkVHKFJFR19JUlFGTEFHUzEpICYgTUFTS19JUlFGTEFHUzFfTU9ERV9SRUFEWSk7CgljYXNlIHJlYWR5VG9SZWNlaXZlOgkgICAgICByZXR1cm4gKFJFQURfUkVHKFJFR19JUlFGTEFHUzEpICYgTUFTS19JUlFGTEFHUzFfUlhfUkVBRFkpOwoJY2FzZSByZWFkeVRvU2VuZDoJICAgICAgcmV0dXJuIChSRUFEX1JFRyhSRUdfSVJRRkxBR1MxKSAmIE1BU0tfSVJRRkxBR1MxX1RYX1JFQURZKTsKCWNhc2UgcGxsTG9ja2VkOgkJICAgICAgcmV0dXJuIChSRUFEX1JFRyhSRUdfSVJRRkxBR1MxKSAmIE1BU0tfSVJRRkxBR1MxX1BMTF9MT0NLKTsKCWNhc2UgcnNzaUV4Y2VlZGVkVGhyZXNob2xkOiAgIHJldHVybiAoUkVBRF9SRUcoUkVHX0lSUUZMQUdTMSkgJiBNQVNLX0lSUUZMQUdTMV9SU1NJKTsKCWNhc2UgdGltZW91dDoJCSAgICAgIHJldHVybiAoUkVBRF9SRUcoUkVHX0lSUUZMQUdTMSkgJiBNQVNLX0lSUUZMQUdTMV9USU1FT1VUKTsKCWNhc2UgYXV0b21vZGU6CQkgICAgICByZXR1cm4gKFJFQURfUkVHKFJFR19JUlFGTEFHUzEpICYgTUFTS19JUlFGTEFHUzFfQVVUT01PREUpOwoJY2FzZSBzeW5jQWRkcmVzc01hdGNoOgkgICAgICByZXR1cm4gKFJFQURfUkVHKFJFR19JUlFGTEFHUzEpICYgTUFTS19JUlFGTEFHUzFfU1lOQ19BRERSRVNTX01BVENIKTsKCWNhc2UgZmlmb0Z1bGw6CQkgICAgICByZXR1cm4gKFJFQURfUkVHKFJFR19JUlFGTEFHUzIpICYgTUFTS19JUlFGTEFHUzJfRklGT19GVUxMKTsKLyoJY2FzZSBmaWZvTm90RW1wdHk6CSAgICAgIHJldHVybiAoUkVBRF9SRUcoUkVHX0lSUUZMQUdTMikgJiBNQVNLX0lSUUZMQUdTMl9GSUZPX05PVF9FTVBUWSk7ICovCgljYXNlIGZpZm9FbXB0eToJCSAgICAgIHJldHVybiAhKFJFQURfUkVHKFJFR19JUlFGTEFHUzIpICYgTUFTS19JUlFGTEFHUzJfRklGT19OT1RfRU1QVFkpOwoJY2FzZSBmaWZvTGV2ZWxCZWxvd1RocmVzaG9sZDogcmV0dXJuIChSRUFEX1JFRyhSRUdfSVJRRkxBR1MyKSAmIE1BU0tfSVJRRkxBR1MyX0ZJRk9fTEVWRUwpOwoJY2FzZSBmaWZvT3ZlcnJ1bjoJICAgICAgcmV0dXJuIChSRUFEX1JFRyhSRUdfSVJRRkxBR1MyKSAmIE1BU0tfSVJRRkxBR1MyX0ZJRk9fT1ZFUlJVTik7CgljYXNlIHBhY2tldFNlbnQ6CSAgICAgIHJldHVybiAoUkVBRF9SRUcoUkVHX0lSUUZMQUdTMikgJiBNQVNLX0lSUUZMQUdTMl9QQUNLRVRfU0VOVCk7CgljYXNlIHBheWxvYWRSZWFkeToJICAgICAgcmV0dXJuIChSRUFEX1JFRyhSRUdfSVJRRkxBR1MyKSAmIE1BU0tfSVJRRkxBR1MyX1BBWUxPQURfUkVBRFkpOwoJY2FzZSBjcmNPazoJCSAgICAgIHJldHVybiAoUkVBRF9SRUcoUkVHX0lSUUZMQUdTMikgJiBNQVNLX0lSUUZMQUdTMl9DUkNfT0spOwoJY2FzZSBiYXR0ZXJ5TG93OgkgICAgICByZXR1cm4gKFJFQURfUkVHKFJFR19JUlFGTEFHUzIpICYgTUFTS19JUlFGTEFHUzJfTE9XX0JBVCk7CglkZWZhdWx0OgkJICAgICAgcmV0dXJuIGZhbHNlOwoJfQp9CgppbnQgcmY2OV9yZXNldF9mbGFnKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gZmxhZyBmbGFnKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInJlc2V0OiBmbGFnIik7CgkjZW5kaWYKCglzd2l0Y2ggKGZsYWcpIHsKCWNhc2UgcnNzaUV4Y2VlZGVkVGhyZXNob2xkOiByZXR1cm4gV1JJVEVfUkVHKFJFR19JUlFGTEFHUzEsIE1BU0tfSVJRRkxBR1MxX1JTU0kpOwoJY2FzZSBzeW5jQWRkcmVzc01hdGNoOgkgICAgcmV0dXJuIFdSSVRFX1JFRyhSRUdfSVJRRkxBR1MxLCBNQVNLX0lSUUZMQUdTMV9TWU5DX0FERFJFU1NfTUFUQ0gpOwoJY2FzZSBmaWZvT3ZlcnJ1bjoJICAgIHJldHVybiBXUklURV9SRUcoUkVHX0lSUUZMQUdTMiwgTUFTS19JUlFGTEFHUzJfRklGT19PVkVSUlVOKTsKCWRlZmF1bHQ6CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KfQoKaW50IHJmNjlfc2V0X3Jzc2lfdGhyZXNob2xkKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4IHRocmVzaG9sZCkKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IHJzc2kgdGhyZXNob2xkIik7CgkjZW5kaWYKCgkvKiBubyB2YWx1ZSBjaGVjayBuZWVkZWQgLSB1OCBleGFjdGx5IG1hdGNoZXMgcmVnaXN0ZXIgc2l6ZSAqLwoKCXJldHVybiBXUklURV9SRUcoUkVHX1JTU0lUSFJFU0gsIHRocmVzaG9sZCk7Cn0KCmludCByZjY5X3NldF9yeF9zdGFydF90aW1lb3V0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4IHRpbWVvdXQpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBzdGFydCB0aW1lb3V0Iik7CgkjZW5kaWYKCgkvKiBubyB2YWx1ZSBjaGVjayBuZWVkZWQgLSB1OCBleGFjdGx5IG1hdGNoZXMgcmVnaXN0ZXIgc2l6ZSAqLwoKCXJldHVybiBXUklURV9SRUcoUkVHX1JYVElNRU9VVDEsIHRpbWVvdXQpOwp9CgppbnQgcmY2OV9zZXRfcnNzaV90aW1lb3V0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4IHRpbWVvdXQpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiByc3NpIHRpbWVvdXQiKTsKCSNlbmRpZgoKCS8qIG5vIHZhbHVlIGNoZWNrIG5lZWRlZCAtIHU4IGV4YWN0bHkgbWF0Y2hlcyByZWdpc3RlciBzaXplICovCgoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfUlhUSU1FT1VUMiwgdGltZW91dCk7Cn0KCmludCByZjY5X3NldF9wcmVhbWJsZV9sZW5ndGgoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTE2IHByZWFtYmxlTGVuZ3RoKQp7CglpbnQgcmV0dmFsOwoJdTggbXNiLCBsc2I7CgoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IHByZWFtYmxlIGxlbmd0aCIpOwoJI2VuZGlmCgoJLyogbm8gdmFsdWUgY2hlY2sgbmVlZGVkIC0gdTE2IGV4YWN0bHkgbWF0Y2hlcyByZWdpc3RlciBzaXplICovCgoJLyogY2FsY3VsYXRlIHJlZyBzZXR0aW5ncyAqLwoJbXNiID0gKHByZWFtYmxlTGVuZ3RoJjB4ZmYwMCkgICA+PiAgODsKCWxzYiA9IChwcmVhbWJsZUxlbmd0aCYweGZmKTsKCgkvKiB0cmFuc21pdCB0byBjaGlwICovCglyZXR2YWwgPSBXUklURV9SRUcoUkVHX1BSRUFNQkxFX01TQiwgbXNiKTsKCWlmIChyZXR2YWwpCgkJcmV0dXJuIHJldHZhbDsKCXJldHVybiBXUklURV9SRUcoUkVHX1BSRUFNQkxFX0xTQiwgbHNiKTsKfQoKaW50IHJmNjlfc2V0X3N5bmNfZW5hYmxlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gb3B0aW9uT25PZmYgb3B0aW9uT25PZmYpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBzeW5jIGVuYWJsZSIpOwoJI2VuZGlmCgoJc3dpdGNoIChvcHRpb25Pbk9mZikgewoJY2FzZSBvcHRpb25PbjoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfU1lOQ19DT05GSUcsIChSRUFEX1JFRyhSRUdfU1lOQ19DT05GSUcpIHwgIE1BU0tfU1lOQ19DT05GSUdfU1lOQ19PTikpOwoJY2FzZSBvcHRpb25PZmY6CXJldHVybiBXUklURV9SRUcoUkVHX1NZTkNfQ09ORklHLCAoUkVBRF9SRUcoUkVHX1NZTkNfQ09ORklHKSAmIH5NQVNLX1NZTkNfQ09ORklHX1NZTkNfT04pKTsKCWRlZmF1bHQ6CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KfQoKaW50IHJmNjlfc2V0X2ZpZm9fZmlsbF9jb25kaXRpb24oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSBmaWZvRmlsbENvbmRpdGlvbiBmaWZvRmlsbENvbmRpdGlvbikKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGZpZm8gZmlsbCBjb25kaXRpb24iKTsKCSNlbmRpZgoKCXN3aXRjaCAoZmlmb0ZpbGxDb25kaXRpb24pIHsKCWNhc2UgYWx3YXlzOgkJIHJldHVybiBXUklURV9SRUcoUkVHX1NZTkNfQ09ORklHLCAoUkVBRF9SRUcoUkVHX1NZTkNfQ09ORklHKSB8ICBNQVNLX1NZTkNfQ09ORklHX0ZJRk9fRklMTF9DT05ESVRJT04pKTsKCWNhc2UgYWZ0ZXJTeW5jSW50ZXJydXB0OiByZXR1cm4gV1JJVEVfUkVHKFJFR19TWU5DX0NPTkZJRywgKFJFQURfUkVHKFJFR19TWU5DX0NPTkZJRykgJiB+TUFTS19TWU5DX0NPTkZJR19GSUZPX0ZJTExfQ09ORElUSU9OKSk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9zeW5jX3NpemUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggc3luY1NpemUpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBzeW5jIHNpemUiKTsKCSNlbmRpZgoKCS8vIGNoZWNrIGlucHV0IHZhbHVlCglpZiAoc3luY1NpemUgPiAweDA3KSB7CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvLyB3cml0ZSB2YWx1ZQoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfU1lOQ19DT05GSUcsIChSRUFEX1JFRyhSRUdfU1lOQ19DT05GSUcpICYgfk1BU0tfU1lOQ19DT05GSUdfU1lOQ19TSVpFKSB8IChzeW5jU2l6ZSA8PCAzKSk7Cn0KCmludCByZjY5X3NldF9zeW5jX3RvbGVyYW5jZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCBzeW5jVG9sZXJhbmNlKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogc3luYyB0b2xlcmFuY2UiKTsKCSNlbmRpZgoKCS8vIGNoZWNrIGlucHV0IHZhbHVlCglpZiAoc3luY1RvbGVyYW5jZSA+IDB4MDcpIHsKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCS8vIHdyaXRlIHZhbHVlCglyZXR1cm4gV1JJVEVfUkVHKFJFR19TWU5DX0NPTkZJRywgKFJFQURfUkVHKFJFR19TWU5DX0NPTkZJRykgJiB+TUFTS19TWU5DX0NPTkZJR19TWU5DX1NJWkUpIHwgc3luY1RvbGVyYW5jZSk7Cn0KCmludCByZjY5X3NldF9zeW5jX3ZhbHVlcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCBzeW5jVmFsdWVzWzhdKQp7CglpbnQgcmV0dmFsID0gMDsKCgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogc3luYyB2YWx1ZXMiKTsKCSNlbmRpZgoKCXJldHZhbCArPSBXUklURV9SRUcoUkVHX1NZTkNWQUxVRTEsIHN5bmNWYWx1ZXNbMF0pOwoJcmV0dmFsICs9IFdSSVRFX1JFRyhSRUdfU1lOQ1ZBTFVFMiwgc3luY1ZhbHVlc1sxXSk7CglyZXR2YWwgKz0gV1JJVEVfUkVHKFJFR19TWU5DVkFMVUUzLCBzeW5jVmFsdWVzWzJdKTsKCXJldHZhbCArPSBXUklURV9SRUcoUkVHX1NZTkNWQUxVRTQsIHN5bmNWYWx1ZXNbM10pOwoJcmV0dmFsICs9IFdSSVRFX1JFRyhSRUdfU1lOQ1ZBTFVFNSwgc3luY1ZhbHVlc1s0XSk7CglyZXR2YWwgKz0gV1JJVEVfUkVHKFJFR19TWU5DVkFMVUU2LCBzeW5jVmFsdWVzWzVdKTsKCXJldHZhbCArPSBXUklURV9SRUcoUkVHX1NZTkNWQUxVRTcsIHN5bmNWYWx1ZXNbNl0pOwoJcmV0dmFsICs9IFdSSVRFX1JFRyhSRUdfU1lOQ1ZBTFVFOCwgc3luY1ZhbHVlc1s3XSk7CgoJcmV0dXJuIHJldHZhbDsKfQoKaW50IHJmNjlfc2V0X3BhY2tldF9mb3JtYXQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSBwYWNrZXRGb3JtYXQgcGFja2V0Rm9ybWF0KQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogcGFja2V0IGZvcm1hdCIpOwoJI2VuZGlmCgoJc3dpdGNoIChwYWNrZXRGb3JtYXQpIHsKCWNhc2UgcGFja2V0TGVuZ3RoVmFyOiByZXR1cm4gV1JJVEVfUkVHKFJFR19QQUNLRVRDT05GSUcxLCAoUkVBRF9SRUcoUkVHX1BBQ0tFVENPTkZJRzEpIHwgIE1BU0tfUEFDS0VUQ09ORklHMV9QQUtFVF9GT1JNQVRfVkFSSUFCTEUpKTsKCWNhc2UgcGFja2V0TGVuZ3RoRml4OiByZXR1cm4gV1JJVEVfUkVHKFJFR19QQUNLRVRDT05GSUcxLCAoUkVBRF9SRUcoUkVHX1BBQ0tFVENPTkZJRzEpICYgfk1BU0tfUEFDS0VUQ09ORklHMV9QQUtFVF9GT1JNQVRfVkFSSUFCTEUpKTsKCWRlZmF1bHQ6CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KfQoKaW50IHJmNjlfc2V0X2NyY19lbmFibGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSBvcHRpb25Pbk9mZiBvcHRpb25Pbk9mZikKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGNyYyBlbmFibGUiKTsKCSNlbmRpZgoKCXN3aXRjaCAob3B0aW9uT25PZmYpIHsKCWNhc2Ugb3B0aW9uT246CXJldHVybiBXUklURV9SRUcoUkVHX1BBQ0tFVENPTkZJRzEsIChSRUFEX1JFRyhSRUdfUEFDS0VUQ09ORklHMSkgfCAgTUFTS19QQUNLRVRDT05GSUcxX0NSQ19PTikpOwoJY2FzZSBvcHRpb25PZmY6CXJldHVybiBXUklURV9SRUcoUkVHX1BBQ0tFVENPTkZJRzEsIChSRUFEX1JFRyhSRUdfUEFDS0VUQ09ORklHMSkgJiB+TUFTS19QQUNLRVRDT05GSUcxX0NSQ19PTikpOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgppbnQgcmY2OV9zZXRfYWRyZXNzRmlsdGVyaW5nKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gYWRkcmVzc0ZpbHRlcmluZyBhZGRyZXNzRmlsdGVyaW5nKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogYWRkcmVzcyBmaWx0ZXJpbmciKTsKCSNlbmRpZgoKCXN3aXRjaCAoYWRkcmVzc0ZpbHRlcmluZykgewoJY2FzZSBmaWx0ZXJpbmdPZmY6CSAgICAgcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFDS0VUQ09ORklHMSwgKChSRUFEX1JFRyhSRUdfUEFDS0VUQ09ORklHMSkgJiB+TUFTS19QQUNLRVRDT05GSUcxX0FERFJFU1NGSUxURVJJTkcpIHwgUEFDS0VUQ09ORklHMV9BRERSRVNTRklMVEVSSU5HX09GRikpOwoJY2FzZSBub2RlQWRkcmVzczoJICAgICByZXR1cm4gV1JJVEVfUkVHKFJFR19QQUNLRVRDT05GSUcxLCAoKFJFQURfUkVHKFJFR19QQUNLRVRDT05GSUcxKSAmIH5NQVNLX1BBQ0tFVENPTkZJRzFfQUREUkVTU0ZJTFRFUklORykgfCBQQUNLRVRDT05GSUcxX0FERFJFU1NGSUxURVJJTkdfTk9ERSkpOwoJY2FzZSBub2RlT3JCcm9hZGNhc3RBZGRyZXNzOiByZXR1cm4gV1JJVEVfUkVHKFJFR19QQUNLRVRDT05GSUcxLCAoKFJFQURfUkVHKFJFR19QQUNLRVRDT05GSUcxKSAmIH5NQVNLX1BBQ0tFVENPTkZJRzFfQUREUkVTU0ZJTFRFUklORykgfCBQQUNLRVRDT05GSUcxX0FERFJFU1NGSUxURVJJTkdfTk9ERUJST0FEQ0FTVCkpOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgppbnQgcmY2OV9zZXRfcGF5bG9hZF9sZW5ndGgoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggcGF5bG9hZExlbmd0aCkKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IHBheWxvYWQgbGVuZ3RoIik7CgkjZW5kaWYKCglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQVlMT0FEX0xFTkdUSCwgcGF5bG9hZExlbmd0aCk7Cn0KCnU4ICByZjY5X2dldF9wYXlsb2FkX2xlbmd0aChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgImdldDogcGF5bG9hZCBsZW5ndGgiKTsKCSNlbmRpZgoKCXJldHVybiAodTgpIFJFQURfUkVHKFJFR19QQVlMT0FEX0xFTkdUSCk7Cn0KCmludCByZjY5X3NldF9ub2RlX2FkZHJlc3Moc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggbm9kZUFkZHJlc3MpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBub2RlIGFkZHJlc3MiKTsKCSNlbmRpZgoKCXJldHVybiBXUklURV9SRUcoUkVHX05PREVBRFJTLCBub2RlQWRkcmVzcyk7Cn0KCmludCByZjY5X3NldF9icm9hZGNhc3RfYWRkcmVzcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCBicm9hZGNhc3RBZGRyZXNzKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogYnJvYWRjYXN0IGFkZHJlc3MiKTsKCSNlbmRpZgoKCXJldHVybiBXUklURV9SRUcoUkVHX0JST0FEQ0FTVEFEUlMsIGJyb2FkY2FzdEFkZHJlc3MpOwp9CgppbnQgcmY2OV9zZXRfdHhfc3RhcnRfY29uZGl0aW9uKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gdHhTdGFydENvbmRpdGlvbiB0eFN0YXJ0Q29uZGl0aW9uKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogc3RhcnQgY29uZGl0aW9uIik7CgkjZW5kaWYKCglzd2l0Y2ggKHR4U3RhcnRDb25kaXRpb24pIHsKCWNhc2UgZmlmb0xldmVsOgkgICByZXR1cm4gV1JJVEVfUkVHKFJFR19GSUZPX1RIUkVTSCwgKFJFQURfUkVHKFJFR19GSUZPX1RIUkVTSCkgJiB+TUFTS19GSUZPX1RIUkVTSF9UWFNUQVJUKSk7CgljYXNlIGZpZm9Ob3RFbXB0eTogcmV0dXJuIFdSSVRFX1JFRyhSRUdfRklGT19USFJFU0gsIChSRUFEX1JFRyhSRUdfRklGT19USFJFU0gpIHwgIE1BU0tfRklGT19USFJFU0hfVFhTVEFSVCkpOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgppbnQgcmY2OV9zZXRfZmlmb190aHJlc2hvbGQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggdGhyZXNob2xkKQp7CglpbnQgcmV0dmFsOwoKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBmaWZvIHRocmVzaG9sZCIpOwoJI2VuZGlmCgoJLy8gY2hlY2sgaW5wdXQgdmFsdWUKCWlmICh0aHJlc2hvbGQgJiAweDgwKSB7CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvLyB3cml0ZSB2YWx1ZQoJcmV0dmFsID0gV1JJVEVfUkVHKFJFR19GSUZPX1RIUkVTSCwgKFJFQURfUkVHKFJFR19GSUZPX1RIUkVTSCkgJiB+TUFTS19GSUZPX1RIUkVTSF9WQUxVRSkgfCB0aHJlc2hvbGQpOwoJaWYgKHJldHZhbCkKCQlyZXR1cm4gcmV0dmFsOwoKCS8vIGFjY2VzcyB0aGUgZmlmbyB0byBhY3RpdmF0ZSBuZXcgdGhyZXNob2xkCglyZXR1cm4gcmY2OV9yZWFkX2ZpZm8oc3BpLCAodTggKikmcmV0dmFsLCAxKTsgLy8gcmV0dmFsIHVzZWQgYXMgYnVmZmVyCn0KCmludCByZjY5X3NldF9kYWdjKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gZGFnYyBkYWdjKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogZGFnYyIpOwoJI2VuZGlmCgoJc3dpdGNoIChkYWdjKSB7CgljYXNlIG5vcm1hbE1vZGU6CQkgcmV0dXJuIFdSSVRFX1JFRyhSRUdfVEVTVERBR0MsIERBR0NfTk9STUFMKTsKCWNhc2UgaW1wcm92ZToJCQkgcmV0dXJuIFdSSVRFX1JFRyhSRUdfVEVTVERBR0MsIERBR0NfSU1QUk9WRURfTE9XQkVUQTApOwoJY2FzZSBpbXByb3ZlNExvd01vZHVsYXRpb25JbmRleDogcmV0dXJuIFdSSVRFX1JFRyhSRUdfVEVTVERBR0MsIERBR0NfSU1QUk9WRURfTE9XQkVUQTEpOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKaW50IHJmNjlfcmVhZF9maWZvIChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgc2l6ZSkKewoJI2lmZGVmIERFQlVHX0ZJRk9fQUNDRVNTCgkJaW50IGk7CgkjZW5kaWYKCXN0cnVjdCBzcGlfdHJhbnNmZXIgdHJhbnNmZXI7Cgl1OCBsb2NhbF9idWZmZXJbRklGT19TSVpFICsgMV07CglpbnQgcmV0dmFsOwoKCWlmIChzaXplID4gRklGT19TSVpFKSB7CgkJI2lmZGVmIERFQlVHCgkJCWRldl9kYmcoJnNwaS0+ZGV2LCAicmVhZCBmaWZvOiBwYXNzZWQgaW4gYnVmZmVyIGJpZ2dlciB0aGVuIGludGVybmFsIGJ1ZmZlciBcbiIpOwoJCSNlbmRpZgoJCXJldHVybiAtRU1TR1NJWkU7Cgl9CgoJLyogcHJlcGFyZSBhIGJpZGlyZWN0aW9uYWwgdHJhbnNmZXIgKi8KCWxvY2FsX2J1ZmZlclswXSA9IFJFR19GSUZPOwoJbWVtc2V0KCZ0cmFuc2ZlciwgMCwgc2l6ZW9mKHRyYW5zZmVyKSk7Cgl0cmFuc2Zlci50eF9idWYgPSBsb2NhbF9idWZmZXI7Cgl0cmFuc2Zlci5yeF9idWYgPSBsb2NhbF9idWZmZXI7Cgl0cmFuc2Zlci5sZW4JPSBzaXplKzE7CgoJcmV0dmFsID0gc3BpX3N5bmNfdHJhbnNmZXIoc3BpLCAmdHJhbnNmZXIsIDEpOwoKCSNpZmRlZiBERUJVR19GSUZPX0FDQ0VTUwoJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCgkJCWRldl9kYmcoJnNwaS0+ZGV2LCAiJWQgLSAweCV4XG4iLCBpLCBsb2NhbF9idWZmZXJbaSsxXSk7CgkjZW5kaWYKCgltZW1jcHkoYnVmZmVyLCAmbG9jYWxfYnVmZmVyWzFdLCBzaXplKTsgIC8vIFRPRE86IG9obmUgbWVtY29weSB35HJlIHNjaPZuZXIKCglyZXR1cm4gcmV0dmFsOwp9CgppbnQgcmY2OV93cml0ZV9maWZvKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4ICpidWZmZXIsIHVuc2lnbmVkIGludCBzaXplKQp7CgkjaWZkZWYgREVCVUdfRklGT19BQ0NFU1MKCQlpbnQgaTsKCSNlbmRpZgoJY2hhciBzcGlfYWRkcmVzcyA9IFJFR19GSUZPIHwgV1JJVEVfQklUOwoJdTggbG9jYWxfYnVmZmVyW0ZJRk9fU0laRSArIDFdOwoKCWlmIChzaXplID4gRklGT19TSVpFKSB7CgkJI2lmZGVmIERFQlVHCgkJCWRldl9kYmcoJnNwaS0+ZGV2LCAicmVhZCBmaWZvOiBwYXNzZWQgaW4gYnVmZmVyIGJpZ2dlciB0aGVuIGludGVybmFsIGJ1ZmZlciBcbiIpOwoJCSNlbmRpZgoJCXJldHVybiAtRU1TR1NJWkU7Cgl9CgoJbG9jYWxfYnVmZmVyWzBdID0gc3BpX2FkZHJlc3M7CgltZW1jcHkoJmxvY2FsX2J1ZmZlclsxXSwgYnVmZmVyLCBzaXplKTsgIC8vIFRPRE86IG9obmUgbWVtY29weSB35HJlIHNjaPZuZXIKCgkjaWZkZWYgREVCVUdfRklGT19BQ0NFU1MKCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQoJCQlkZXZfZGJnKCZzcGktPmRldiwgIjB4JXhcbiIsIGJ1ZmZlcltpXSk7CgkjZW5kaWYKCglyZXR1cm4gc3BpX3dyaXRlIChzcGksIGxvY2FsX2J1ZmZlciwgc2l6ZSArIDEpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKdTggcmY2OV9yZWFkX3JlZyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCBhZGRyKQp7CglpbnQgcmV0dmFsOwoKCXJldHZhbCA9IHNwaV93OHI4KHNwaSwgYWRkcik7CgoJI2lmZGVmIERFQlVHX1ZBTFVFUwoJCWlmIChyZXR2YWwgPCAwKQoJCQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuLCBzaW5jZSB3ZSBhbHJlYWR5IGNoZWNrZWQsCgkJCSAqIHRoYXQgbW9kdWxlIGlzIGNvbm5lY3RlZC4gVGhlcmVmb3JlIG5vIGVycm9yCgkJCSAqIGhhbmRsaW5nLCBqdXN0IGFuIG9wdGlvbmFsIGVycm9yIG1lc3NhZ2UuLi4KCQkJICovCgkJCWRldl9kYmcoJnNwaS0+ZGV2LCAicmVhZCAweCV4IEZBSUxFRFxuIiwKCQkJCWFkZHIpOwoJCWVsc2UKCQkJZGV2X2RiZygmc3BpLT5kZXYsICJyZWFkIDB4JXggZnJvbSByZWcgMHgleFxuIiwKCQkJCXJldHZhbCwKCQkJCWFkZHIpOwoJI2VuZGlmCgoJcmV0dXJuIHJldHZhbDsKfQoKaW50IHJmNjlfd3JpdGVfcmVnKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4IGFkZHIsIHU4IHZhbHVlKQp7CglpbnQgcmV0dmFsOwoJY2hhciBidWZmZXJbMl07CgoJYnVmZmVyWzBdID0gYWRkciB8IFdSSVRFX0JJVDsKCWJ1ZmZlclsxXSA9IHZhbHVlOwoKCXJldHZhbCA9IHNwaV93cml0ZShzcGksICZidWZmZXIsIDIpOwoKCSNpZmRlZiBERUJVR19WQUxVRVMKCQlpZiAocmV0dmFsIDwgMCkKCQkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiwgc2luY2Ugd2UgYWxyZWFkeSBjaGVja2VkLAoJCQkgKiB0aGF0IG1vZHVsZSBpcyBjb25uZWN0ZWQuIFRoZXJlZm9yZSBubyBlcnJvcgoJCQkgKiBoYW5kbGluZywganVzdCBhbiBvcHRpb25hbCBlcnJvciBtZXNzYWdlLi4uCgkJCSAqLwoJCQlkZXZfZGJnKCZzcGktPmRldiwgIndyaXRlIDB4JXggdG8gMHgleCBGQUlMRURcbiIsCgkJCQl2YWx1ZSwKCQkJCWFkZHIpOwoJCWVsc2UKCQkJZGV2X2RiZygmc3BpLT5kZXYsICJ3cm90ZSAweCV4IHRvIHJlZyAweCV4XG4iLAoJCQkJdmFsdWUsCgkJCQlhZGRyKTsKCSNlbmRpZgoKCXJldHVybiByZXR2YWw7Cn0KCgo=