LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgZ2lyYmlsLmMKICogVmVyc2lvbjogICAgICAgMS4yCiAqIERlc2NyaXB0aW9uOiAgIEltcGxlbWVudGF0aW9uIGZvciB0aGUgR3JlZW53aWNoIEdJckJJTCBkb25nbGUKICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgogKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIENyZWF0ZWQgYXQ6ICAgIFNhdCBGZWIgIDYgMjE6MDI6MzMgMTk5OQogKiBNb2RpZmllZCBhdDogICBGcmkgRGVjIDE3IDA5OjEzOjIwIDE5OTkKICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiAKICogICAgIENvcHlyaWdodCAoYykgMTk5OSBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogICAgICAKICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCiAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAogKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqICAKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAogKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgogKiAgICAgCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRlIDxsaW51eC90dHkuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgoKc3RhdGljIGludCAgZ2lyYmlsX3Jlc2V0KHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOwpzdGF0aWMgdm9pZCBnaXJiaWxfb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpOwpzdGF0aWMgdm9pZCBnaXJiaWxfY2xvc2UoZG9uZ2xlX3QgKnNlbGYpOwpzdGF0aWMgaW50ICBnaXJiaWxfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOwoKLyogQ29udHJvbCByZWdpc3RlciAxICovCiNkZWZpbmUgR0lSQklMX1RYRU4gICAgMHgwMSAvKiBFbmFibGUgdHJhbnNtaXR0ZXIgKi8KI2RlZmluZSBHSVJCSUxfUlhFTiAgICAweDAyIC8qIEVuYWJsZSByZWNlaXZlciAqLwojZGVmaW5lIEdJUkJJTF9FQ0FOICAgIDB4MDQgLyogQ2FuY2VsIHNlbGYgZW1taXRlZCBkYXRhICovCiNkZWZpbmUgR0lSQklMX0VDSE8gICAgMHgwOCAvKiBFY2hvIGNvbnRyb2wgY2hhcmFjdGVycyAqLwoKLyogTEVEIEN1cnJlbnQgUmVnaXN0ZXIgKDB4MikgKi8KI2RlZmluZSBHSVJCSUxfSElHSCAgICAweDIwCiNkZWZpbmUgR0lSQklMX01FRElVTSAgMHgyMQojZGVmaW5lIEdJUkJJTF9MT1cgICAgIDB4MjIKCi8qIEJhdWQgcmVnaXN0ZXIgKDB4MykgKi8KI2RlZmluZSBHSVJCSUxfMjQwMCAgICAweDMwCiNkZWZpbmUgR0lSQklMXzQ4MDAgICAgMHgzMQkKI2RlZmluZSBHSVJCSUxfOTYwMCAgICAweDMyCiNkZWZpbmUgR0lSQklMXzE5MjAwICAgMHgzMwojZGVmaW5lIEdJUkJJTF8zODQwMCAgIDB4MzQJCiNkZWZpbmUgR0lSQklMXzU3NjAwICAgMHgzNQkKI2RlZmluZSBHSVJCSUxfMTE1MjAwICAweDM2CgovKiBNb2RlIHJlZ2lzdGVyICgweDQpICovCiNkZWZpbmUgR0lSQklMX0lSREEgICAgMHg0MAojZGVmaW5lIEdJUkJJTF9BU0sgICAgIDB4NDEKCi8qIENvbnRyb2wgcmVnaXN0ZXIgMiAoMHg1KSAqLwojZGVmaW5lIEdJUkJJTF9MT0FEICAgIDB4NTEgLyogTG9hZCB0aGUgbmV3IGJhdWQgcmF0ZSB2YWx1ZSAqLwoKc3RhdGljIHN0cnVjdCBkb25nbGVfcmVnIGRvbmdsZSA9IHsKCS50eXBlID0gSVJEQV9HSVJCSUxfRE9OR0xFLAoJLm9wZW4gPSBnaXJiaWxfb3BlbiwKCS5jbG9zZSA9IGdpcmJpbF9jbG9zZSwKCS5yZXNldCA9IGdpcmJpbF9yZXNldCwKCS5jaGFuZ2Vfc3BlZWQgPSBnaXJiaWxfY2hhbmdlX3NwZWVkLAoJLm93bmVyID0gVEhJU19NT0RVTEUsCn07CgpzdGF0aWMgaW50IF9faW5pdCBnaXJiaWxfaW5pdCh2b2lkKQp7CglyZXR1cm4gaXJkYV9kZXZpY2VfcmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgZ2lyYmlsX2NsZWFudXAodm9pZCkKewoJaXJkYV9kZXZpY2VfdW5yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7Cn0KCnN0YXRpYyB2b2lkIGdpcmJpbF9vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcykKewoJcW9zLT5iYXVkX3JhdGUuYml0cyAmPSBJUl85NjAwfElSXzE5MjAwfElSXzM4NDAwfElSXzU3NjAwfElSXzExNTIwMDsKCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzID0gMHgwMzsKfQoKc3RhdGljIHZvaWQgZ2lyYmlsX2Nsb3NlKGRvbmdsZV90ICpzZWxmKQp7CgkvKiBQb3dlciBvZmYgZG9uZ2xlICovCglzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBGQUxTRSk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGdpcmJpbF9jaGFuZ2Vfc3BlZWQgKGRldiwgc3BlZWQpCiAqCiAqICAgIFNldCB0aGUgc3BlZWQgZm9yIHRoZSBHaXJiaWwgdHlwZSBkb25nbGUuCiAqCiAqLwpzdGF0aWMgaW50IGdpcmJpbF9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKewoJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CglfX3UzMiBzcGVlZCA9IChfX3UzMikgdGFzay0+cGFyYW07CglfX3U4IGNvbnRyb2xbMl07CglpbnQgcmV0ID0gMDsKCglzZWxmLT5zcGVlZF90YXNrID0gdGFzazsKCglzd2l0Y2ggKHRhc2stPnN0YXRlKSB7CgljYXNlIElSREFfVEFTS19JTklUOgoJCS8qIE5lZWQgdG8gcmVzZXQgdGhlIGRvbmdsZSBhbmQgZ28gdG8gOTYwMCBicHMgYmVmb3JlCiAgICAgICAgICAgICAgICAgICBwcm9ncmFtbWluZyAqLwoJCWlmIChpcmRhX3Rhc2tfZXhlY3V0ZShzZWxmLCBnaXJiaWxfcmVzZXQsIE5VTEwsIHRhc2ssIAoJCQkJICAgICAgKHZvaWQgKikgc3BlZWQpKQoJCXsKCQkJLyogRG9uZ2xlIG5lZWQgbW9yZSB0aW1lIHRvIHJlc2V0ICovCgkJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19DSElMRF9XQUlUKTsKCgkJCS8qIEdpdmUgcmVzZXQgMSBzZWMgdG8gZmluaXNoICovCgkJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7CgkJfQoJCWJyZWFrOwoJY2FzZSBJUkRBX1RBU0tfQ0hJTERfV0FJVDoKCQlJUkRBX1dBUk5JTkcoIiVzKCksIHJlc2V0dGluZyBkb25nbGUgdGltZWQgb3V0IVxuIiwKCQkJICAgICBfX0ZVTkNUSU9OX18pOwoJCXJldCA9IC0xOwoJCWJyZWFrOwoJY2FzZSBJUkRBX1RBU0tfQ0hJTERfRE9ORToKCQkvKiBTZXQgRFRSIGFuZCBDbGVhciBSVFMgdG8gZW50ZXIgY29tbWFuZCBtb2RlICovCgkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgVFJVRSk7CgoJCXN3aXRjaCAoc3BlZWQpIHsKCQljYXNlIDk2MDA6CgkJZGVmYXVsdDoKCQkJY29udHJvbFswXSA9IEdJUkJJTF85NjAwOwoJCQlicmVhazsKCQljYXNlIDE5MjAwOgoJCQljb250cm9sWzBdID0gR0lSQklMXzE5MjAwOwoJCQlicmVhazsKCQljYXNlIDM0ODAwOgoJCQljb250cm9sWzBdID0gR0lSQklMXzM4NDAwOwoJCQlicmVhazsKCQljYXNlIDU3NjAwOgoJCQljb250cm9sWzBdID0gR0lSQklMXzU3NjAwOwoJCQlicmVhazsKCQljYXNlIDExNTIwMDoKCQkJY29udHJvbFswXSA9IEdJUkJJTF8xMTUyMDA7CgkJCWJyZWFrOwoJCX0KCQljb250cm9sWzFdID0gR0lSQklMX0xPQUQ7CgkJCgkJLyogV3JpdGUgY29udHJvbCBieXRlcyAqLwoJCXNlbGYtPndyaXRlKHNlbGYtPmRldiwgY29udHJvbCwgMik7CgkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQpOwoJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKCQlicmVhazsKCWNhc2UgSVJEQV9UQVNLX1dBSVQ6CgkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLwoJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CgkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOwoJCXNlbGYtPnNwZWVkX3Rhc2sgPSBOVUxMOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0VSUk9SKCIlcygpLCB1bmtub3duIHN0YXRlICVkXG4iLAoJCQkgICBfX0ZVTkNUSU9OX18sIHRhc2stPnN0YXRlKTsKCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CgkJc2VsZi0+c3BlZWRfdGFzayA9IE5VTEw7CgkJcmV0ID0gLTE7CgkJYnJlYWs7Cgl9CglyZXR1cm4gcmV0Owp9CgovKgogKiBGdW5jdGlvbiBnaXJiaWxfcmVzZXQgKGRyaXZlcikKICoKICogICAgICBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgZ2lyYmlsIGRvbmdsZS4KICoKICogICAgICBBbGdvcml0aG06CiAqICAgIAkgIDAuIHNldCBSVFMsIGFuZCB3YWl0IGF0IGxlYXN0IDUgbXMgCiAqICAgICAgICAxLiBjbGVhciBSVFMgCiAqLwpzdGF0aWMgaW50IGdpcmJpbF9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQp7Cglkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKCV9fdTggY29udHJvbCA9IEdJUkJJTF9UWEVOIHwgR0lSQklMX1JYRU47CglpbnQgcmV0ID0gMDsKCglzZWxmLT5yZXNldF90YXNrID0gdGFzazsKCglzd2l0Y2ggKHRhc2stPnN0YXRlKSB7CgljYXNlIElSREFfVEFTS19JTklUOgoJCS8qIFJlc2V0IGRvbmdsZSAqLwoJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgRkFMU0UpOwoJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19XQUlUMSk7CgkJLyogU2xlZXAgYXQgbGVhc3QgNSBtcyAqLwoJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMjApOwoJCWJyZWFrOwoJY2FzZSBJUkRBX1RBU0tfV0FJVDE6CgkJLyogU2V0IERUUiBhbmQgY2xlYXIgUlRTIHRvIGVudGVyIGNvbW1hbmQgbW9kZSAqLwoJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIFRSVUUpOwoJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19XQUlUMik7CgkJcmV0ID0gbXNlY3NfdG9famlmZmllcygyMCk7CgkJYnJlYWs7CgljYXNlIElSREFfVEFTS19XQUlUMjoKCQkvKiBXcml0ZSBjb250cm9sIGJ5dGUgKi8KCQlzZWxmLT53cml0ZShzZWxmLT5kZXYsICZjb250cm9sLCAxKTsKCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDMpOwoJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMjApOwoJCWJyZWFrOwoJY2FzZSBJUkRBX1RBU0tfV0FJVDM6CgkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLwoJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CgkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOwoJCXNlbGYtPnJlc2V0X3Rhc2sgPSBOVUxMOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0VSUk9SKCIlcygpLCB1bmtub3duIHN0YXRlICVkXG4iLAoJCQkgICBfX0ZVTkNUSU9OX18sIHRhc2stPnN0YXRlKTsKCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CgkJc2VsZi0+cmVzZXRfdGFzayA9IE5VTEw7CgkJcmV0ID0gLTE7CgkJYnJlYWs7Cgl9CglyZXR1cm4gcmV0Owp9CgpNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiR3JlZW53aWNoIEdJckJJTCBkb25nbGUgZHJpdmVyIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS00Iik7IC8qIElSREFfR0lSQklMX0RPTkdMRSAqLwoJCi8qCiAqIEZ1bmN0aW9uIGluaXRfbW9kdWxlICh2b2lkKQogKgogKiAgICBJbml0aWFsaXplIEdpcmJpbCBtb2R1bGUKICoKICovCm1vZHVsZV9pbml0KGdpcmJpbF9pbml0KTsKCi8qCiAqIEZ1bmN0aW9uIGNsZWFudXBfbW9kdWxlICh2b2lkKQogKgogKiAgICBDbGVhbnVwIEdpcmJpbCBtb2R1bGUKICoKICovCm1vZHVsZV9leGl0KGdpcmJpbF9jbGVhbnVwKTsKCg==