LyoKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBpMmMtYWxnby1pdGUuYyBpMmMgZHJpdmVyIGFsZ29yaXRobXMgZm9yIElURSBhZGFwdGVycwkgICAgCiAgIAogICBIYWktUGFvIEZhbiwgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgogICBocGZhbkBtdmlzdGEuY29tIG9yIHNvdXJjZUBtdmlzdGEuY29tCgogICBDb3B5cmlnaHQgMjAwMCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBUaGlzIGZpbGUgd2FzIGhpZ2hseSBsZXZlcmFnZWQgZnJvbSBpMmMtYWxnby1wY2YuYywgd2hpY2ggd2FzIGNyZWF0ZWQKICAgYnkgU2ltb24gRy4gVm9nbCBhbmQgSGFucyBCZXJnbHVuZDoKCgogICAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IFNpbW9uIEcuIFZvZ2wKICAgICAgICAgICAgICAgICAgIDE5OTgtMjAwMCBIYW5zIEJlcmdsdW5kCgogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCQkgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qIFdpdGggc29tZSBjaGFuZ2VzIGZyb20gS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+IGFuZCAKICAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiAsYW5kIGFsc28gZnJvbSBNYXJ0aW4gQmFpbGV5CiAgIDxtYmFpbGV5QGxpdHRsZWZlZXQtaW5jLmNvbT4gKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgoKI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgojaW5jbHVkZSA8bGludXgvaTJjLWFsZ28taXRlLmg+CiNpbmNsdWRlICJpMmMtYWxnby1pdGUuaCIKCiNkZWZpbmUJUE1fRFNSCQlJVDgxNzJfUENJX0lPX0JBU0UgKyBJVF9QTV9EU1IKI2RlZmluZQlQTV9JQlNSCQlJVDgxNzJfUENJX0lPX0JBU0UgKyBJVF9QTV9EU1IgKyAweDA0IAojZGVmaW5lIEdQSU9fQ0NSCUlUODE3Ml9QQ0lfSU9fQkFTRSArIElUX0dQQ0NSCgojZGVmaW5lIERFQjIoeCkgaWYgKGkyY19kZWJ1Zz49MikgeAojZGVmaW5lIERFQjMoeCkgaWYgKGkyY19kZWJ1Zz49MykgeCAvKiBwcmludCBzZXZlcmFsIHN0YXRpc3RpY2FsIHZhbHVlcyovCiNkZWZpbmUgREVGX1RJTUVPVVQgMTYKCgovKiBtb2R1bGUgcGFyYW1ldGVyczoKICovCnN0YXRpYyBpbnQgaTJjX2RlYnVnOwpzdGF0aWMgaW50IGlpY190ZXN0OwkvKiBzZWUgaWYgdGhlIGxpbmUtc2V0dGluZyBmdW5jdGlvbnMgd29yawkqLwoKLyogLS0tIHNldHRpbmcgc3RhdGVzIG9uIHRoZSBidXMgd2l0aCB0aGUgcmlnaHQgdGltaW5nOiAtLS0tLS0tLS0tLS0tLS0JKi8KCiNkZWZpbmUgZ2V0X2Nsb2NrKGFkYXApIGFkYXAtPmdldGNsb2NrKGFkYXAtPmRhdGEpCiNkZWZpbmUgaWljX291dHcoYWRhcCwgcmVnLCB2YWwpIGFkYXAtPnNldGlpYyhhZGFwLT5kYXRhLCByZWcsIHZhbCkKI2RlZmluZSBpaWNfaW53KGFkYXAsIHJlZykgYWRhcC0+Z2V0aWljKGFkYXAtPmRhdGEsIHJlZykKCgovKiAtLS0gb3RoZXIgYXV4aWxpYXJ5IGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLwoKc3RhdGljIHZvaWQgaWljX3N0YXJ0KHN0cnVjdCBpMmNfYWxnb19paWNfZGF0YSAqYWRhcCkKewoJaWljX291dHcoYWRhcCxJVEVfSTJDSENSLElURV9DTUQpOwp9CgpzdGF0aWMgdm9pZCBpaWNfc3RvcChzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmFkYXApCnsKCWlpY19vdXR3KGFkYXAsSVRFX0kyQ0hDUiwwKTsKCWlpY19vdXR3KGFkYXAsSVRFX0kyQ0hTUixJVEVfSTJDSFNSX1RESSk7Cn0KCnN0YXRpYyB2b2lkIGlpY19yZXNldChzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmFkYXApCnsKCWlpY19vdXR3KGFkYXAsIFBNX0lCU1IsIGlpY19pbncoYWRhcCwgUE1fSUJTUikgfCAweDgwKTsKfQoKCnN0YXRpYyBpbnQgd2FpdF9mb3JfYmIoc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwKQp7CglpbnQgdGltZW91dCA9IERFRl9USU1FT1VUOwoJc2hvcnQgc3RhdHVzOwoKCXN0YXR1cyA9IGlpY19pbncoYWRhcCwgSVRFX0kyQ0hTUik7CiNpZm5kZWYgU1RVQl9JMkMKCXdoaWxlICh0aW1lb3V0LS0gJiYgKHN0YXR1cyAmIElURV9JMkNIU1JfSEIpKSB7CgkJdWRlbGF5KDEwMDApOyAvKiBIb3cgbXVjaCBpcyB0aGlzPyAqLwoJCXN0YXR1cyA9IGlpY19pbncoYWRhcCwgSVRFX0kyQ0hTUik7Cgl9CiNlbmRpZgoJaWYgKHRpbWVvdXQ8PTApIHsKCQlwcmludGsoS0VSTl9FUlIgIlRpbWVvdXQsIGhvc3QgaXMgYnVzeVxuIik7CgkJaWljX3Jlc2V0KGFkYXApOwoJfQoJcmV0dXJuKHRpbWVvdXQ8PTApOwp9CgovKiBBZnRlciB3ZSBpc3N1ZSBhIHRyYW5zYWN0aW9uIG9uIHRoZSBJSUMgYnVzLCB0aGlzIGZ1bmN0aW9uCiAqIGlzIGNhbGxlZC4gIEl0IHB1dHMgdGhpcyBwcm9jZXNzIHRvIHNsZWVwIHVudGlsIHdlIGdldCBhbiBpbnRlcnJ1cHQgZnJvbQogKiBmcm9tIHRoZSBjb250cm9sbGVyIHRlbGxpbmcgdXMgdGhhdCB0aGUgdHJhbnNhY3Rpb24gd2UgcmVxdWVzdGVkIGluIGNvbXBsZXRlLgogKi8Kc3RhdGljIGludCB3YWl0X2Zvcl9waW4oc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwLCBzaG9ydCAqc3RhdHVzKSB7CgoJaW50IHRpbWVvdXQgPSBERUZfVElNRU9VVDsKCQoJdGltZW91dCA9IHdhaXRfZm9yX2JiKGFkYXApOwoJaWYgKHRpbWVvdXQpIHsKICAJCURFQjIocHJpbnRrKCJUaW1lb3V0IHdhaXRpbmcgZm9yIGhvc3Qgbm90IGJ1c3lcbiIpOykKICAJCXJldHVybiAtRUlPOwoJfSAgICAgICAgICAgICAgICAgICAgICAgICAgIAoJdGltZW91dCA9IERFRl9USU1FT1VUOwoKCSpzdGF0dXMgPSBpaWNfaW53KGFkYXAsIElURV9JMkNIU1IpOwojaWZuZGVmIFNUVUJfSTJDCgl3aGlsZSAodGltZW91dC0tICYmICEoKnN0YXR1cyAmIElURV9JMkNIU1JfVERJKSkgewoJICAgYWRhcC0+d2FpdGZvcnBpbigpOwoJICAgKnN0YXR1cyA9IGlpY19pbncoYWRhcCwgSVRFX0kyQ0hTUik7Cgl9CiNlbmRpZgoJaWYgKHRpbWVvdXQgPD0gMCkKCQlyZXR1cm4oLTEpOwoJZWxzZQoJCXJldHVybigwKTsKfQoKc3RhdGljIGludCB3YWl0X2Zvcl9mZShzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmFkYXAsIHNob3J0ICpzdGF0dXMpCnsKCWludCB0aW1lb3V0ID0gREVGX1RJTUVPVVQ7CgoJKnN0YXR1cyA9IGlpY19pbncoYWRhcCwgSVRFX0kyQ0ZTUik7CiNpZm5kZWYgU1RVQl9JMkMgCgl3aGlsZSAodGltZW91dC0tICYmICgqc3RhdHVzICYgSVRFX0kyQ0ZTUl9GRSkpIHsKCQl1ZGVsYXkoMTAwMCk7CgkJaWljX2ludyhhZGFwLCBJVEVfSTJDRlNSKTsKCX0KI2VuZGlmCglpZiAodGltZW91dCA8PSAwKSAKCQlyZXR1cm4oLTEpOwoJZWxzZQoJCXJldHVybigwKTsKfQoKc3RhdGljIGludCBpaWNfaW5pdCAoc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwKQp7CglzaG9ydCBpOwoKCS8qIENsZWFyIGJpdCA3IHRvIHNldCBJMkMgdG8gbm9ybWFsIG9wZXJhdGlvbiBtb2RlICovCglpPWlpY19pbncoYWRhcCwgUE1fRFNSKSYgMHhmZjdmOwoJaWljX291dHcoYWRhcCwgUE1fRFNSLCBpKTsKCgkvKiBzZXQgSVRfR1BDQ1IgcG9ydCBDIGJpdCAyJjMgYXMgZnVuY3Rpb24gMiAqLwoJaSA9IGlpY19pbncoYWRhcCwgR1BJT19DQ1IpICYgMHhmYzBmOwoJaWljX291dHcoYWRhcCxHUElPX0NDUixpKTsKCgkvKiBDbGVhciBzbGF2ZSBhZGRyZXNzL3N1Yi1hZGRyZXNzICovCglpaWNfb3V0dyhhZGFwLElURV9JMkNTQVIsIDApOwoJaWljX291dHcoYWRhcCxJVEVfSTJDU1NBUiwgMCk7CgoJLyogU2V0IGNsb2NrIGNvdW50ZXIgcmVnaXN0ZXIgKi8KCWlpY19vdXR3KGFkYXAsSVRFX0kyQ0NLQ05ULCBnZXRfY2xvY2soYWRhcCkpOwoKCS8qIFNldCBTVEFSVC9yZVNUQVJUL1NUT1AgdGltZSByZWdpc3RlcnMgKi8KCWlpY19vdXR3KGFkYXAsSVRFX0kyQ1NIRFIsIDB4MGEpOwoJaWljX291dHcoYWRhcCxJVEVfSTJDUlNVUiwgMHgwYSk7CglpaWNfb3V0dyhhZGFwLElURV9JMkNQU1VSLCAweDBhKTsKCgkvKiBFbmFibGUgaW50ZXJydXB0cyBvbiBjb21wbGV0aW5nIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uICovCglpaWNfb3V0dyhhZGFwLElURV9JMkNIQ1IsIElURV9JMkNIQ1JfSUUgfCBJVEVfSTJDSENSX0hDRSk7CgoJLyogQ2xlYXIgdHJhbnNmZXIgY291bnQgKi8KCWlpY19vdXR3KGFkYXAsSVRFX0kyQ0ZCQ1IsIDB4MCk7CgoJREVCMihwcmludGsoImlpY19pbml0OiBJbml0aWFsaXplZCBJSUMgb24gSVRFIDB4JXhcbiIsCgkJaWljX2ludyhhZGFwLCBJVEVfSTJDSFNSKSkpOwoJcmV0dXJuIDA7Cn0KCgovKgogKiBTYW5pdHkgY2hlY2sgZm9yIHRoZSBhZGFwdGVyIGhhcmR3YXJlIC0gY2hlY2sgdGhlIHJlYWN0aW9uIG9mCiAqIHRoZSBidXMgbGluZXMgb25seSBpZiBpdCBzZWVtcyB0byBiZSBpZGxlLgogKi8Kc3RhdGljIGludCB0ZXN0X2J1cyhzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmFkYXAsIGNoYXIgKm5hbWUpIHsKI2lmIDAKCWludCBzY2wsc2RhOwoJc2RhPWdldHNkYShhZGFwKTsKCWlmIChhZGFwLT5nZXRzY2w9PU5VTEwpIHsKCQlwcmludGsoInRlc3RfYnVzOiBXYXJuaW5nOiBBZGFwdGVyIGNhbid0IHJlYWQgZnJvbSBjbG9jayBsaW5lIC0gc2tpcHBpbmcgdGVzdC5cbiIpOwoJCXJldHVybiAwOwkJCgl9CglzY2w9Z2V0c2NsKGFkYXApOwoJcHJpbnRrKCJ0ZXN0X2J1czogQWRhcHRlcjogJXMgc2NsOiAlZCAgc2RhOiAlZCAtLSB0ZXN0aW5nLi4uXG4iLAoJbmFtZSxnZXRzY2woYWRhcCksZ2V0c2RhKGFkYXApKTsKCWlmICghc2NsIHx8ICFzZGEgKSB7CgkJcHJpbnRrKCJ0ZXN0X2J1czogJXMgc2VlbXMgdG8gYmUgYnVzeS5cbiIsYWRhcC0+bmFtZSk7CgkJZ290byBiYWlsb3V0OwoJfQoJc2RhbG8oYWRhcCk7CglwcmludGsoInRlc3RfYnVzOjEgc2NsOiAlZCAgc2RhOiAlZCBcbiIsZ2V0c2NsKGFkYXApLAoJICAgICAgIGdldHNkYShhZGFwKSk7CglpZiAoIDAgIT0gZ2V0c2RhKGFkYXApICkgewoJCXByaW50aygidGVzdF9idXM6ICVzIFNEQSBzdHVjayBoaWdoIVxuIixuYW1lKTsKCQlzZGFoaShhZGFwKTsKCQlnb3RvIGJhaWxvdXQ7Cgl9CglpZiAoIDAgPT0gZ2V0c2NsKGFkYXApICkgewoJCXByaW50aygidGVzdF9idXM6ICVzIFNDTCB1bmV4cGVjdGVkIGxvdyB3aGlsZSBwdWxsaW5nIFNEQSBsb3chXG4iLAoJCQluYW1lKTsKCQlnb3RvIGJhaWxvdXQ7Cgl9CQkKCXNkYWhpKGFkYXApOwoJcHJpbnRrKCJ0ZXN0X2J1czoyIHNjbDogJWQgIHNkYTogJWQgXG4iLGdldHNjbChhZGFwKSwKCSAgICAgICBnZXRzZGEoYWRhcCkpOwoJaWYgKCAwID09IGdldHNkYShhZGFwKSApIHsKCQlwcmludGsoInRlc3RfYnVzOiAlcyBTREEgc3R1Y2sgbG93IVxuIixuYW1lKTsKCQlzZGFoaShhZGFwKTsKCQlnb3RvIGJhaWxvdXQ7Cgl9CglpZiAoIDAgPT0gZ2V0c2NsKGFkYXApICkgewoJCXByaW50aygidGVzdF9idXM6ICVzIFNDTCB1bmV4cGVjdGVkIGxvdyB3aGlsZSBTREEgaGlnaCFcbiIsCgkJICAgICAgIGFkYXAtPm5hbWUpOwoJZ290byBiYWlsb3V0OwoJfQoJc2NsbG8oYWRhcCk7CglwcmludGsoInRlc3RfYnVzOjMgc2NsOiAlZCAgc2RhOiAlZCBcbiIsZ2V0c2NsKGFkYXApLAoJICAgICAgIGdldHNkYShhZGFwKSk7CglpZiAoIDAgIT0gZ2V0c2NsKGFkYXApICkgewoKCQlzY2xoaShhZGFwKTsKCQlnb3RvIGJhaWxvdXQ7Cgl9CglpZiAoIDAgPT0gZ2V0c2RhKGFkYXApICkgewoJCXByaW50aygidGVzdF9idXM6ICVzIFNEQSB1bmV4cGVjdGVkIGxvdyB3aGlsZSBwdWxsaW5nIFNDTCBsb3chXG4iLAoJCQluYW1lKTsKCQlnb3RvIGJhaWxvdXQ7Cgl9CglzY2xoaShhZGFwKTsKCXByaW50aygidGVzdF9idXM6NCBzY2w6ICVkICBzZGE6ICVkIFxuIixnZXRzY2woYWRhcCksCgkgICAgICAgZ2V0c2RhKGFkYXApKTsKCWlmICggMCA9PSBnZXRzY2woYWRhcCkgKSB7CgkJcHJpbnRrKCJ0ZXN0X2J1czogJXMgU0NMIHN0dWNrIGxvdyFcbiIsbmFtZSk7CgkJc2NsaGkoYWRhcCk7CgkJZ290byBiYWlsb3V0OwoJfQoJaWYgKCAwID09IGdldHNkYShhZGFwKSApIHsKCQlwcmludGsoInRlc3RfYnVzOiAlcyBTREEgdW5leHBlY3RlZCBsb3cgd2hpbGUgU0NMIGhpZ2ghXG4iLAoJCQluYW1lKTsKCQlnb3RvIGJhaWxvdXQ7Cgl9CglwcmludGsoInRlc3RfYnVzOiAlcyBwYXNzZWQgdGVzdC5cbiIsbmFtZSk7CglyZXR1cm4gMDsKYmFpbG91dDoKCXNkYWhpKGFkYXApOwoJc2NsaGkoYWRhcCk7CglyZXR1cm4gLUVOT0RFVjsKI2VuZGlmCglyZXR1cm4gKDApOwp9CgovKiAtLS0tLSBVdGlsaXR5IGZ1bmN0aW9ucwogKi8KCgovKiBWZXJpZnkgdGhlIGRldmljZSB3ZSB3YW50IHRvIHRhbGsgdG8gb24gdGhlIElJQyBidXMgcmVhbGx5IGV4aXN0cy4gKi8Kc3RhdGljIGlubGluZSBpbnQgdHJ5X2FkZHJlc3Moc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwLAoJCSAgICAgICB1bnNpZ25lZCBpbnQgYWRkciwgaW50IHJldHJpZXMpCnsKCWludCBpLCByZXQgPSAtMTsKCXNob3J0IHN0YXR1czsKCglmb3IgKGk9MDtpPHJldHJpZXM7aSsrKSB7CgkJaWljX291dHcoYWRhcCwgSVRFX0kyQ1NBUiwgYWRkcik7CgkJaWljX3N0YXJ0KGFkYXApOwoJCWlmICh3YWl0X2Zvcl9waW4oYWRhcCwgJnN0YXR1cykgPT0gMCkgewoJCQlpZiAoKHN0YXR1cyAmIElURV9JMkNIU1JfRE5FKSA9PSAwKSB7IAoJCQkJaWljX3N0b3AoYWRhcCk7CgkJCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDRkNSLCBJVEVfSTJDRkNSX0ZMVVNIKTsKCQkJCXJldD0xOwoJCQkJYnJlYWs7CS8qIHN1Y2Nlc3MhICovCgkJCX0KCQl9CgkJaWljX3N0b3AoYWRhcCk7CgkJdWRlbGF5KGFkYXAtPnVkZWxheSk7Cgl9CglERUIyKGlmIChpKSBwcmludGsoInRyeV9hZGRyZXNzOiBuZWVkZWQgJWQgcmV0cmllcyBmb3IgMHgleFxuIixpLAoJICAgICAgICAgICAgICAgICAgIGFkZHIpKTsKCXJldHVybiByZXQ7Cn0KCgpzdGF0aWMgaW50IGlpY19zZW5kYnl0ZXMoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCxjb25zdCBjaGFyICpidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpCnsKCXN0cnVjdCBpMmNfYWxnb19paWNfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CglpbnQgd3Jjb3VudD0wLCB0aW1lb3V0OwoJc2hvcnQgc3RhdHVzOwoJaW50IGxvb3BzLCByZW1haW5kZXIsIGksIGo7Cgl1bmlvbiB7CgkJY2hhciBieXRlWzJdOwoJCXVuc2lnbmVkIHNob3J0IHdvcmQ7Cgl9IHRtcDsKICAgCglpaWNfb3V0dyhhZGFwLCBJVEVfSTJDU1NBUiwgKHVuc2lnbmVkIHNob3J0KWJ1Zlt3cmNvdW50KytdKTsKCWNvdW50LS07CglpZiAoY291bnQgPT0gMCkKCQlyZXR1cm4gLUVJTzsKCglsb29wcyA9ICBjb3VudCAvIDMyOwkJLyogMzItYnl0ZSBGSUZPICovCglyZW1haW5kZXIgPSBjb3VudCAlIDMyOwoKCWlmKGxvb3BzKSB7CgkJZm9yKGk9MDsgaTxsb29wczsgaSsrKSB7CgoJCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDRkJDUiwgMzIpOwoJCQlmb3Ioaj0wOyBqPDMyLzI7IGorKykgewoJCQkJdG1wLmJ5dGVbMV0gPSBidWZbd3Jjb3VudCsrXTsKCQkJCXRtcC5ieXRlWzBdID0gYnVmW3dyY291bnQrK107CgkJCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDRkRSLCB0bXAud29yZCk7IAoJCQl9CgoJCQkvKiBzdGF0dXMgRklGTyBvdmVycnVuICovCgkJCWlpY19pbncoYWRhcCwgSVRFX0kyQ0ZTUik7CgkJCWlpY19pbncoYWRhcCwgSVRFX0kyQ0ZCQ1IpOwoKCQkJaWljX291dHcoYWRhcCwgSVRFX0kyQ0hDUiwgSVRFX1dSSVRFKTsJLyogSXNzdWUgV1JJVEUgY29tbWFuZCAqLwoKCQkJLyogV2FpdCBmb3IgdHJhbnNtaXNzaW9uIHRvIGNvbXBsZXRlICovCgkJCXRpbWVvdXQgPSB3YWl0X2Zvcl9waW4oYWRhcCwgJnN0YXR1cyk7CgkJCWlmKHRpbWVvdXQpIHsKCQkJCWlpY19zdG9wKGFkYXApOwoJCQkJcHJpbnRrKCJpaWNfc2VuZGJ5dGVzOiAlcyB3cml0ZSB0aW1lb3V0LlxuIiwgaTJjX2FkYXAtPm5hbWUpOwoJCQkJcmV0dXJuIC1FUkVNT1RFSU87IC8qIGdvdCBhIGJldHRlciBvbmUgPz8gKi8KICAgICAJfQoJCQlpZiAoc3RhdHVzICYgSVRFX0kyQ0hTUl9EQikgewoJCQkJaWljX3N0b3AoYWRhcCk7CgkJCQlwcmludGsoImlpY19zZW5kYnl0ZXM6ICVzIHdyaXRlIGVycm9yIC0gbm8gYWNrLlxuIiwgaTJjX2FkYXAtPm5hbWUpOwoJCQkJcmV0dXJuIC1FUkVNT1RFSU87IC8qIGdvdCBhIGJldHRlciBvbmUgPz8gKi8KCQkJfQoJCX0KCX0KCWlmKHJlbWFpbmRlcikgewoJCWlpY19vdXR3KGFkYXAsIElURV9JMkNGQkNSLCByZW1haW5kZXIpOwoJCWZvcihpPTA7IGk8cmVtYWluZGVyLzI7IGkrKykgewoJCQl0bXAuYnl0ZVsxXSA9IGJ1Zlt3cmNvdW50KytdOwoJCQl0bXAuYnl0ZVswXSA9IGJ1Zlt3cmNvdW50KytdOwoJCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDRkRSLCB0bXAud29yZCk7CgkJfQoKCQkvKiBzdGF0dXMgRklGTyBvdmVycnVuICovCgkJaWljX2ludyhhZGFwLCBJVEVfSTJDRlNSKTsKCQlpaWNfaW53KGFkYXAsIElURV9JMkNGQkNSKTsKCgkJaWljX291dHcoYWRhcCwgSVRFX0kyQ0hDUiwgSVRFX1dSSVRFKTsgIC8qIElzc3VlIFdSSVRFIGNvbW1hbmQgKi8KCgkJdGltZW91dCA9IHdhaXRfZm9yX3BpbihhZGFwLCAmc3RhdHVzKTsKCQlpZih0aW1lb3V0KSB7CgkJCWlpY19zdG9wKGFkYXApOwoJCQlwcmludGsoImlpY19zZW5kYnl0ZXM6ICVzIHdyaXRlIHRpbWVvdXQuXG4iLCBpMmNfYWRhcC0+bmFtZSk7CgkJCXJldHVybiAtRVJFTU9URUlPOyAvKiBnb3QgYSBiZXR0ZXIgb25lID8/ICovCgkJfQojaWZuZGVmIFNUVUJfSTJDCgkJaWYgKHN0YXR1cyAmIElURV9JMkNIU1JfREIpIHsgCgkJCWlpY19zdG9wKGFkYXApOwoJCQlwcmludGsoImlpY19zZW5kYnl0ZXM6ICVzIHdyaXRlIGVycm9yIC0gbm8gYWNrLlxuIiwgaTJjX2FkYXAtPm5hbWUpOwoJCQlyZXR1cm4gLUVSRU1PVEVJTzsgLyogZ290IGEgYmV0dGVyIG9uZSA/PyAqLwoJCX0KI2VuZGlmCgl9CglpaWNfc3RvcChhZGFwKTsKCXJldHVybiB3cmNvdW50Owp9CgoKc3RhdGljIGludCBpaWNfcmVhZGJ5dGVzKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIGNoYXIgKmJ1ZiwgaW50IGNvdW50LAoJaW50IHNyZWFkKQp7CglpbnQgcmRjb3VudD0wLCBpLCB0aW1lb3V0OwoJc2hvcnQgc3RhdHVzOwoJc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKCWludCBsb29wcywgcmVtYWluZGVyLCBqOwoJdW5pb24gewoJCWNoYXIgYnl0ZVsyXTsKCQl1bnNpZ25lZCBzaG9ydCB3b3JkOwoJfSB0bXA7CgkJCglsb29wcyA9IGNvdW50IC8gMzI7CQkJCS8qIDMyLWJ5dGUgRklGTyAqLwoJcmVtYWluZGVyID0gY291bnQgJSAzMjsKCglpZihsb29wcykgewoJCWZvcihpPTA7IGk8bG9vcHM7IGkrKykgewoJCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDRkJDUiwgMzIpOwoJCQlpZiAoc3JlYWQpCgkJCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDSENSLCBJVEVfU1JFQUQpOwoJCQllbHNlCgkJCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDSENSLCBJVEVfUkVBRCk7CQkvKiBJc3N1ZSBSRUFEIGNvbW1hbmQgKi8KCgkJCXRpbWVvdXQgPSB3YWl0X2Zvcl9waW4oYWRhcCwgJnN0YXR1cyk7CgkJCWlmKHRpbWVvdXQpIHsKCQkJCWlpY19zdG9wKGFkYXApOwoJCQkJcHJpbnRrKCJpaWNfcmVhZGJ5dGVzOiAgJXMgcmVhZCB0aW1lb3V0LlxuIiwgaTJjX2FkYXAtPm5hbWUpOwoJCQkJcmV0dXJuICgtMSk7CgkJCX0KI2lmbmRlZiBTVFVCX0kyQwoJCQlpZiAoc3RhdHVzICYgSVRFX0kyQ0hTUl9EQikgewoJCQkJaWljX3N0b3AoYWRhcCk7CgkJCQlwcmludGsoImlpY19yZWFkYnl0ZXM6ICVzIHJlYWQgZXJyb3IgLSBubyBhY2suXG4iLCBpMmNfYWRhcC0+bmFtZSk7CgkJCQlyZXR1cm4gKC0xKTsKCQkJfQojZW5kaWYKCgkJCXRpbWVvdXQgPSB3YWl0X2Zvcl9mZShhZGFwLCAmc3RhdHVzKTsKCQkJaWYodGltZW91dCkgewoJCQkJaWljX3N0b3AoYWRhcCk7CgkJCQlwcmludGsoImlpY19yZWFkYnl0ZXM6ICAlcyBGSUZPIGlzIGVtcHR5XG4iLCBpMmNfYWRhcC0+bmFtZSk7CgkJCQlyZXR1cm4gKC0xKTsgCgkJCX0KCgkJCWZvcihqPTA7IGo8MzIvMjsgaisrKSB7CgkJCQl0bXAud29yZCA9IGlpY19pbncoYWRhcCwgSVRFX0kyQ0ZEUik7CgkJCQlidWZbcmRjb3VudCsrXSA9IHRtcC5ieXRlWzFdOwoJCQkJYnVmW3JkY291bnQrK10gPSB0bXAuYnl0ZVswXTsKCQkJfQoKCQkJLyogc3RhdHVzIEZJRk8gdW5kZXJydW4gKi8KCQkJaWljX2ludyhhZGFwLCBJVEVfSTJDRlNSKTsKCgkJfQoJfQoKCglpZihyZW1haW5kZXIpIHsKCQlyZW1haW5kZXI9KHJlbWFpbmRlcisxKS8yICogMjsKCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDRkJDUiwgcmVtYWluZGVyKTsKCQlpZiAoc3JlYWQpCgkJCWlpY19vdXR3KGFkYXAsIElURV9JMkNIQ1IsIElURV9TUkVBRCk7CgkJZWxzZQoJCWlpY19vdXR3KGFkYXAsIElURV9JMkNIQ1IsIElURV9SRUFEKTsJCS8qIElzc3VlIFJFQUQgY29tbWFuZCAqLwoKCQl0aW1lb3V0ID0gd2FpdF9mb3JfcGluKGFkYXAsICZzdGF0dXMpOwoJCWlmKHRpbWVvdXQpIHsKCQkJaWljX3N0b3AoYWRhcCk7CgkJCXByaW50aygiaWljX3JlYWRieXRlczogICVzIHJlYWQgdGltZW91dC5cbiIsIGkyY19hZGFwLT5uYW1lKTsKCQkJcmV0dXJuICgtMSk7CgkJfQojaWZuZGVmIFNUVUJfSTJDCgkJaWYgKHN0YXR1cyAmIElURV9JMkNIU1JfREIpIHsKCQkJaWljX3N0b3AoYWRhcCk7CgkJCXByaW50aygiaWljX3JlYWRieXRlczogJXMgcmVhZCBlcnJvciAtIG5vIGFjay5cbiIsIGkyY19hZGFwLT5uYW1lKTsKCQkJcmV0dXJuICgtMSk7CgkJfQojZW5kaWYKCQl0aW1lb3V0ID0gd2FpdF9mb3JfZmUoYWRhcCwgJnN0YXR1cyk7CgkJaWYodGltZW91dCkgewoJCQlpaWNfc3RvcChhZGFwKTsKCQkJcHJpbnRrKCJpaWNfcmVhZGJ5dGVzOiAgJXMgRklGTyBpcyBlbXB0eVxuIiwgaTJjX2FkYXAtPm5hbWUpOwoJCQlyZXR1cm4gKC0xKTsKCQl9ICAgICAgICAgCgoJCWZvcihpPTA7IGk8KHJlbWFpbmRlcisxKS8yOyBpKyspIHsKCQkJdG1wLndvcmQgPSBpaWNfaW53KGFkYXAsIElURV9JMkNGRFIpOwoJCQlidWZbcmRjb3VudCsrXSA9IHRtcC5ieXRlWzFdOwoJCQlidWZbcmRjb3VudCsrXSA9IHRtcC5ieXRlWzBdOwoJCX0KCgkJLyogc3RhdHVzIEZJRk8gdW5kZXJydW4gKi8KCQlpaWNfaW53KGFkYXAsIElURV9JMkNGU1IpOwoKCX0KCglpaWNfc3RvcChhZGFwKTsKCXJldHVybiByZGNvdW50Owp9CgoKLyogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIGNvbWJpbmVkIHRyYW5zYWN0aW9ucy4gIENvbWJpbmVkCiAqIHRyYW5zYWN0aW9ucyBjb25zaXN0IG9mIGNvbWJpbmF0aW9ucyBvZiByZWFkaW5nIGFuZCB3cml0aW5nIGJsb2NrcyBvZiBkYXRhLgogKiBFYWNoIHRyYW5zZmVyIChpLmUuIGEgcmVhZCBvciBhIHdyaXRlKSBpcyBzZXBhcmF0ZWQgYnkgYSByZXBlYXRlZCBzdGFydAogKiBjb25kaXRpb24uCiAqLwojaWYgMApzdGF0aWMgaW50IGlpY19jb21iaW5lZF90cmFuc2FjdGlvbihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCBzdHJ1Y3QgaTJjX21zZyAqbXNncywgaW50IG51bSkgCnsKICAgaW50IGk7CiAgIHN0cnVjdCBpMmNfbXNnICpwbXNnOwogICBpbnQgcmV0OwoKICAgREVCMihwcmludGsoIkJlZ2lubmluZyBjb21iaW5lZCB0cmFuc2FjdGlvblxuIikpOwoKICAgZm9yKGk9MDsgaTwobnVtLTEpOyBpKyspIHsKICAgICAgcG1zZyA9ICZtc2dzW2ldOwogICAgICBpZihwbXNnLT5mbGFncyAmIEkyQ19NX1JEKSB7CiAgICAgICAgIERFQjIocHJpbnRrKCIgIFRoaXMgb25lIGlzIGEgcmVhZFxuIikpOwogICAgICAgICByZXQgPSBpaWNfcmVhZGJ5dGVzKGkyY19hZGFwLCBwbXNnLT5idWYsIHBtc2ctPmxlbiwgSUlDX0NPTUJJTkVEX1hGRVIpOwogICAgICB9CiAgICAgIGVsc2UgaWYoIShwbXNnLT5mbGFncyAmIEkyQ19NX1JEKSkgewogICAgICAgICBERUIyKHByaW50aygiVGhpcyBvbmUgaXMgYSB3cml0ZVxuIikpOwogICAgICAgICByZXQgPSBpaWNfc2VuZGJ5dGVzKGkyY19hZGFwLCBwbXNnLT5idWYsIHBtc2ctPmxlbiwgSUlDX0NPTUJJTkVEX1hGRVIpOwogICAgICB9CiAgIH0KICAgLyogTGFzdCByZWFkIG9yIHdyaXRlIHNlZ21lbnQgbmVlZHMgdG8gYmUgdGVybWluYXRlZCB3aXRoIGEgc3RvcCAqLwogICBwbXNnID0gJm1zZ3NbaV07CgogICBpZihwbXNnLT5mbGFncyAmIEkyQ19NX1JEKSB7CiAgICAgIERFQjIocHJpbnRrKCJEb2luZyB0aGUgbGFzdCByZWFkXG4iKSk7CiAgICAgIHJldCA9IGlpY19yZWFkYnl0ZXMoaTJjX2FkYXAsIHBtc2ctPmJ1ZiwgcG1zZy0+bGVuLCBJSUNfU0lOR0xFX1hGRVIpOwogICB9CiAgIGVsc2UgaWYoIShwbXNnLT5mbGFncyAmIEkyQ19NX1JEKSkgewogICAgICBERUIyKHByaW50aygiRG9pbmcgdGhlIGxhc3Qgd3JpdGVcbiIpKTsKICAgICAgcmV0ID0gaWljX3NlbmRieXRlcyhpMmNfYWRhcCwgcG1zZy0+YnVmLCBwbXNnLT5sZW4sIElJQ19TSU5HTEVfWEZFUik7CiAgIH0KCiAgIHJldHVybiByZXQ7Cn0KI2VuZGlmCgoKLyogV2hlbmV2ZXIgd2UgaW5pdGlhdGUgYSB0cmFuc2FjdGlvbiwgdGhlIGZpcnN0IGJ5dGUgY2xvY2tlZAogKiBvbnRvIHRoZSBidXMgYWZ0ZXIgdGhlIHN0YXJ0IGNvbmRpdGlvbiBpcyB0aGUgYWRkcmVzcyAoNyBiaXQpIG9mIHRoZQogKiBkZXZpY2Ugd2Ugd2FudCB0byB0YWxrIHRvLiAgVGhpcyBmdW5jdGlvbiBtYW5pcHVsYXRlcyB0aGUgYWRkcmVzcyBzcGVjaWZpZWQKICogc28gdGhhdCBpdCBtYWtlcyBzZW5zZSB0byB0aGUgaGFyZHdhcmUgd2hlbiB3cml0dGVuIHRvIHRoZSBJSUMgcGVyaXBoZXJhbC4KICoKICogTm90ZTogMTAgYml0IGFkZHJlc3NlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGRyaXZlciwgYWx0aG91Z2ggdGhleSBhcmUKICogc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZS4gIFRoaXMgZnVuY3Rpb25hbGl0eSBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZC4KICovCnN0YXRpYyBpbmxpbmUgaW50IGlpY19kb0FkZHJlc3Moc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpMmNfbXNnICptc2csIGludCByZXRyaWVzKSAKewoJdW5zaWduZWQgc2hvcnQgZmxhZ3MgPSBtc2ctPmZsYWdzOwoJdW5zaWduZWQgaW50IGFkZHI7CglpbnQgcmV0OwoKLyogVGVuIGJpdCBhZGRyZXNzZXMgbm90IHN1cHBvcnRlZCByaWdodCBub3cgKi8KCWlmICggKGZsYWdzICYgSTJDX01fVEVOKSAgKSB7IAojaWYgMAoJCWFkZHIgPSAweGYwIHwgKCggbXNnLT5hZGRyID4+IDcpICYgMHgwMyk7CgkJREVCMihwcmludGsoImFkZHIwOiAlZFxuIixhZGRyKSk7CgkJcmV0ID0gdHJ5X2FkZHJlc3MoYWRhcCwgYWRkciwgcmV0cmllcyk7CgkJaWYgKHJldCE9MSkgewoJCQlwcmludGsoImlpY19kb0FkZHJlc3M6IGRpZWQgYXQgZXh0ZW5kZWQgYWRkcmVzcyBjb2RlLlxuIik7CgkJCXJldHVybiAtRVJFTU9URUlPOwoJCX0KCQlpaWNfb3V0dyhhZGFwLG1zZy0+YWRkciAmIDB4N2YpOwoJCWlmIChyZXQgIT0gMSkgewoJCQlwcmludGsoImlpY19kb0FkZHJlc3M6IGRpZWQgYXQgMm5kIGFkZHJlc3MgY29kZS5cbiIpOwoJCQlyZXR1cm4gLUVSRU1PVEVJTzsKCQl9CgkJaWYgKCBmbGFncyAmIEkyQ19NX1JEICkgewoJCQlpMmNfcmVwc3RhcnQoYWRhcCk7CgkJCWFkZHIgfD0gMHgwMTsKCQkJcmV0ID0gdHJ5X2FkZHJlc3MoYWRhcCwgYWRkciwgcmV0cmllcyk7CgkJCWlmIChyZXQhPTEpIHsKCQkJCXByaW50aygiaWljX2RvQWRkcmVzczogZGllZCBhdCBleHRlbmRlZCBhZGRyZXNzIGNvZGUuXG4iKTsKCQkJCXJldHVybiAtRVJFTU9URUlPOwoJCQl9CgkJfQojZW5kaWYKCX0gZWxzZSB7CgoJCWFkZHIgPSAoIG1zZy0+YWRkciA8PCAxICk7CgojaWYgMAoJCWlmIChmbGFncyAmIEkyQ19NX1JEICkKCQkJYWRkciB8PSAxOwoJCWlmIChmbGFncyAmIEkyQ19NX1JFVl9ESVJfQUREUiApCgkJCWFkZHIgXj0gMTsKI2VuZGlmCgoJCWlmIChpaWNfaW53KGFkYXAsIElURV9JMkNTQVIpICE9IGFkZHIpIHsKCQkJaWljX291dHcoYWRhcCwgSVRFX0kyQ1NBUiwgYWRkcik7CgkJCXJldCA9IHRyeV9hZGRyZXNzKGFkYXAsIGFkZHIsIHJldHJpZXMpOwoJCQlpZiAocmV0IT0xKSB7CgkJCQlwcmludGsoImlpY19kb0FkZHJlc3M6IGRpZWQgYXQgYWRkcmVzcyBjb2RlLlxuIik7CgkJCQlyZXR1cm4gLUVSRU1PVEVJTzsKCQkJfQoJCX0KCiAgfQoKCXJldHVybiAwOwp9CgoKLyogRGVzY3JpcHRpb246IFByZXBhcmVzIHRoZSBjb250cm9sbGVyIGZvciBhIHRyYW5zYWN0aW9uIChjbGVhcmluZyBzdGF0dXMKICogcmVnaXN0ZXJzLCBkYXRhIGJ1ZmZlcnMsIGV0YyksIGFuZCB0aGVuIGNhbGxzIGVpdGhlciBpaWNfcmVhZGJ5dGVzIG9yCiAqIGlpY19zZW5kYnl0ZXMgdG8gZG8gdGhlIGFjdHVhbCB0cmFuc2FjdGlvbi4KICoKICogc3RpbGwgdG8gYmUgZG9uZTogQmVmb3JlIHdlIGlzc3VlIGEgdHJhbnNhY3Rpb24sIHdlIHNob3VsZAogKiB2ZXJpZnkgdGhhdCB0aGUgYnVzIGlzIG5vdCBidXN5IG9yIGluIHNvbWUgdW5rbm93biBzdGF0ZS4KICovCnN0YXRpYyBpbnQgaWljX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwKCQkgICAgc3RydWN0IGkyY19tc2cgKm1zZ3MsIAoJCSAgICBpbnQgbnVtKQp7CglzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmFkYXAgPSBpMmNfYWRhcC0+YWxnb19kYXRhOwoJc3RydWN0IGkyY19tc2cgKnBtc2c7CglpbnQgaSA9IDA7CglpbnQgcmV0LCB0aW1lb3V0OwogICAgCglwbXNnID0gJm1zZ3NbaV07CgoJaWYoIXBtc2ctPmxlbikgewoJCURFQjIocHJpbnRrKCJpaWNfeGZlcjogcmVhZC93cml0ZSBsZW5ndGggaXMgMFxuIik7KQoJCXJldHVybiAtRUlPOwoJfQoJaWYoIShwbXNnLT5mbGFncyAmIEkyQ19NX1JEKSAmJiAoIShwbXNnLT5sZW4pJTIpICkgewoJCURFQjIocHJpbnRrKCJpaWNfeGZlcjogd3JpdGUgYnVmZmVyIGxlbmd0aCBpcyBub3Qgb2RkXG4iKTspCgkJcmV0dXJuIC1FSU87IAoJfQoKCS8qIFdhaXQgZm9yIGFueSBwZW5kaW5nIHRyYW5zZmVycyB0byBjb21wbGV0ZSAqLwoJdGltZW91dCA9IHdhaXRfZm9yX2JiKGFkYXApOwoJaWYgKHRpbWVvdXQpIHsKCQlERUIyKHByaW50aygiaWljX3hmZXI6IFRpbWVvdXQgd2FpdGluZyBmb3IgaG9zdCBub3QgYnVzeVxuIik7KQoJCXJldHVybiAtRUlPOwoJfQoKCS8qIEZsdXNoIEZJRk8gKi8KCWlpY19vdXR3KGFkYXAsIElURV9JMkNGQ1IsIElURV9JMkNGQ1JfRkxVU0gpOwoKCS8qIExvYWQgYWRkcmVzcyAqLwoJcmV0ID0gaWljX2RvQWRkcmVzcyhhZGFwLCBwbXNnLCBpMmNfYWRhcC0+cmV0cmllcyk7CglpZiAocmV0KQoJCXJldHVybiAtRUlPOwoKI2lmIDAKCS8qIENvbWJpbmVkIHRyYW5zYWN0aW9uIChyZWFkIGFuZCB3cml0ZSkgKi8KCWlmKG51bSA+IDEpIHsKICAgICAgICAgICBERUIyKHByaW50aygiaWljX3hmZXI6IENhbGwgY29tYmluZWQgdHJhbnNhY3Rpb25cbiIpKTsKICAgICAgICAgICByZXQgPSBpaWNfY29tYmluZWRfdHJhbnNhY3Rpb24oaTJjX2FkYXAsIG1zZ3MsIG51bSk7CiAgfQojZW5kaWYKCglERUIzKHByaW50aygiaWljX3hmZXI6IE1zZyAlZCwgYWRkcj0weCV4LCBmbGFncz0weCV4LCBsZW49JWRcbiIsCgkJaSwgbXNnc1tpXS5hZGRyLCBtc2dzW2ldLmZsYWdzLCBtc2dzW2ldLmxlbik7KQoKCWlmKHBtc2ctPmZsYWdzICYgSTJDX01fUkQpIAkJLyogUmVhZCAqLwoJCXJldCA9IGlpY19yZWFkYnl0ZXMoaTJjX2FkYXAsIHBtc2ctPmJ1ZiwgcG1zZy0+bGVuLCAwKTsKCWVsc2UgewkJCQkJCQkJCQkJCQkvKiBXcml0ZSAqLyAKCQl1ZGVsYXkoMTAwMCk7CgkJcmV0ID0gaWljX3NlbmRieXRlcyhpMmNfYWRhcCwgcG1zZy0+YnVmLCBwbXNnLT5sZW4pOwoJfQoKCWlmIChyZXQgIT0gcG1zZy0+bGVuKQoJCURFQjMocHJpbnRrKCJpaWNfeGZlcjogZXJyb3Igb3IgZmFpbCBvbiByZWFkL3dyaXRlICVkIGJ5dGVzLlxuIixyZXQpKTsgCgllbHNlCgkJREVCMyhwcmludGsoImlpY194ZmVyOiByZWFkL3dyaXRlICVkIGJ5dGVzLlxuIixyZXQpKTsKCglyZXR1cm4gcmV0Owp9CgoKLyogSW1wbGVtZW50cyBkZXZpY2Ugc3BlY2lmaWMgaW9jdGxzLiAgSGlnaGVyIGxldmVsIGlvY3RscyBjYW4KICogYmUgZm91bmQgaW4gaTJjLWNvcmUuYyBhbmQgYXJlIHR5cGljYWwgb2YgYW55IGkyYyBjb250cm9sbGVyIChzcGVjaWZ5aW5nCiAqIHNsYXZlIGFkZHJlc3MsIHRpbWVvdXRzLCBldGMpLiAgVGhlc2UgaW9jdGxzIHRha2UgYWR2YW50YWdlIG9mIGFueSBoYXJkd2FyZQogKiBmZWF0dXJlcyBidWlsdCBpbnRvIHRoZSBjb250cm9sbGVyIGZvciB3aGljaCB0aGlzIGFsZ29yaXRobS1hZGFwdGVyIHNldAogKiB3YXMgd3JpdHRlbi4gIFRoZXNlIGlvY3RscyBhbGxvdyB5b3UgdG8gdGFrZSBjb250cm9sIG9mIHRoZSBkYXRhIGFuZCBjbG9jawogKiBsaW5lcyBhbmQgc2V0IHRoZSBlaXRoZXIgaGlnaCBvciBsb3csCiAqIHNpbWlsYXIgdG8gYSBHUElPIHBpbi4KICovCnN0YXRpYyBpbnQgYWxnb19jb250cm9sKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgCgl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKewoKICBzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmFkYXAgPSBhZGFwdGVyLT5hbGdvX2RhdGE7CiAgc3RydWN0IGkyY19paWNfbXNnIHNfbXNnOwogIGNoYXIgKmJ1ZjsKCWludCByZXQ7CgogIGlmIChjbWQgPT0gSTJDX1NSRUFEKSB7CgkJaWYoY29weV9mcm9tX3VzZXIoJnNfbXNnLCAoc3RydWN0IGkyY19paWNfbXNnICopYXJnLCAKCQkJCXNpemVvZihzdHJ1Y3QgaTJjX2lpY19tc2cpKSkgCgkJCXJldHVybiAtRUZBVUxUOwoJCWJ1ZiA9IGttYWxsb2Moc19tc2cubGVuLCBHRlBfS0VSTkVMKTsKCQlpZiAoYnVmPT0gTlVMTCkKCQkJcmV0dXJuIC1FTk9NRU07CgoJCS8qIEZsdXNoIEZJRk8gKi8KCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDRkNSLCBJVEVfSTJDRkNSX0ZMVVNIKTsKCgkJLyogTG9hZCBhZGRyZXNzICovCgkJaWljX291dHcoYWRhcCwgSVRFX0kyQ1NBUixzX21zZy5hZGRyPDwxKTsKCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDU1NBUixzX21zZy53YWRkciAmIDB4ZmYpOwoKCQlyZXQgPSBpaWNfcmVhZGJ5dGVzKGFkYXB0ZXIsIGJ1Ziwgc19tc2cubGVuLCAxKTsKCQlpZiAocmV0Pj0wKSB7CgkJCWlmKGNvcHlfdG9fdXNlciggc19tc2cuYnVmLCBidWYsIHNfbXNnLmxlbikgKSAKCQkJCXJldCA9IC1FRkFVTFQ7CgkJfQoJCWtmcmVlKGJ1Zik7Cgl9CglyZXR1cm4gMDsKfQoKCnN0YXRpYyB1MzIgaWljX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQp7CglyZXR1cm4gSTJDX0ZVTkNfU01CVVNfRU1VTCB8IEkyQ19GVU5DXzEwQklUX0FERFIgfCAKCSAgICAgICBJMkNfRlVOQ19QUk9UT0NPTF9NQU5HTElORzsgCn0KCi8qIC0tLS0tZXhwb3J0ZWQgYWxnb3JpdGhtIGRhdGE6IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KCnN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBpaWNfYWxnbyA9IHsKCS5uYW1lCQk9ICJJVEUgSUlDIGFsZ29yaXRobSIsCgkuaWQJCT0gSTJDX0FMR09fSUlDLAoJLm1hc3Rlcl94ZmVyCT0gaWljX3hmZXIsCgkuYWxnb19jb250cm9sCT0gYWxnb19jb250cm9sLCAvKiBpb2N0bCAqLwoJLmZ1bmN0aW9uYWxpdHkJPSBpaWNfZnVuYywKfTsKCgovKiAKICogcmVnaXN0ZXJpbmcgZnVuY3Rpb25zIHRvIGxvYWQgYWxnb3JpdGhtcyBhdCBydW50aW1lIAogKi8KaW50IGkyY19paWNfYWRkX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCnsKCXN0cnVjdCBpMmNfYWxnb19paWNfZGF0YSAqaWljX2FkYXAgPSBhZGFwLT5hbGdvX2RhdGE7CgoJaWYgKGlpY190ZXN0KSB7CgkJaW50IHJldCA9IHRlc3RfYnVzKGlpY19hZGFwLCBhZGFwLT5uYW1lKTsKCQlpZiAocmV0PDApCgkJCXJldHVybiAtRU5PREVWOwoJfQoKCURFQjIocHJpbnRrKCJpMmMtYWxnby1pdGU6IGh3IHJvdXRpbmVzIGZvciAlcyByZWdpc3RlcmVkLlxuIiwKCSAgICAgICAgICAgIGFkYXAtPm5hbWUpKTsKCgkvKiByZWdpc3RlciBuZXcgYWRhcHRlciB0byBpMmMgbW9kdWxlLi4uICovCgoJYWRhcC0+aWQgfD0gaWljX2FsZ28uaWQ7CglhZGFwLT5hbGdvID0gJmlpY19hbGdvOwoKCWFkYXAtPnRpbWVvdXQgPSAxMDA7CS8qIGRlZmF1bHQgdmFsdWVzLCBzaG91bGQJKi8KCWFkYXAtPnJldHJpZXMgPSAzOwkJLyogYmUgcmVwbGFjZWQgYnkgZGVmaW5lcwkqLwoJYWRhcC0+ZmxhZ3MgPSAwOwoKCWkyY19hZGRfYWRhcHRlcihhZGFwKTsKCWlpY19pbml0KGlpY19hZGFwKTsKCglyZXR1cm4gMDsKfQoKCmludCBpMmNfaWljX2RlbF9idXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQp7CglpbnQgcmVzOwoJaWYgKChyZXMgPSBpMmNfZGVsX2FkYXB0ZXIoYWRhcCkpIDwgMCkKCQlyZXR1cm4gcmVzOwoJREVCMihwcmludGsoImkyYy1hbGdvLWl0ZTogYWRhcHRlciB1bnJlZ2lzdGVyZWQ6ICVzXG4iLGFkYXAtPm5hbWUpKTsKCglyZXR1cm4gMDsKfQoKCmludCBfX2luaXQgaTJjX2FsZ29faWljX2luaXQgKHZvaWQpCnsKCXByaW50ayhLRVJOX0lORk8gIklURSBpaWMgKGkyYykgYWxnb3JpdGhtIG1vZHVsZVxuIik7CglyZXR1cm4gMDsKfQoKCnZvaWQgaTJjX2FsZ29faWljX2V4aXQodm9pZCkKewoJcmV0dXJuOwp9CgoKRVhQT1JUX1NZTUJPTChpMmNfaWljX2FkZF9idXMpOwpFWFBPUlRfU1lNQk9MKGkyY19paWNfZGVsX2J1cyk7CgovKiBUaGUgTU9EVUxFXyogbWFjcm9zIHJlc29sdmUgdG8gbm90aGluZyBpZiBNT0RVTEVTIGlzIG5vdCBkZWZpbmVkCiAqIHdoZW4gdGhpcyBmaWxlIGlzIGNvbXBpbGVkLgogKi8KTU9EVUxFX0FVVEhPUigiTW9udGFWaXN0YSBTb2Z0d2FyZSA8d3d3Lm12aXN0YS5jb20+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiSVRFIGlpYyBhbGdvcml0aG0iKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKbW9kdWxlX3BhcmFtKGlpY190ZXN0LCBib29sLCAwKTsKbW9kdWxlX3BhcmFtKGkyY19kZWJ1ZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CgpNT0RVTEVfUEFSTV9ERVNDKGlpY190ZXN0LCAiVGVzdCBpZiB0aGUgSTJDIGJ1cyBpcyBhdmFpbGFibGUiKTsKTU9EVUxFX1BBUk1fREVTQyhpMmNfZGVidWcsCiAgICAgICAgImRlYnVnIGxldmVsIC0gMCBvZmY7IDEgbm9ybWFsOyAyLDMgbW9yZSB2ZXJib3NlOyA5IGlpYy1wcm90b2NvbCIpOwoKCi8qIFRoaXMgZnVuY3Rpb24gcmVzb2x2ZXMgdG8gaW5pdF9tb2R1bGUgKHRoZSBmdW5jdGlvbiBpbnZva2VkIHdoZW4gYSBtb2R1bGUKICogaXMgbG9hZGVkIHZpYSBpbnNtb2QpIHdoZW4gdGhpcyBmaWxlIGlzIGNvbXBpbGVkIHdpdGggTU9EVUxFUyBkZWZpbmVkLgogKiBPdGhlcndpc2UgKGkuZS4gaWYgeW91IHdhbnQgdGhpcyBkcml2ZXIgc3RhdGljYWxseSBsaW5rZWQgdG8gdGhlIGtlcm5lbCksCiAqIGEgcG9pbnRlciB0byB0aGlzIGZ1bmN0aW9uIGlzIHN0b3JlZCBpbiBhIHRhYmxlIGFuZCBjYWxsZWQKICogZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUga2VybmVsIChpbiBkb19iYXNpY19zZXR1cCBpbiAvaW5pdC9tYWluLmMpIAogKgogKiBBbGwgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIGNvbXBsZW1lbnRzIG9mIHRoZSBtYWNyb3MgZGVmaW5lZCBpbiBsaW51eC9pbml0LmgKICovCm1vZHVsZV9pbml0KGkyY19hbGdvX2lpY19pbml0KTsKCgovKiBJZiBNT0RVTEVTIGlzIGRlZmluZWQgd2hlbiB0aGlzIGZpbGUgaXMgY29tcGlsZWQsIHRoZW4gdGhpcyBmdW5jdGlvbiB3aWxsCiAqIHJlc29sdmVkIHRvIGNsZWFudXBfbW9kdWxlLgogKi8KbW9kdWxlX2V4aXQoaTJjX2FsZ29faWljX2V4aXQpOwo=