LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgdGVrcmFtLmMKICogVmVyc2lvbjogICAgICAgMS4zCiAqIERlc2NyaXB0aW9uOiAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBUZWtyYW0gSXJNYXRlIElSLTIxMEIgZG9uZ2xlCiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBXZWQgT2N0IDIxIDIwOjAyOjM1IDE5OTgKICogTW9kaWZpZWQgYXQ6ICAgU3VuIE9jdCAyNyAyMjowMjozOCAyMDAyCiAqIE1vZGlmaWVkIGJ5OiAgIE1hcnRpbiBEaWVobCA8bWFkQG1kaWVobC5kZT4KICogCiAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBEYWcgQnJhdHRsaSwKICogICAgIENvcHlyaWdodCAoYykgMjAwMiBNYXJ0aW4gRGllaGwsCiAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAgICAgIAogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAogKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICogIAogKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgogKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqICAgICAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CgojaW5jbHVkZSAic2lyLWRldi5oIgoKc3RhdGljIGludCB0ZWtyYW1fZGVsYXkgPSAxNTA7CQkvKiBkZWZhdWx0IGlzIDE1MCBtcyAqLwptb2R1bGVfcGFyYW0odGVrcmFtX2RlbGF5LCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKHRla3JhbV9kZWxheSwgInRla3JhbSBkb25nbGUgd3JpdGUgY29tcGxldGUgZGVsYXkiKTsKCnN0YXRpYyBpbnQgdGVrcmFtX29wZW4oc3RydWN0IHNpcl9kZXYgKik7CnN0YXRpYyBpbnQgdGVrcmFtX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICopOwpzdGF0aWMgaW50IHRla3JhbV9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKiwgdW5zaWduZWQpOwpzdGF0aWMgaW50IHRla3JhbV9yZXNldChzdHJ1Y3Qgc2lyX2RldiAqKTsKCiNkZWZpbmUgVEVLUkFNXzExNTIwMCAweDAwCiNkZWZpbmUgVEVLUkFNXzU3NjAwICAweDAxCiNkZWZpbmUgVEVLUkFNXzM4NDAwICAweDAyCiNkZWZpbmUgVEVLUkFNXzE5MjAwICAweDAzCiNkZWZpbmUgVEVLUkFNXzk2MDAgICAweDA0CgojZGVmaW5lIFRFS1JBTV9QVyAgICAgMHgxMCAvKiBQdWxzZSBzZWxlY3QgYml0ICovCgpzdGF0aWMgc3RydWN0IGRvbmdsZV9kcml2ZXIgdGVrcmFtID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLmRyaXZlcl9uYW1lCT0gIlRla3JhbSBJUi0yMTBCIiwKCS50eXBlCQk9IElSREFfVEVLUkFNX0RPTkdMRSwKCS5vcGVuCQk9IHRla3JhbV9vcGVuLAoJLmNsb3NlCQk9IHRla3JhbV9jbG9zZSwKCS5yZXNldAkJPSB0ZWtyYW1fcmVzZXQsCgkuc2V0X3NwZWVkCT0gdGVrcmFtX2NoYW5nZV9zcGVlZCwKfTsKCnN0YXRpYyBpbnQgX19pbml0IHRla3JhbV9zaXJfaW5pdCh2b2lkKQp7CglpZiAodGVrcmFtX2RlbGF5IDwgMSAgfHwgIHRla3JhbV9kZWxheSA+IDUwMCkKCQl0ZWtyYW1fZGVsYXkgPSAyMDA7CglJUkRBX0RFQlVHKDEsICIlcyAtIHVzaW5nICVkIG1zIGRlbGF5XG4iLAoJCXRla3JhbS5kcml2ZXJfbmFtZSwgdGVrcmFtX2RlbGF5KTsKCXJldHVybiBpcmRhX3JlZ2lzdGVyX2RvbmdsZSgmdGVrcmFtKTsKfQoKc3RhdGljIHZvaWQgX19leGl0IHRla3JhbV9zaXJfY2xlYW51cCh2b2lkKQp7CglpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKCZ0ZWtyYW0pOwp9CgpzdGF0aWMgaW50IHRla3JhbV9vcGVuKHN0cnVjdCBzaXJfZGV2ICpkZXYpCnsKCXN0cnVjdCBxb3NfaW5mbyAqcW9zID0gJmRldi0+cW9zOwoKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CgoJcW9zLT5iYXVkX3JhdGUuYml0cyAmPSBJUl85NjAwfElSXzE5MjAwfElSXzM4NDAwfElSXzU3NjAwfElSXzExNTIwMDsKCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzID0gMHgwMTsgLyogTmVlZHMgYXQgbGVhc3QgMTAgbXMgKi8JCglpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKHFvcyk7CgoJLyogaXJkYSB0aHJlYWQgd2FpdHMgNTAgbXNlYyBmb3IgcG93ZXIgc2V0dGxpbmcgKi8KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCB0ZWtyYW1fY2xvc2Uoc3RydWN0IHNpcl9kZXYgKmRldikKewoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCgkvKiBQb3dlciBvZmYgZG9uZ2xlICovCglzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgRkFMU0UpOwoKCXJldHVybiAwOwp9CgovKgogKiBGdW5jdGlvbiB0ZWtyYW1fY2hhbmdlX3NwZWVkIChkZXYsIHN0YXRlLCBzcGVlZCkKICoKICogICAgU2V0IHRoZSBzcGVlZCBmb3IgdGhlIFRla3JhbSBJUk1hdGUgMjEwIHR5cGUgZG9uZ2xlLiBXYXJuaW5nLCB0aGlzIAogKiAgICBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgcHJvY2VzcyBjb250ZXh0IQogKgogKiAgICBBbGdvcml0aG0KICogICAgMS4gY2xlYXIgRFRSIAogKiAgICAyLiBzZXQgUlRTLCBhbmQgd2FpdCBhdCBsZWFzdCA3IHVzCiAqICAgIDMuIHNlbmQgQ29udHJvbCBCeXRlIHRvIHRoZSBJUi0yMTAgdGhyb3VnaCBUWEQgdG8gc2V0IG5ldyBiYXVkIHJhdGUKICogICAgICAgd2FpdCB1bnRpbCB0aGUgc3RvcCBiaXQgb2YgQ29udHJvbCBCeXRlIGlzIHNlbnQgKGZvciA5NjAwIGJhdWQgcmF0ZSwgCiAqICAgICAgIGl0IHRha2VzIGFib3V0IDEwMCBtc2VjKQogKgogKglbb29wcywgd2h5IDEwMCBtc2VjPyBzZW5kaW5nIDEgYnl0ZSAoMTAgYml0cykgdGFrZXMgMS4wNSBtc2VjCiAqCSAtIGlzIHRoaXMgcHJvYmFibHkgdG8gY29tcGVuc2F0ZSBmb3IgZGVsYXlzIGluIHR0eSBsYXllcj9dCiAqCiAqICAgIDUuIGNsZWFyIFJUUyAocmV0dXJuIHRvIE5PUk1BTCBPcGVyYXRpb24pCiAqICAgIDYuIHdhaXQgYXQgbGVhc3QgNTAgdXMsIG5ldyBzZXR0aW5nIChiYXVkIHJhdGUsIGV0YykgdGFrZXMgZWZmZWN0IGhlcmUgCiAqICAgICAgIGFmdGVyCiAqLwoKI2RlZmluZSBURUtSQU1fU1RBVEVfV0FJVF9TUEVFRAkoU0lSREVWX1NUQVRFX0RPTkdMRV9TUEVFRCArIDEpCgpzdGF0aWMgaW50IHRla3JhbV9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpCnsKCXVuc2lnbmVkIHN0YXRlID0gZGV2LT5mc20uc3Vic3RhdGU7Cgl1bnNpZ25lZCBkZWxheSA9IDA7Cgl1OCBieXRlOwoJc3RhdGljIGludCByZXQgPSAwOwoJCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCXN3aXRjaChzdGF0ZSkgewoJY2FzZSBTSVJERVZfU1RBVEVfRE9OR0xFX1NQRUVEOgoKCQlzd2l0Y2ggKHNwZWVkKSB7CgkJZGVmYXVsdDoKCQkJc3BlZWQgPSA5NjAwOwoJCQlyZXQgPSAtRUlOVkFMOwoJCQkvKiBmYWxsIHRocnUgKi8KCQljYXNlIDk2MDA6CgkJCWJ5dGUgPSBURUtSQU1fUFd8VEVLUkFNXzk2MDA7CgkJCWJyZWFrOwoJCWNhc2UgMTkyMDA6CgkJCWJ5dGUgPSBURUtSQU1fUFd8VEVLUkFNXzE5MjAwOwoJCQlicmVhazsKCQljYXNlIDM4NDAwOgoJCQlieXRlID0gVEVLUkFNX1BXfFRFS1JBTV8zODQwMDsKCQkJYnJlYWs7CgkJY2FzZSA1NzYwMDoKCQkJYnl0ZSA9IFRFS1JBTV9QV3xURUtSQU1fNTc2MDA7CgkJCWJyZWFrOwoJCWNhc2UgMTE1MjAwOgoJCQlieXRlID0gVEVLUkFNXzExNTIwMDsKCQkJYnJlYWs7CgkJfQoKCQkvKiBTZXQgRFRSLCBDbGVhciBSVFMgKi8KCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBGQUxTRSk7CgkKCQkvKiBXYWl0IGF0IGxlYXN0IDd1cyAqLwoJCXVkZWxheSgxNCk7CgoJCS8qIFdyaXRlIGNvbnRyb2wgYnl0ZSAqLwoJCXNpcmRldl9yYXdfd3JpdGUoZGV2LCAmYnl0ZSwgMSk7CgkJCgkJZGV2LT5zcGVlZCA9IHNwZWVkOwoKCQlzdGF0ZSA9IFRFS1JBTV9TVEFURV9XQUlUX1NQRUVEOwoJCWRlbGF5ID0gdGVrcmFtX2RlbGF5OwoJCWJyZWFrOwoKCWNhc2UgVEVLUkFNX1NUQVRFX1dBSVRfU1BFRUQ6CgkJLyogU2V0IERUUiwgU2V0IFJUUyAqLwoJCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOwoJCXVkZWxheSg1MCk7CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlJUkRBX0VSUk9SKCIlcyAtIHVuZGVmaW5lZCBzdGF0ZSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0ZSk7CgkJcmV0ID0gLUVJTlZBTDsKCQlicmVhazsKCX0KCglkZXYtPmZzbS5zdWJzdGF0ZSA9IHN0YXRlOwoJcmV0dXJuIChkZWxheSA+IDApID8gZGVsYXkgOiByZXQ7Cn0KCi8qCiAqIEZ1bmN0aW9uIHRla3JhbV9yZXNldCAoZHJpdmVyKQogKgogKiAgICAgIFRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSB0ZWtyYW0gZG9uZ2xlLiBXYXJuaW5nLCB0aGlzIGZ1bmN0aW9uIAogKiAgICAgIG11c3QgYmUgY2FsbGVkIHdpdGggYSBwcm9jZXNzIGNvbnRleHQhISAKICoKICogICAgICBBbGdvcml0aG06CiAqICAgIAkgIDAuIENsZWFyIFJUUyBhbmQgRFRSLCBhbmQgd2FpdCA1MCBtcyAocG93ZXIgb2ZmIHRoZSBJUi0yMTAgKQogKiAgICAgICAgMS4gY2xlYXIgUlRTIAogKiAgICAgICAgMi4gc2V0IERUUiwgYW5kIHdhaXQgYXQgbGVhc3QgMSBtcyAKICogICAgICAgIDMuIGNsZWFyIERUUiB0byBTUEFDRSBzdGF0ZSwgd2FpdCBhdCBsZWFzdCA1MCB1cyBmb3IgZnVydGhlciAKICogICAgICAgICBvcGVyYXRpb24KICovCgpzdGF0aWMgaW50IHRla3JhbV9yZXNldChzdHJ1Y3Qgc2lyX2RldiAqZGV2KQp7CglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCS8qIENsZWFyIERUUiwgU2V0IFJUUyAqLwoJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIFRSVUUpOyAKCgkvKiBTaG91bGQgc2xlZXAgMSBtcyAqLwoJbXNsZWVwKDEpOwoKCS8qIFNldCBEVFIsIFNldCBSVFMgKi8KCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOwoJCgkvKiBXYWl0IGF0IGxlYXN0IDUwIHVzICovCgl1ZGVsYXkoNzUpOwoKCWRldi0+c3BlZWQgPSA5NjAwOwoKCXJldHVybiAwOwp9CgpNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiVGVrcmFtIElyTWF0ZSBJUi0yMTBCIGRvbmdsZSBkcml2ZXIiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTAiKTsgLyogSVJEQV9URUtSQU1fRE9OR0xFICovCgkJCm1vZHVsZV9pbml0KHRla3JhbV9zaXJfaW5pdCk7Cm1vZHVsZV9leGl0KHRla3JhbV9zaXJfY2xlYW51cCk7Cg==