LyoKICoJVmlkZW8gZm9yIExpbnV4IFR3bwogKgogKglBIGdlbmVyaWMgdmlkZW8gZGV2aWNlIGludGVyZmFjZSBmb3IgdGhlIExJTlVYIG9wZXJhdGluZyBzeXN0ZW0KICoJdXNpbmcgYSBzZXQgb2YgZGV2aWNlIHN0cnVjdHVyZXMvdmVjdG9ycyBmb3IgbG93IGxldmVsIG9wZXJhdGlvbnMuCiAqCiAqCVRoaXMgZmlsZSByZXBsYWNlcyB0aGUgdmlkZW9kZXYuYyBmaWxlIHRoYXQgY29tZXMgd2l0aCB0aGUKICoJcmVndWxhciBrZXJuZWwgZGlzdHJpYnV0aW9uLgogKgogKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBBdXRob3I6CUJpbGwgRGlya3MgPGJpbGxAdGhlZGlya3Mub3JnPgogKgkJYmFzZWQgb24gY29kZSBieSBBbGFuIENveCwgPGFsYW5AY3ltcnUubmV0PgogKgogKi8KCi8qCiAqIFZpZGVvIGNhcHR1cmUgaW50ZXJmYWNlIGZvciBMaW51eAogKgogKglBIGdlbmVyaWMgdmlkZW8gZGV2aWNlIGludGVyZmFjZSBmb3IgdGhlIExJTlVYIG9wZXJhdGluZyBzeXN0ZW0KICoJdXNpbmcgYSBzZXQgb2YgZGV2aWNlIHN0cnVjdHVyZXMvdmVjdG9ycyBmb3IgbG93IGxldmVsIG9wZXJhdGlvbnMuCiAqCiAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBBdXRob3I6CUFsYW4gQ294LCA8YWxhbkByZWRoYXQuY29tPgogKgogKiBGaXhlczoKICovCgovKgogKiBWaWRlbzRsaW51eCAxLzIgaW50ZWdyYXRpb24gYnkgSnVzdGluIFNjaG9lbWFuCiAqIDxqdXN0aW5Ac3VudGlnZXIuZWUudXAuYWMuemE+CiAqIDIuNCBQUk9DRlMgc3VwcG9ydCBwb3J0ZWQgZnJvbSAyLjQga2VybmVscyBieQogKiAgSfFha2kgR2FyY+1hIEV0eGViYXJyaWEgPGdhcmV0eGVAZXVza2FsbmV0Lm5ldD4KICogTWFrZWZpbGUgZml4IGJ5ICJXLiBNaWNoYWVsIFBldHVsbG8iIDxtaWtlQGZseW4ub3JnPgogKiAyLjQgZGV2ZnMgc3VwcG9ydCBwb3J0ZWQgZnJvbSAyLjQga2VybmVscyBieQogKiAgRGFuIE1lcmlsbGF0IDxkYW5AbWVyaWxsYXQub3JnPgogKiBBZGRlZCBHZXJkIEtub3JycyB2NGwxIGVuaGFuY2VtZW50cyAoSnVzdGluIFNjaG9lbWFuKQogKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L21tLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vZGl2NjQuaD4KI2luY2x1ZGUgPGxpbnV4L3ZpZGVvX2RlY29kZXIuaD4KI2RlZmluZSBfX09MRF9WSURJT0NfIC8qIFRvIGFsbG93IGZpeGluZyBvbGQgY2FsbHMqLwojaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgoKI2lmZGVmIENPTkZJR19LTU9ECiNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiNlbmRpZgoKI2lmIGRlZmluZWQoQ09ORklHX1VTVCkgfHwgZGVmaW5lZChDT05GSUdfVVNUX01PRFVMRSkKI2luY2x1ZGUgPGxpbnV4L3VzdC5oPgojZW5kaWYKCgojaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KCk1PRFVMRV9BVVRIT1IoIkJpbGwgRGlya3MsIEp1c3RpbiBTY2hvZW1hbiwgR2VyZCBLbm9yciIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIm1pc2MgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdjRsMiBkZXZpY2UgZHJpdmVycyIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7CgovKgogKgogKglWIDQgTCAyICAgRCBSIEkgViBFIFIgICBIIEUgTCBQIEUgUiAgIEEgUCBJCiAqCiAqLwoKLyoKICogIFZpZGVvIFN0YW5kYXJkIE9wZXJhdGlvbnMgKGNvbnRyaWJ1dGVkIGJ5IE1pY2hhZWwgU2NoaW1laykKICovCgoKY2hhciAqdjRsMl9ub3JtX3RvX25hbWUodjRsMl9zdGRfaWQgaWQpCnsKCWNoYXIgKm5hbWU7Cgl1MzIgbXlpZCA9IGlkOwoKCS8qIEhBQ0s6IHBwYzMyIGFyY2hpdGVjdHVyZSBkb2Vzbid0IGhhdmUgX191Y21wZGkyIGZ1bmN0aW9uIHRvIGhhbmRsZQoJICAgNjQgYml0IGNvbXBhcmF0aW9ucy4gU28sIG9uIHRoYXQgYXJjaGl0ZWN0dXJlLCB3aXRoIHNvbWUgZ2NjIHZhcmlhbnRzLAoJICAgY29tcGlsYXRpb24gZmFpbHMuIEN1cnJlbnRseSwgdGhlIG1heCB2YWx1ZSBpcyAzMGJpdCB3aWRlLgoJICovCglCVUdfT04obXlpZCAhPSBpZCk7CgoJc3dpdGNoIChteWlkKSB7CgljYXNlIFY0TDJfU1REX1BBTDoKCQluYW1lPSJQQUwiOwkJYnJlYWs7CgljYXNlIFY0TDJfU1REX1BBTF9CRzoKCQluYW1lPSJQQUwtQkciOwkJYnJlYWs7CgljYXNlIFY0TDJfU1REX1BBTF9ESzoKCQluYW1lPSJQQUwtREsiOwkJYnJlYWs7CgljYXNlIFY0TDJfU1REX1BBTF9COgoJCW5hbWU9IlBBTC1CIjsJCWJyZWFrOwoJY2FzZSBWNEwyX1NURF9QQUxfQjE6CgkJbmFtZT0iUEFMLUIxIjsJCWJyZWFrOwoJY2FzZSBWNEwyX1NURF9QQUxfRzoKCQluYW1lPSJQQUwtRyI7CQlicmVhazsKCWNhc2UgVjRMMl9TVERfUEFMX0g6CgkJbmFtZT0iUEFMLUgiOwkJYnJlYWs7CgljYXNlIFY0TDJfU1REX1BBTF9JOgoJCW5hbWU9IlBBTC1JIjsJCWJyZWFrOwoJY2FzZSBWNEwyX1NURF9QQUxfRDoKCQluYW1lPSJQQUwtRCI7CQlicmVhazsKCWNhc2UgVjRMMl9TVERfUEFMX0QxOgoJCW5hbWU9IlBBTC1EMSI7CQlicmVhazsKCWNhc2UgVjRMMl9TVERfUEFMX0s6CgkJbmFtZT0iUEFMLUsiOwkJYnJlYWs7CgljYXNlIFY0TDJfU1REX1BBTF9NOgoJCW5hbWU9IlBBTC1NIjsJCWJyZWFrOwoJY2FzZSBWNEwyX1NURF9QQUxfTjoKCQluYW1lPSJQQUwtTiI7CQlicmVhazsKCWNhc2UgVjRMMl9TVERfUEFMX05jOgoJCW5hbWU9IlBBTC1OYyI7CQlicmVhazsKCWNhc2UgVjRMMl9TVERfUEFMXzYwOgoJCW5hbWU9IlBBTC02MCI7CQlicmVhazsKCWNhc2UgVjRMMl9TVERfTlRTQzoKCQluYW1lPSJOVFNDIjsJCWJyZWFrOwoJY2FzZSBWNEwyX1NURF9OVFNDX006CgkJbmFtZT0iTlRTQy1NIjsJCWJyZWFrOwoJY2FzZSBWNEwyX1NURF9OVFNDX01fSlA6CgkJbmFtZT0iTlRTQy1NLUpQIjsJYnJlYWs7CgljYXNlIFY0TDJfU1REX05UU0NfNDQzOgoJCW5hbWU9Ik5UU0MtNDQzIjsJYnJlYWs7CgljYXNlIFY0TDJfU1REX05UU0NfTV9LUjoKCQluYW1lPSJOVFNDLU0tS1IiOwlicmVhazsKCWNhc2UgVjRMMl9TVERfU0VDQU06CgkJbmFtZT0iU0VDQU0iOwkJYnJlYWs7CgljYXNlIFY0TDJfU1REX1NFQ0FNX0RLOgoJCW5hbWU9IlNFQ0FNLURLIjsJYnJlYWs7CgljYXNlIFY0TDJfU1REX1NFQ0FNX0I6CgkJbmFtZT0iU0VDQU0tQiI7CQlicmVhazsKCWNhc2UgVjRMMl9TVERfU0VDQU1fRDoKCQluYW1lPSJTRUNBTS1EIjsJCWJyZWFrOwoJY2FzZSBWNEwyX1NURF9TRUNBTV9HOgoJCW5hbWU9IlNFQ0FNLUciOwkJYnJlYWs7CgljYXNlIFY0TDJfU1REX1NFQ0FNX0g6CgkJbmFtZT0iU0VDQU0tSCI7CQlicmVhazsKCWNhc2UgVjRMMl9TVERfU0VDQU1fSzoKCQluYW1lPSJTRUNBTS1LIjsJCWJyZWFrOwoJY2FzZSBWNEwyX1NURF9TRUNBTV9LMToKCQluYW1lPSJTRUNBTS1LMSI7CWJyZWFrOwoJY2FzZSBWNEwyX1NURF9TRUNBTV9MOgoJCW5hbWU9IlNFQ0FNLUwiOwkJYnJlYWs7CgljYXNlIFY0TDJfU1REX1NFQ0FNX0xDOgoJCW5hbWU9IlNFQ0FNLUxDIjsJYnJlYWs7CglkZWZhdWx0OgoJCW5hbWU9IlVua25vd24iOwkJYnJlYWs7Cgl9CgoJcmV0dXJuIG5hbWU7Cn0KCi8qIEZpbGwgaW4gdGhlIGZpZWxkcyBvZiBhIHY0bDJfc3RhbmRhcmQgc3RydWN0dXJlIGFjY29yZGluZyB0byB0aGUKICAgJ2lkJyBhbmQgJ3RyYW5zbWlzc2lvbicgcGFyYW1ldGVycy4gIFJldHVybnMgbmVnYXRpdmUgb24gZXJyb3IuICAqLwppbnQgdjRsMl92aWRlb19zdGRfY29uc3RydWN0KHN0cnVjdCB2NGwyX3N0YW5kYXJkICp2cywKCQkJICAgICBpbnQgaWQsIGNoYXIgKm5hbWUpCnsKCXUzMiBpbmRleCA9IHZzLT5pbmRleDsKCgltZW1zZXQodnMsIDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9zdGFuZGFyZCkpOwoJdnMtPmluZGV4ID0gaW5kZXg7Cgl2cy0+aWQgICAgPSBpZDsKCWlmIChpZCAmIFY0TDJfU1REXzUyNV82MCkgewoJCXZzLT5mcmFtZXBlcmlvZC5udW1lcmF0b3IgPSAxMDAxOwoJCXZzLT5mcmFtZXBlcmlvZC5kZW5vbWluYXRvciA9IDMwMDAwOwoJCXZzLT5mcmFtZWxpbmVzID0gNTI1OwoJfSBlbHNlIHsKCQl2cy0+ZnJhbWVwZXJpb2QubnVtZXJhdG9yID0gMTsKCQl2cy0+ZnJhbWVwZXJpb2QuZGVub21pbmF0b3IgPSAyNTsKCQl2cy0+ZnJhbWVsaW5lcyA9IDYyNTsKCX0KCXN0cmxjcHkodnMtPm5hbWUsbmFtZSxzaXplb2YodnMtPm5hbWUpKTsKCXJldHVybiAwOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBwcmlvcml0eSBoYW5kbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2RlZmluZSBWNEwyX1BSSU9fVkFMSUQodmFsKSAodmFsID09IFY0TDJfUFJJT1JJVFlfQkFDS0dST1VORCAgIHx8IFwKCQkJICAgICAgdmFsID09IFY0TDJfUFJJT1JJVFlfSU5URVJBQ1RJVkUgIHx8IFwKCQkJICAgICAgdmFsID09IFY0TDJfUFJJT1JJVFlfUkVDT1JEKQoKaW50IHY0bDJfcHJpb19pbml0KHN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgKmdsb2JhbCkKewoJbWVtc2V0KGdsb2JhbCwwLHNpemVvZigqZ2xvYmFsKSk7CglyZXR1cm4gMDsKfQoKaW50IHY0bDJfcHJpb19jaGFuZ2Uoc3RydWN0IHY0bDJfcHJpb19zdGF0ZSAqZ2xvYmFsLCBlbnVtIHY0bDJfcHJpb3JpdHkgKmxvY2FsLAoJCSAgICAgZW51bSB2NGwyX3ByaW9yaXR5IG5ldykKewoJaWYgKCFWNEwyX1BSSU9fVkFMSUQobmV3KSkKCQlyZXR1cm4gLUVJTlZBTDsKCWlmICgqbG9jYWwgPT0gbmV3KQoJCXJldHVybiAwOwoKCWF0b21pY19pbmMoJmdsb2JhbC0+cHJpb3NbbmV3XSk7CglpZiAoVjRMMl9QUklPX1ZBTElEKCpsb2NhbCkpCgkJYXRvbWljX2RlYygmZ2xvYmFsLT5wcmlvc1sqbG9jYWxdKTsKCSpsb2NhbCA9IG5ldzsKCXJldHVybiAwOwp9CgppbnQgdjRsMl9wcmlvX29wZW4oc3RydWN0IHY0bDJfcHJpb19zdGF0ZSAqZ2xvYmFsLCBlbnVtIHY0bDJfcHJpb3JpdHkgKmxvY2FsKQp7CglyZXR1cm4gdjRsMl9wcmlvX2NoYW5nZShnbG9iYWwsbG9jYWwsVjRMMl9QUklPUklUWV9ERUZBVUxUKTsKfQoKaW50IHY0bDJfcHJpb19jbG9zZShzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlICpnbG9iYWwsIGVudW0gdjRsMl9wcmlvcml0eSAqbG9jYWwpCnsKCWlmIChWNEwyX1BSSU9fVkFMSUQoKmxvY2FsKSkKCQlhdG9taWNfZGVjKCZnbG9iYWwtPnByaW9zWypsb2NhbF0pOwoJcmV0dXJuIDA7Cn0KCmVudW0gdjRsMl9wcmlvcml0eSB2NGwyX3ByaW9fbWF4KHN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgKmdsb2JhbCkKewoJaWYgKGF0b21pY19yZWFkKCZnbG9iYWwtPnByaW9zW1Y0TDJfUFJJT1JJVFlfUkVDT1JEXSkgPiAwKQoJCXJldHVybiBWNEwyX1BSSU9SSVRZX1JFQ09SRDsKCWlmIChhdG9taWNfcmVhZCgmZ2xvYmFsLT5wcmlvc1tWNEwyX1BSSU9SSVRZX0lOVEVSQUNUSVZFXSkgPiAwKQoJCXJldHVybiBWNEwyX1BSSU9SSVRZX0lOVEVSQUNUSVZFOwoJaWYgKGF0b21pY19yZWFkKCZnbG9iYWwtPnByaW9zW1Y0TDJfUFJJT1JJVFlfQkFDS0dST1VORF0pID4gMCkKCQlyZXR1cm4gVjRMMl9QUklPUklUWV9CQUNLR1JPVU5EOwoJcmV0dXJuIFY0TDJfUFJJT1JJVFlfVU5TRVQ7Cn0KCmludCB2NGwyX3ByaW9fY2hlY2soc3RydWN0IHY0bDJfcHJpb19zdGF0ZSAqZ2xvYmFsLCBlbnVtIHY0bDJfcHJpb3JpdHkgKmxvY2FsKQp7CglpZiAoKmxvY2FsIDwgdjRsMl9wcmlvX21heChnbG9iYWwpKQoJCXJldHVybiAtRUJVU1k7CglyZXR1cm4gMDsKfQoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIHNvbWUgYXJyYXlzIGZvciBwcmV0dHktcHJpbnRpbmcgZGVidWcgbWVzc2FnZXMgb2YgZW51bSB0eXBlcyAgICAgICovCgpjaGFyICp2NGwyX2ZpZWxkX25hbWVzW10gPSB7CglbVjRMMl9GSUVMRF9BTlldICAgICAgICA9ICJhbnkiLAoJW1Y0TDJfRklFTERfTk9ORV0gICAgICAgPSAibm9uZSIsCglbVjRMMl9GSUVMRF9UT1BdICAgICAgICA9ICJ0b3AiLAoJW1Y0TDJfRklFTERfQk9UVE9NXSAgICAgPSAiYm90dG9tIiwKCVtWNEwyX0ZJRUxEX0lOVEVSTEFDRURdID0gImludGVybGFjZWQiLAoJW1Y0TDJfRklFTERfU0VRX1RCXSAgICAgPSAic2VxLXRiIiwKCVtWNEwyX0ZJRUxEX1NFUV9CVF0gICAgID0gInNlcS1idCIsCglbVjRMMl9GSUVMRF9BTFRFUk5BVEVdICA9ICJhbHRlcm5hdGUiLAoJW1Y0TDJfRklFTERfSU5URVJMQUNFRF9UQl0gPSAiaW50ZXJsYWNlZC10YiIsCglbVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX0JUXSA9ICJpbnRlcmxhY2VkLWJ0IiwKfTsKCmNoYXIgKnY0bDJfdHlwZV9uYW1lc1tdID0gewoJW1Y0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV0gICAgICA9ICJ2aWRlby1jYXAiLAoJW1Y0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWV0gICAgICA9ICJ2aWRlby1vdmVyIiwKCVtWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF0gICAgICAgPSAidmlkZW8tb3V0IiwKCVtWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFXSAgICAgICAgPSAidmJpLWNhcCIsCglbVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUXSAgICAgICAgID0gInZiaS1vdXQiLAoJW1Y0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFXSA9ICJzbGljZWQtdmJpLWNhcCIsCglbVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX09VVFBVVF0gID0gInNsaWNlZC12Ymktb3V0IiwKCVtWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9PVkVSTEFZXSA9ICJ2aWRlby1vdXQtb3ZlciIsCn07CgoKI2RlZmluZSBwcnRfbmFtZXMoYSxhcnIpICgoKGEpPj0wKSYmKChhKTxBUlJBWV9TSVpFKGFycikpKT9hcnJbYV06InVua25vd24iCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogZGVidWcgaGVscCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgojaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUCnN0YXRpYyBjb25zdCBjaGFyICp2NGwxX2lvY3Rsc1tdID0gewoJW19JT0NfTlIoVklESU9DR0NBUCldICAgICAgID0gIlZJRElPQ0dDQVAiLAoJW19JT0NfTlIoVklESU9DR0NIQU4pXSAgICAgID0gIlZJRElPQ0dDSEFOIiwKCVtfSU9DX05SKFZJRElPQ1NDSEFOKV0gICAgICA9ICJWSURJT0NTQ0hBTiIsCglbX0lPQ19OUihWSURJT0NHVFVORVIpXSAgICAgPSAiVklESU9DR1RVTkVSIiwKCVtfSU9DX05SKFZJRElPQ1NUVU5FUildICAgICA9ICJWSURJT0NTVFVORVIiLAoJW19JT0NfTlIoVklESU9DR1BJQ1QpXSAgICAgID0gIlZJRElPQ0dQSUNUIiwKCVtfSU9DX05SKFZJRElPQ1NQSUNUKV0gICAgICA9ICJWSURJT0NTUElDVCIsCglbX0lPQ19OUihWSURJT0NDQVBUVVJFKV0gICAgPSAiVklESU9DQ0FQVFVSRSIsCglbX0lPQ19OUihWSURJT0NHV0lOKV0gICAgICAgPSAiVklESU9DR1dJTiIsCglbX0lPQ19OUihWSURJT0NTV0lOKV0gICAgICAgPSAiVklESU9DU1dJTiIsCglbX0lPQ19OUihWSURJT0NHRkJVRildICAgICAgPSAiVklESU9DR0ZCVUYiLAoJW19JT0NfTlIoVklESU9DU0ZCVUYpXSAgICAgID0gIlZJRElPQ1NGQlVGIiwKCVtfSU9DX05SKFZJRElPQ0tFWSldICAgICAgICA9ICJWSURJT0NLRVkiLAoJW19JT0NfTlIoVklESU9DR0ZSRVEpXSAgICAgID0gIlZJRElPQ0dGUkVRIiwKCVtfSU9DX05SKFZJRElPQ1NGUkVRKV0gICAgICA9ICJWSURJT0NTRlJFUSIsCglbX0lPQ19OUihWSURJT0NHQVVESU8pXSAgICAgPSAiVklESU9DR0FVRElPIiwKCVtfSU9DX05SKFZJRElPQ1NBVURJTyldICAgICA9ICJWSURJT0NTQVVESU8iLAoJW19JT0NfTlIoVklESU9DU1lOQyldICAgICAgID0gIlZJRElPQ1NZTkMiLAoJW19JT0NfTlIoVklESU9DTUNBUFRVUkUpXSAgID0gIlZJRElPQ01DQVBUVVJFIiwKCVtfSU9DX05SKFZJRElPQ0dNQlVGKV0gICAgICA9ICJWSURJT0NHTUJVRiIsCglbX0lPQ19OUihWSURJT0NHVU5JVCldICAgICAgPSAiVklESU9DR1VOSVQiLAoJW19JT0NfTlIoVklESU9DR0NBUFRVUkUpXSAgID0gIlZJRElPQ0dDQVBUVVJFIiwKCVtfSU9DX05SKFZJRElPQ1NDQVBUVVJFKV0gICA9ICJWSURJT0NTQ0FQVFVSRSIsCglbX0lPQ19OUihWSURJT0NTUExBWU1PREUpXSAgPSAiVklESU9DU1BMQVlNT0RFIiwKCVtfSU9DX05SKFZJRElPQ1NXUklURU1PREUpXSA9ICJWSURJT0NTV1JJVEVNT0RFIiwKCVtfSU9DX05SKFZJRElPQ0dQTEFZSU5GTyldICA9ICJWSURJT0NHUExBWUlORk8iLAoJW19JT0NfTlIoVklESU9DU01JQ1JPQ09ERSldID0gIlZJRElPQ1NNSUNST0NPREUiLAoJW19JT0NfTlIoVklESU9DR1ZCSUZNVCldICAgID0gIlZJRElPQ0dWQklGTVQiLAoJW19JT0NfTlIoVklESU9DU1ZCSUZNVCldICAgID0gIlZJRElPQ1NWQklGTVQiCn07CiNkZWZpbmUgVjRMMV9JT0NUTFMgQVJSQVlfU0laRSh2NGwxX2lvY3RscykKI2VuZGlmCgpzdGF0aWMgY29uc3QgY2hhciAqdjRsMl9pb2N0bHNbXSA9IHsKCVtfSU9DX05SKFZJRElPQ19RVUVSWUNBUCldICAgICAgICAgPSAiVklESU9DX1FVRVJZQ0FQIiwKCVtfSU9DX05SKFZJRElPQ19SRVNFUlZFRCldICAgICAgICAgPSAiVklESU9DX1JFU0VSVkVEIiwKCVtfSU9DX05SKFZJRElPQ19FTlVNX0ZNVCldICAgICAgICAgPSAiVklESU9DX0VOVU1fRk1UIiwKCVtfSU9DX05SKFZJRElPQ19HX0ZNVCldICAgICAgICAgICAgPSAiVklESU9DX0dfRk1UIiwKCVtfSU9DX05SKFZJRElPQ19TX0ZNVCldICAgICAgICAgICAgPSAiVklESU9DX1NfRk1UIiwKCVtfSU9DX05SKFZJRElPQ19HX01QRUdDT01QKV0gICAgICAgPSAiVklESU9DX0dfTVBFR0NPTVAiLAoJW19JT0NfTlIoVklESU9DX1NfTVBFR0NPTVApXSAgICAgICA9ICJWSURJT0NfU19NUEVHQ09NUCIsCglbX0lPQ19OUihWSURJT0NfUkVRQlVGUyldICAgICAgICAgID0gIlZJRElPQ19SRVFCVUZTIiwKCVtfSU9DX05SKFZJRElPQ19RVUVSWUJVRildICAgICAgICAgPSAiVklESU9DX1FVRVJZQlVGIiwKCVtfSU9DX05SKFZJRElPQ19HX0ZCVUYpXSAgICAgICAgICAgPSAiVklESU9DX0dfRkJVRiIsCglbX0lPQ19OUihWSURJT0NfU19GQlVGKV0gICAgICAgICAgID0gIlZJRElPQ19TX0ZCVUYiLAoJW19JT0NfTlIoVklESU9DX09WRVJMQVkpXSAgICAgICAgICA9ICJWSURJT0NfT1ZFUkxBWSIsCglbX0lPQ19OUihWSURJT0NfUUJVRildICAgICAgICAgICAgID0gIlZJRElPQ19RQlVGIiwKCVtfSU9DX05SKFZJRElPQ19EUUJVRildICAgICAgICAgICAgPSAiVklESU9DX0RRQlVGIiwKCVtfSU9DX05SKFZJRElPQ19TVFJFQU1PTildICAgICAgICAgPSAiVklESU9DX1NUUkVBTU9OIiwKCVtfSU9DX05SKFZJRElPQ19TVFJFQU1PRkYpXSAgICAgICAgPSAiVklESU9DX1NUUkVBTU9GRiIsCglbX0lPQ19OUihWSURJT0NfR19QQVJNKV0gICAgICAgICAgID0gIlZJRElPQ19HX1BBUk0iLAoJW19JT0NfTlIoVklESU9DX1NfUEFSTSldICAgICAgICAgICA9ICJWSURJT0NfU19QQVJNIiwKCVtfSU9DX05SKFZJRElPQ19HX1NURCldICAgICAgICAgICAgPSAiVklESU9DX0dfU1REIiwKCVtfSU9DX05SKFZJRElPQ19TX1NURCldICAgICAgICAgICAgPSAiVklESU9DX1NfU1REIiwKCVtfSU9DX05SKFZJRElPQ19FTlVNU1REKV0gICAgICAgICAgPSAiVklESU9DX0VOVU1TVEQiLAoJW19JT0NfTlIoVklESU9DX0VOVU1JTlBVVCldICAgICAgICA9ICJWSURJT0NfRU5VTUlOUFVUIiwKCVtfSU9DX05SKFZJRElPQ19HX0NUUkwpXSAgICAgICAgICAgPSAiVklESU9DX0dfQ1RSTCIsCglbX0lPQ19OUihWSURJT0NfU19DVFJMKV0gICAgICAgICAgID0gIlZJRElPQ19TX0NUUkwiLAoJW19JT0NfTlIoVklESU9DX0dfVFVORVIpXSAgICAgICAgICA9ICJWSURJT0NfR19UVU5FUiIsCglbX0lPQ19OUihWSURJT0NfU19UVU5FUildICAgICAgICAgID0gIlZJRElPQ19TX1RVTkVSIiwKCVtfSU9DX05SKFZJRElPQ19HX0FVRElPKV0gICAgICAgICAgPSAiVklESU9DX0dfQVVESU8iLAoJW19JT0NfTlIoVklESU9DX1NfQVVESU8pXSAgICAgICAgICA9ICJWSURJT0NfU19BVURJTyIsCglbX0lPQ19OUihWSURJT0NfUVVFUllDVFJMKV0gICAgICAgID0gIlZJRElPQ19RVUVSWUNUUkwiLAoJW19JT0NfTlIoVklESU9DX1FVRVJZTUVOVSldICAgICAgICA9ICJWSURJT0NfUVVFUllNRU5VIiwKCVtfSU9DX05SKFZJRElPQ19HX0lOUFVUKV0gICAgICAgICAgPSAiVklESU9DX0dfSU5QVVQiLAoJW19JT0NfTlIoVklESU9DX1NfSU5QVVQpXSAgICAgICAgICA9ICJWSURJT0NfU19JTlBVVCIsCglbX0lPQ19OUihWSURJT0NfR19PVVRQVVQpXSAgICAgICAgID0gIlZJRElPQ19HX09VVFBVVCIsCglbX0lPQ19OUihWSURJT0NfU19PVVRQVVQpXSAgICAgICAgID0gIlZJRElPQ19TX09VVFBVVCIsCglbX0lPQ19OUihWSURJT0NfRU5VTU9VVFBVVCldICAgICAgID0gIlZJRElPQ19FTlVNT1VUUFVUIiwKCVtfSU9DX05SKFZJRElPQ19HX0FVRE9VVCldICAgICAgICAgPSAiVklESU9DX0dfQVVET1VUIiwKCVtfSU9DX05SKFZJRElPQ19TX0FVRE9VVCldICAgICAgICAgPSAiVklESU9DX1NfQVVET1VUIiwKCVtfSU9DX05SKFZJRElPQ19HX01PRFVMQVRPUildICAgICAgPSAiVklESU9DX0dfTU9EVUxBVE9SIiwKCVtfSU9DX05SKFZJRElPQ19TX01PRFVMQVRPUildICAgICAgPSAiVklESU9DX1NfTU9EVUxBVE9SIiwKCVtfSU9DX05SKFZJRElPQ19HX0ZSRVFVRU5DWSldICAgICAgPSAiVklESU9DX0dfRlJFUVVFTkNZIiwKCVtfSU9DX05SKFZJRElPQ19TX0ZSRVFVRU5DWSldICAgICAgPSAiVklESU9DX1NfRlJFUVVFTkNZIiwKCVtfSU9DX05SKFZJRElPQ19DUk9QQ0FQKV0gICAgICAgICAgPSAiVklESU9DX0NST1BDQVAiLAoJW19JT0NfTlIoVklESU9DX0dfQ1JPUCldICAgICAgICAgICA9ICJWSURJT0NfR19DUk9QIiwKCVtfSU9DX05SKFZJRElPQ19TX0NST1ApXSAgICAgICAgICAgPSAiVklESU9DX1NfQ1JPUCIsCglbX0lPQ19OUihWSURJT0NfR19KUEVHQ09NUCldICAgICAgID0gIlZJRElPQ19HX0pQRUdDT01QIiwKCVtfSU9DX05SKFZJRElPQ19TX0pQRUdDT01QKV0gICAgICAgPSAiVklESU9DX1NfSlBFR0NPTVAiLAoJW19JT0NfTlIoVklESU9DX1FVRVJZU1REKV0gICAgICAgICA9ICJWSURJT0NfUVVFUllTVEQiLAoJW19JT0NfTlIoVklESU9DX1RSWV9GTVQpXSAgICAgICAgICA9ICJWSURJT0NfVFJZX0ZNVCIsCglbX0lPQ19OUihWSURJT0NfRU5VTUFVRElPKV0gICAgICAgID0gIlZJRElPQ19FTlVNQVVESU8iLAoJW19JT0NfTlIoVklESU9DX0VOVU1BVURPVVQpXSAgICAgICA9ICJWSURJT0NfRU5VTUFVRE9VVCIsCglbX0lPQ19OUihWSURJT0NfR19QUklPUklUWSldICAgICAgID0gIlZJRElPQ19HX1BSSU9SSVRZIiwKCVtfSU9DX05SKFZJRElPQ19TX1BSSU9SSVRZKV0gICAgICAgPSAiVklESU9DX1NfUFJJT1JJVFkiLAoJW19JT0NfTlIoVklESU9DX0dfU0xJQ0VEX1ZCSV9DQVApXSA9ICJWSURJT0NfR19TTElDRURfVkJJX0NBUCIsCglbX0lPQ19OUihWSURJT0NfTE9HX1NUQVRVUyldICAgICAgID0gIlZJRElPQ19MT0dfU1RBVFVTIiwKCVtfSU9DX05SKFZJRElPQ19HX0VYVF9DVFJMUyldICAgICAgPSAiVklESU9DX0dfRVhUX0NUUkxTIiwKCVtfSU9DX05SKFZJRElPQ19TX0VYVF9DVFJMUyldICAgICAgPSAiVklESU9DX1NfRVhUX0NUUkxTIiwKCVtfSU9DX05SKFZJRElPQ19UUllfRVhUX0NUUkxTKV0gICAgPSAiVklESU9DX1RSWV9FWFRfQ1RSTFMiLAojaWYgMQoJW19JT0NfTlIoVklESU9DX0VOVU1fRlJBTUVTSVpFUyldICA9ICJWSURJT0NfRU5VTV9GUkFNRVNJWkVTIiwKCVtfSU9DX05SKFZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTKV0gPSAiVklESU9DX0VOVU1fRlJBTUVJTlRFUlZBTFMiLAoJW19JT0NfTlIoVklESU9DX0dfRU5DX0lOREVYKV0gCSAgID0gIlZJRElPQ19HX0VOQ19JTkRFWCIsCglbX0lPQ19OUihWSURJT0NfRU5DT0RFUl9DTUQpXSAJICAgPSAiVklESU9DX0VOQ09ERVJfQ01EIiwKCVtfSU9DX05SKFZJRElPQ19UUllfRU5DT0RFUl9DTUQpXSAgPSAiVklESU9DX1RSWV9FTkNPREVSX0NNRCIsCgoJW19JT0NfTlIoVklESU9DX0RCR19TX1JFR0lTVEVSKV0gICA9ICJWSURJT0NfREJHX1NfUkVHSVNURVIiLAoJW19JT0NfTlIoVklESU9DX0RCR19HX1JFR0lTVEVSKV0gICA9ICJWSURJT0NfREJHX0dfUkVHSVNURVIiLAoKCVtfSU9DX05SKFZJRElPQ19HX0NISVBfSURFTlQpXSAgICAgPSAiVklESU9DX0dfQ0hJUF9JREVOVCIsCiNlbmRpZgp9OwojZGVmaW5lIFY0TDJfSU9DVExTIEFSUkFZX1NJWkUodjRsMl9pb2N0bHMpCgpzdGF0aWMgY29uc3QgY2hhciAqdjRsMl9pbnRfaW9jdGxzW10gPSB7CiNpZmRlZiBDT05GSUdfVklERU9fVjRMMV9DT01QQVQKCVtfSU9DX05SKERFQ09ERVJfR0VUX0NBUEFCSUxJVElFUyldICAgID0gIkRFQ09ERVJfR0VUX0NBUEFCSUxJVElFUyIsCglbX0lPQ19OUihERUNPREVSX0dFVF9TVEFUVVMpXSAgICAgICAgICA9ICJERUNPREVSX0dFVF9TVEFUVVMiLAoJW19JT0NfTlIoREVDT0RFUl9TRVRfTk9STSldICAgICAgICAgICAgPSAiREVDT0RFUl9TRVRfTk9STSIsCglbX0lPQ19OUihERUNPREVSX1NFVF9JTlBVVCldICAgICAgICAgICA9ICJERUNPREVSX1NFVF9JTlBVVCIsCglbX0lPQ19OUihERUNPREVSX1NFVF9PVVRQVVQpXSAgICAgICAgICA9ICJERUNPREVSX1NFVF9PVVRQVVQiLAoJW19JT0NfTlIoREVDT0RFUl9FTkFCTEVfT1VUUFVUKV0gICAgICAgPSAiREVDT0RFUl9FTkFCTEVfT1VUUFVUIiwKCVtfSU9DX05SKERFQ09ERVJfU0VUX1BJQ1RVUkUpXSAgICAgICAgID0gIkRFQ09ERVJfU0VUX1BJQ1RVUkUiLAoJW19JT0NfTlIoREVDT0RFUl9TRVRfR1BJTyldICAgICAgICAgICAgPSAiREVDT0RFUl9TRVRfR1BJTyIsCglbX0lPQ19OUihERUNPREVSX0lOSVQpXSAgICAgICAgICAgICAgICA9ICJERUNPREVSX0lOSVQiLAoJW19JT0NfTlIoREVDT0RFUl9TRVRfVkJJX0JZUEFTUyldICAgICAgPSAiREVDT0RFUl9TRVRfVkJJX0JZUEFTUyIsCglbX0lPQ19OUihERUNPREVSX0RVTVApXSAgICAgICAgICAgICAgICA9ICJERUNPREVSX0RVTVAiLAojZW5kaWYKCVtfSU9DX05SKEFVRENfU0VUX1JBRElPKV0gICAgICAgICAgICAgID0gIkFVRENfU0VUX1JBRElPIiwKCglbX0lPQ19OUihUVU5FUl9TRVRfVFlQRV9BRERSKV0gICAgICAgICA9ICJUVU5FUl9TRVRfVFlQRV9BRERSIiwKCVtfSU9DX05SKFRVTkVSX1NFVF9TVEFOREJZKV0gICAgICAgICAgID0gIlRVTkVSX1NFVF9TVEFOREJZIiwKCVtfSU9DX05SKFREQTk4ODdfU0VUX0NPTkZJRyldICAgICAgICAgID0gIlREQTk4ODdfU0VUX0NPTkZJRyIsCgoJW19JT0NfTlIoVklESU9DX0lOVF9TX1RVTkVSX01PREUpXSAgICAgPSAiVklESU9DX0lOVF9TX1RVTkVSX01PREUiLAoJW19JT0NfTlIoVklESU9DX0lOVF9SRVNFVCldICAgICAgICAgICAgPSAiVklESU9DX0lOVF9SRVNFVCIsCglbX0lPQ19OUihWSURJT0NfSU5UX0FVRElPX0NMT0NLX0ZSRVEpXSA9ICJWSURJT0NfSU5UX0FVRElPX0NMT0NLX0ZSRVEiLAoJW19JT0NfTlIoVklESU9DX0lOVF9ERUNPREVfVkJJX0xJTkUpXSAgPSAiVklESU9DX0lOVF9ERUNPREVfVkJJX0xJTkUiLAoJW19JT0NfTlIoVklESU9DX0lOVF9TX1ZCSV9EQVRBKV0gICAgICAgPSAiVklESU9DX0lOVF9TX1ZCSV9EQVRBIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfR19WQklfREFUQSldICAgICAgID0gIlZJRElPQ19JTlRfR19WQklfREFUQSIsCglbX0lPQ19OUihWSURJT0NfSU5UX0kyU19DTE9DS19GUkVRKV0gICA9ICJWSURJT0NfSU5UX0kyU19DTE9DS19GUkVRIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfU19TVEFOREJZKV0gICAgICAgID0gIlZJRElPQ19JTlRfU19TVEFOREJZIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfU19BVURJT19ST1VUSU5HKV0gID0gIlZJRElPQ19JTlRfU19BVURJT19ST1VUSU5HIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfR19BVURJT19ST1VUSU5HKV0gID0gIlZJRElPQ19JTlRfR19BVURJT19ST1VUSU5HIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfU19WSURFT19ST1VUSU5HKV0gID0gIlZJRElPQ19JTlRfU19WSURFT19ST1VUSU5HIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfR19WSURFT19ST1VUSU5HKV0gID0gIlZJRElPQ19JTlRfR19WSURFT19ST1VUSU5HIiwKCVtfSU9DX05SKFZJRElPQ19JTlRfU19DUllTVEFMX0ZSRVEpXSAgID0gIlZJRElPQ19JTlRfU19DUllTVEFMX0ZSRVEiLAoJW19JT0NfTlIoVklESU9DX0lOVF9JTklUKV0gICAJICAgICAgID0gIlZJRElPQ19JTlRfSU5JVCIsCglbX0lPQ19OUihWSURJT0NfSU5UX0dfU1REX09VVFBVVCldICAgICA9ICJWSURJT0NfSU5UX0dfU1REX09VVFBVVCIsCglbX0lPQ19OUihWSURJT0NfSU5UX1NfU1REX09VVFBVVCldICAgICA9ICJWSURJT0NfSU5UX1NfU1REX09VVFBVVCIsCn07CiNkZWZpbmUgVjRMMl9JTlRfSU9DVExTIEFSUkFZX1NJWkUodjRsMl9pbnRfaW9jdGxzKQoKCi8qIENvbW1vbiBpb2N0bCBkZWJ1ZyBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBieQogICBleHRlcm5hbCBpb2N0bCBtZXNzYWdlcyBhcyB3ZWxsIGFzIGludGVybmFsIFY0TCBpb2N0bCAqLwp2b2lkIHY0bF9wcmludGtfaW9jdGwodW5zaWduZWQgaW50IGNtZCkKewoJY2hhciAqZGlyOwoKCXN3aXRjaCAoX0lPQ19ESVIoY21kKSkgewoJY2FzZSBfSU9DX05PTkU6ICAgICAgICAgICAgICBkaXIgPSAiLS0iOyBicmVhazsKCWNhc2UgX0lPQ19SRUFEOiAgICAgICAgICAgICAgZGlyID0gInItIjsgYnJlYWs7CgljYXNlIF9JT0NfV1JJVEU6ICAgICAgICAgICAgIGRpciA9ICItdyI7IGJyZWFrOwoJY2FzZSBfSU9DX1JFQUQgfCBfSU9DX1dSSVRFOiBkaXIgPSAicnciOyBicmVhazsKCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgZGlyID0gIipFUlIqIjsgYnJlYWs7Cgl9Cglzd2l0Y2ggKF9JT0NfVFlQRShjbWQpKSB7CgljYXNlICdkJzoKCQlwcmludGsoInY0bDJfaW50IGlvY3RsICVzLCBkaXI9JXMgKDB4JTA4eClcbiIsCgkJICAgICAgIChfSU9DX05SKGNtZCkgPCBWNEwyX0lOVF9JT0NUTFMpID8KCQkgICAgICAgdjRsMl9pbnRfaW9jdGxzW19JT0NfTlIoY21kKV0gOiAiVU5LTk9XTiIsIGRpciwgY21kKTsKCQlicmVhazsKI2lmZGVmIENPTkZJR19WSURFT19WNEwxX0NPTVBBVAoJY2FzZSAndic6CgkJcHJpbnRrKCJ2NGwxIGlvY3RsICVzLCBkaXI9JXMgKDB4JTA4eClcbiIsCgkJICAgICAgIChfSU9DX05SKGNtZCkgPCBWNEwxX0lPQ1RMUykgPwoJCSAgICAgICB2NGwxX2lvY3Rsc1tfSU9DX05SKGNtZCldIDogIlVOS05PV04iLCBkaXIsIGNtZCk7CgkJYnJlYWs7CiNlbmRpZgoJY2FzZSAnVic6CgkJcHJpbnRrKCJ2NGwyIGlvY3RsICVzLCBkaXI9JXMgKDB4JTA4eClcbiIsCgkJICAgICAgIChfSU9DX05SKGNtZCkgPCBWNEwyX0lPQ1RMUykgPwoJCSAgICAgICB2NGwyX2lvY3Rsc1tfSU9DX05SKGNtZCldIDogIlVOS05PV04iLCBkaXIsIGNtZCk7CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlwcmludGsoInVua25vd24gaW9jdGwgJyVjJywgZGlyPSVzLCAjJWQgKDB4JTA4eClcbiIsCgkJICAgICAgIF9JT0NfVFlQRShjbWQpLCBkaXIsIF9JT0NfTlIoY21kKSwgY21kKTsKCX0KfQoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBjb250cm9sIGhhbmRsaW5nCQkJICAgICAqLwoKLyogQ2hlY2sgZm9yIGNvcnJlY3RuZXNzIG9mIHRoZSBjdHJsJ3MgdmFsdWUgYmFzZWQgb24gdGhlIGRhdGEgZnJvbQogICBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgYW5kIHRoZSBhdmFpbGFibGUgbWVudSBpdGVtcy4gTm90ZSB0aGF0CiAgIG1lbnVfaXRlbXMgbWF5IGJlIE5VTEwsIGluIHRoYXQgY2FzZSBpdCBpcyBpZ25vcmVkLiAqLwppbnQgdjRsMl9jdHJsX2NoZWNrKHN0cnVjdCB2NGwyX2V4dF9jb250cm9sICpjdHJsLCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsLAoJCWNvbnN0IGNoYXIgKiptZW51X2l0ZW1zKQp7CglpZiAocWN0cmwtPmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQpCgkJcmV0dXJuIC1FSU5WQUw7CglpZiAocWN0cmwtPmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfR1JBQkJFRCkKCQlyZXR1cm4gLUVCVVNZOwoJaWYgKHFjdHJsLT50eXBlID09IFY0TDJfQ1RSTF9UWVBFX0JVVFRPTiB8fAoJICAgIHFjdHJsLT50eXBlID09IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI2NCB8fAoJICAgIHFjdHJsLT50eXBlID09IFY0TDJfQ1RSTF9UWVBFX0NUUkxfQ0xBU1MpCgkJcmV0dXJuIDA7CglpZiAoY3RybC0+dmFsdWUgPCBxY3RybC0+bWluaW11bSB8fCBjdHJsLT52YWx1ZSA+IHFjdHJsLT5tYXhpbXVtKQoJCXJldHVybiAtRVJBTkdFOwoJaWYgKHFjdHJsLT50eXBlID09IFY0TDJfQ1RSTF9UWVBFX01FTlUgJiYgbWVudV9pdGVtcyAhPSBOVUxMKSB7CgkJaWYgKG1lbnVfaXRlbXNbY3RybC0+dmFsdWVdID09IE5VTEwgfHwKCQkgICAgbWVudV9pdGVtc1tjdHJsLT52YWx1ZV1bMF0gPT0gJ1wwJykKCQkJcmV0dXJuIC1FSU5WQUw7Cgl9CglyZXR1cm4gMDsKfQoKLyogUmV0dXJucyBOVUxMIG9yIGEgY2hhcmFjdGVyIHBvaW50ZXIgYXJyYXkgY29udGFpbmluZyB0aGUgbWVudSBmb3IKICAgdGhlIGdpdmVuIGNvbnRyb2wgSUQuIFRoZSBwb2ludGVyIGFycmF5IGVuZHMgd2l0aCBhIE5VTEwgcG9pbnRlci4KICAgQW4gZW1wdHkgc3RyaW5nIHNpZ25pZmllcyBhIG1lbnUgZW50cnkgdGhhdCBpcyBpbnZhbGlkLiBUaGlzIGFsbG93cwogICBkcml2ZXJzIHRvIGRpc2FibGUgY2VydGFpbiBvcHRpb25zIGlmIGl0IGlzIG5vdCBzdXBwb3J0ZWQuICovCmNvbnN0IGNoYXIgKip2NGwyX2N0cmxfZ2V0X21lbnUodTMyIGlkKQp7CglzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19hdWRpb19zYW1wbGluZ19mcmVxW10gPSB7CgkJIjQ0LjEga0h6IiwKCQkiNDgga0h6IiwKCQkiMzIga0h6IiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fZW5jb2RpbmdbXSA9IHsKCQkiTGF5ZXIgSSIsCgkJIkxheWVyIElJIiwKCQkiTGF5ZXIgSUlJIiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fbDFfYml0cmF0ZVtdID0gewoJCSIzMiBrYnBzIiwKCQkiNjQga2JwcyIsCgkJIjk2IGticHMiLAoJCSIxMjgga2JwcyIsCgkJIjE2MCBrYnBzIiwKCQkiMTkyIGticHMiLAoJCSIyMjQga2JwcyIsCgkJIjI1NiBrYnBzIiwKCQkiMjg4IGticHMiLAoJCSIzMjAga2JwcyIsCgkJIjM1MiBrYnBzIiwKCQkiMzg0IGticHMiLAoJCSI0MTYga2JwcyIsCgkJIjQ0OCBrYnBzIiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fbDJfYml0cmF0ZVtdID0gewoJCSIzMiBrYnBzIiwKCQkiNDgga2JwcyIsCgkJIjU2IGticHMiLAoJCSI2NCBrYnBzIiwKCQkiODAga2JwcyIsCgkJIjk2IGticHMiLAoJCSIxMTIga2JwcyIsCgkJIjEyOCBrYnBzIiwKCQkiMTYwIGticHMiLAoJCSIxOTIga2JwcyIsCgkJIjIyNCBrYnBzIiwKCQkiMjU2IGticHMiLAoJCSIzMjAga2JwcyIsCgkJIjM4NCBrYnBzIiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fbDNfYml0cmF0ZVtdID0gewoJCSIzMiBrYnBzIiwKCQkiNDAga2JwcyIsCgkJIjQ4IGticHMiLAoJCSI1NiBrYnBzIiwKCQkiNjQga2JwcyIsCgkJIjgwIGticHMiLAoJCSI5NiBrYnBzIiwKCQkiMTEyIGticHMiLAoJCSIxMjgga2JwcyIsCgkJIjE2MCBrYnBzIiwKCQkiMTkyIGticHMiLAoJCSIyMjQga2JwcyIsCgkJIjI1NiBrYnBzIiwKCQkiMzIwIGticHMiLAoJCU5VTEwKCX07CglzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19hdWRpb19tb2RlW10gPSB7CgkJIlN0ZXJlbyIsCgkJIkpvaW50IFN0ZXJlbyIsCgkJIkR1YWwiLAoJCSJNb25vIiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fbW9kZV9leHRlbnNpb25bXSA9IHsKCQkiQm91bmQgNCIsCgkJIkJvdW5kIDgiLAoJCSJCb3VuZCAxMiIsCgkJIkJvdW5kIDE2IiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fZW1waGFzaXNbXSA9IHsKCQkiTm8gRW1waGFzaXMiLAoJCSI1MC8xNSB1cyIsCgkJIkNDSVRUIEoxNyIsCgkJTlVMTAoJfTsKCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX2F1ZGlvX2NyY1tdID0gewoJCSJObyBDUkMiLAoJCSIxNi1iaXQgQ1JDIiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfdmlkZW9fZW5jb2RpbmdbXSA9IHsKCQkiTVBFRy0xIiwKCQkiTVBFRy0yIiwKCQlOVUxMCgl9OwoJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfdmlkZW9fYXNwZWN0W10gPSB7CgkJIjF4MSIsCgkJIjR4MyIsCgkJIjE2eDkiLAoJCSIyLjIxeDEiLAoJCU5VTEwKCX07CglzdGF0aWMgY29uc3QgY2hhciAqbXBlZ192aWRlb19iaXRyYXRlX21vZGVbXSA9IHsKCQkiVmFyaWFibGUgQml0cmF0ZSIsCgkJIkNvbnN0YW50IEJpdHJhdGUiLAoJCU5VTEwKCX07CglzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19zdHJlYW1fdHlwZVtdID0gewoJCSJNUEVHLTIgUHJvZ3JhbSBTdHJlYW0iLAoJCSJNUEVHLTIgVHJhbnNwb3J0IFN0cmVhbSIsCgkJIk1QRUctMSBTeXN0ZW0gU3RyZWFtIiwKCQkiTVBFRy0yIERWRC1jb21wYXRpYmxlIFN0cmVhbSIsCgkJIk1QRUctMSBWQ0QtY29tcGF0aWJsZSBTdHJlYW0iLAoJCSJNUEVHLTIgU1ZDRC1jb21wYXRpYmxlIFN0cmVhbSIsCgkJTlVMTAoJfTsKCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX3N0cmVhbV92YmlfZm10W10gPSB7CgkJIk5vIFZCSSIsCgkJIlByaXZhdGUgcGFja2V0LCBJVlRWIGZvcm1hdCIsCgkJTlVMTAoJfTsKCglzd2l0Y2ggKGlkKSB7CgkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVE6CgkJCXJldHVybiBtcGVnX2F1ZGlvX3NhbXBsaW5nX2ZyZXE7CgkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HOgoJCQlyZXR1cm4gbXBlZ19hdWRpb19lbmNvZGluZzsKCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDFfQklUUkFURToKCQkJcmV0dXJuIG1wZWdfYXVkaW9fbDFfYml0cmF0ZTsKCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURToKCQkJcmV0dXJuIG1wZWdfYXVkaW9fbDJfYml0cmF0ZTsKCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDNfQklUUkFURToKCQkJcmV0dXJuIG1wZWdfYXVkaW9fbDNfYml0cmF0ZTsKCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERToKCQkJcmV0dXJuIG1wZWdfYXVkaW9fbW9kZTsKCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT046CgkJCXJldHVybiBtcGVnX2F1ZGlvX21vZGVfZXh0ZW5zaW9uOwoJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTVBIQVNJUzoKCQkJcmV0dXJuIG1wZWdfYXVkaW9fZW1waGFzaXM7CgkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0NSQzoKCQkJcmV0dXJuIG1wZWdfYXVkaW9fY3JjOwoJCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORzoKCQkJcmV0dXJuIG1wZWdfdmlkZW9fZW5jb2Rpbmc7CgkJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVDoKCQkJcmV0dXJuIG1wZWdfdmlkZW9fYXNwZWN0OwoJCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREU6CgkJCXJldHVybiBtcGVnX3ZpZGVvX2JpdHJhdGVfbW9kZTsKCQljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEU6CgkJCXJldHVybiBtcGVnX3N0cmVhbV90eXBlOwoJCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVkJJX0ZNVDoKCQkJcmV0dXJuIG1wZWdfc3RyZWFtX3ZiaV9mbXQ7CgkJZGVmYXVsdDoKCQkJcmV0dXJuIE5VTEw7Cgl9Cn0KCi8qIEZpbGwgaW4gYSBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKi8KaW50IHY0bDJfY3RybF9xdWVyeV9maWxsKHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwsIHMzMiBtaW4sIHMzMiBtYXgsIHMzMiBzdGVwLCBzMzIgZGVmKQp7Cgljb25zdCBjaGFyICpuYW1lOwoKCXFjdHJsLT5mbGFncyA9IDA7Cglzd2l0Y2ggKHFjdHJsLT5pZCkgewoJLyogVVNFUiBjb250cm9scyAqLwoJY2FzZSBWNEwyX0NJRF9VU0VSX0NMQVNTOiAJbmFtZSA9ICJVc2VyIENvbnRyb2xzIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRTogCW5hbWUgPSAiVm9sdW1lIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6IAluYW1lID0gIk11dGUiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRTogCW5hbWUgPSAiQmFsYW5jZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOiAJbmFtZSA9ICJCYXNzIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX0FVRElPX1RSRUJMRTogCW5hbWUgPSAiVHJlYmxlIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX0FVRElPX0xPVURORVNTOiAJbmFtZSA9ICJMb3VkbmVzcyI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOiAJbmFtZSA9ICJCcmlnaHRuZXNzIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOiAJbmFtZSA9ICJDb250cmFzdCI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOiAJbmFtZSA9ICJTYXR1cmF0aW9uIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX0hVRTogCQluYW1lID0gIkh1ZSI7IGJyZWFrOwoKCS8qIE1QRUcgY29udHJvbHMgKi8KCWNhc2UgVjRMMl9DSURfTVBFR19DTEFTUzogCQluYW1lID0gIk1QRUcgRW5jb2RlciBDb250cm9scyI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVE6IG5hbWUgPSAiQXVkaW8gU2FtcGxpbmcgRnJlcXVlbmN5IjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU5DT0RJTkc6IAluYW1lID0gIkF1ZGlvIEVuY29kaW5nIExheWVyIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDFfQklUUkFURTogCW5hbWUgPSAiQXVkaW8gTGF5ZXIgSSBCaXRyYXRlIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURTogCW5hbWUgPSAiQXVkaW8gTGF5ZXIgSUkgQml0cmF0ZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wzX0JJVFJBVEU6IAluYW1lID0gIkF1ZGlvIExheWVyIElJSSBCaXRyYXRlIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERTogCQluYW1lID0gIkF1ZGlvIFN0ZXJlbyBNb2RlIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT046IG5hbWUgPSAiQXVkaW8gU3RlcmVvIE1vZGUgRXh0ZW5zaW9uIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVM6IAluYW1lID0gIkF1ZGlvIEVtcGhhc2lzIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fQ1JDOiAJCW5hbWUgPSAiQXVkaW8gQ1JDIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTVVURTogCQluYW1lID0gIkF1ZGlvIE11dGUiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORzogCW5hbWUgPSAiVmlkZW8gRW5jb2RpbmciOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1Q6IAluYW1lID0gIlZpZGVvIEFzcGVjdCI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JfRlJBTUVTOiAJbmFtZSA9ICJWaWRlbyBCIEZyYW1lcyI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9TSVpFOiAJbmFtZSA9ICJWaWRlbyBHT1AgU2l6ZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFOiAJbmFtZSA9ICJWaWRlbyBHT1AgQ2xvc3VyZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1BVTExET1dOOiAJbmFtZSA9ICJWaWRlbyBQdWxsZG93biI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERTogCW5hbWUgPSAiVmlkZW8gQml0cmF0ZSBNb2RlIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURTogCW5hbWUgPSAiVmlkZW8gQml0cmF0ZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfUEVBSzogCW5hbWUgPSAiVmlkZW8gUGVhayBCaXRyYXRlIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVEVNUE9SQUxfREVDSU1BVElPTjogbmFtZSA9ICJWaWRlbyBUZW1wb3JhbCBEZWNpbWF0aW9uIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVVURTogCQluYW1lID0gIlZpZGVvIE11dGUiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NVVRFX1lVVjoJbmFtZSA9ICJWaWRlbyBNdXRlIFlVViI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFOiAJbmFtZSA9ICJTdHJlYW0gVHlwZSI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfUE1UOiAJbmFtZSA9ICJTdHJlYW0gUE1UIFByb2dyYW0gSUQiOyBicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX0FVRElPOiAJbmFtZSA9ICJTdHJlYW0gQXVkaW8gUHJvZ3JhbSBJRCI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfVklERU86IAluYW1lID0gIlN0cmVhbSBWaWRlbyBQcm9ncmFtIElEIjsgYnJlYWs7CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9QQ1I6IAluYW1lID0gIlN0cmVhbSBQQ1IgUHJvZ3JhbSBJRCI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QRVNfSURfQVVESU86IG5hbWUgPSAiU3RyZWFtIFBFUyBBdWRpbyBJRCI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QRVNfSURfVklERU86IG5hbWUgPSAiU3RyZWFtIFBFUyBWaWRlbyBJRCI7IGJyZWFrOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9WQklfRk1UOgluYW1lID0gIlN0cmVhbSBWQkkgRm9ybWF0IjsgYnJlYWs7CgoJZGVmYXVsdDoKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCXN3aXRjaCAocWN0cmwtPmlkKSB7CgljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CgljYXNlIFY0TDJfQ0lEX0FVRElPX0xPVURORVNTOgoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01VVEU6CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVVURToKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfQ0xPU1VSRToKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19QVUxMRE9XTjoKCQlxY3RybC0+dHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU47CgkJbWluID0gMDsKCQltYXggPSBzdGVwID0gMTsKCQlicmVhazsKCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19TQU1QTElOR19GUkVROgoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HOgoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wxX0JJVFJBVEU6CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURToKCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MM19CSVRSQVRFOgoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREU6CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT046CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVM6CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fQ1JDOgoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HOgoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVDoKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREU6CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEU6CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1ZCSV9GTVQ6CgkJcWN0cmwtPnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9NRU5VOwoJCXN0ZXAgPSAxOwoJCWJyZWFrOwoJY2FzZSBWNEwyX0NJRF9VU0VSX0NMQVNTOgoJY2FzZSBWNEwyX0NJRF9NUEVHX0NMQVNTOgoJCXFjdHJsLT50eXBlID0gVjRMMl9DVFJMX1RZUEVfQ1RSTF9DTEFTUzsKCQlxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfUkVBRF9PTkxZOwoJCW1pbiA9IG1heCA9IHN0ZXAgPSBkZWYgPSAwOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlxY3RybC0+dHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI7CgkJYnJlYWs7Cgl9Cglzd2l0Y2ggKHFjdHJsLT5pZCkgewoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HOgoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREU6CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9NT0RFOgoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JfRlJBTUVTOgoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFOgoJCXFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19VUERBVEU7CgkJYnJlYWs7CgljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRToKCWNhc2UgVjRMMl9DSURfQVVESU9fQkFTUzoKCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgoJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgoJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKCWNhc2UgVjRMMl9DSURfSFVFOgoJCXFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19TTElERVI7CgkJYnJlYWs7Cgl9CglxY3RybC0+bWluaW11bSA9IG1pbjsKCXFjdHJsLT5tYXhpbXVtID0gbWF4OwoJcWN0cmwtPnN0ZXAgPSBzdGVwOwoJcWN0cmwtPmRlZmF1bHRfdmFsdWUgPSBkZWY7CglxY3RybC0+cmVzZXJ2ZWRbMF0gPSBxY3RybC0+cmVzZXJ2ZWRbMV0gPSAwOwoJc25wcmludGYocWN0cmwtPm5hbWUsIHNpemVvZihxY3RybC0+bmFtZSksIG5hbWUpOwoJcmV0dXJuIDA7Cn0KCi8qIEZpbGwgaW4gYSBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgd2l0aCBzdGFuZGFyZCB2YWx1ZXMgYmFzZWQgb24KICAgdGhlIGNvbnRyb2wgSUQuICovCmludCB2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQoc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCkKewoJc3dpdGNoIChxY3RybC0+aWQpIHsKCS8qIFVTRVIgY29udHJvbHMgKi8KCWNhc2UgVjRMMl9DSURfVVNFUl9DTEFTUzoKCWNhc2UgVjRMMl9DSURfTVBFR19DTEFTUzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDAsIDAsIDApOwoJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCA2NTUzNSwgNjU1MzUgLyAxMDAsIDU4ODgwKTsKCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKCWNhc2UgVjRMMl9DSURfQVVESU9fTE9VRE5FU1M6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAxLCAxLCAwKTsKCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRToKCWNhc2UgVjRMMl9DSURfQVVESU9fQkFTUzoKCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgNjU1MzUsIDY1NTM1IC8gMTAwLCAzMjc2OCk7CgljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAyNTUsIDEsIDEyOCk7CgljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgoJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMTI3LCAxLCA2NCk7CgljYXNlIFY0TDJfQ0lEX0hVRToKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIC0xMjgsIDEyNywgMSwgMCk7CgoJLyogTVBFRyBjb250cm9scyAqLwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVE6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVFfNDQxMDAsCgkJCQlWNEwyX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUV8zMjAwMCwgMSwKCQkJCVY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzQ4MDAwKTsKCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMSwKCQkJCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8zLCAxLAoJCQkJVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0xBWUVSXzIpOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wxX0JJVFJBVEU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMzJLLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfNDQ4SywgMSwKCQkJCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzI1NkspOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wyX0JJVFJBVEU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzJLLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzg0SywgMSwKCQkJCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzIyNEspOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wzX0JJVFJBVEU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMzJLLAoJCQkJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMzIwSywgMSwKCQkJCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzE5MkspOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX01PREVfU1RFUkVPLAoJCQkJVjRMMl9NUEVHX0FVRElPX01PREVfTU9OTywgMSwKCQkJCVY0TDJfTVBFR19BVURJT19NT0RFX1NURVJFTyk7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT046CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OX0JPVU5EXzQsCgkJCQlWNEwyX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT05fQk9VTkRfMTYsIDEsCgkJCQlWNEwyX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT05fQk9VTkRfNCk7CgljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVM6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX0FVRElPX0VNUEhBU0lTX05PTkUsCgkJCQlWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfQ0NJVFRfSjE3LCAxLAoJCQkJVjRMMl9NUEVHX0FVRElPX0VNUEhBU0lTX05PTkUpOwoJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0NSQzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfQVVESU9fQ1JDX05PTkUsCgkJCQlWNEwyX01QRUdfQVVESU9fQ1JDX0NSQzE2LCAxLAoJCQkJVjRMMl9NUEVHX0FVRElPX0NSQ19OT05FKTsKCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19NVVRFOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMSwgMSwgMCk7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkc6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMSwKCQkJCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzIsIDEsCgkJCQlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yKTsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1Q6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xeDEsCgkJCQlWNEwyX01QRUdfVklERU9fQVNQRUNUXzIyMXgxMDAsIDEsCgkJCQlWNEwyX01QRUdfVklERU9fQVNQRUNUXzR4Myk7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQl9GUkFNRVM6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAzMywgMSwgMik7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX1NJWkU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAxLCAzNCwgMSwgMTIpOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMSwgMSwgMSk7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fUFVMTERPV046CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAxLCAxLCAwKTsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREU6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAoJCQkJVjRMMl9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9WQlIsCgkJCQlWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX0NCUiwgMSwKCQkJCVY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfVkJSKTsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMjcwMDAwMDAsIDEsIDYwMDAwMDApOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfUEVBSzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDI3MDAwMDAwLCAxLCA4MDAwMDAwKTsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19URU1QT1JBTF9ERUNJTUFUSU9OOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMjU1LCAxLCAwKTsKCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NVVRFOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMSwgMSwgMCk7CgljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVVURV9ZVVY6ICAvKiBJbml0IFlVViAocmVhbGx5IFlDYkNyKSB0byBibGFjayAqLwoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMHhmZmZmZmYsIDEsIDB4MDA4MDgwKTsKCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRToKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCgkJCQlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfUFMsCgkJCQlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfU1ZDRCwgMSwKCQkJCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9QUyk7CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9QTVQ6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAoMSA8PCAxNCkgLSAxLCAxLCAxNik7CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9BVURJTzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsICgxIDw8IDE0KSAtIDEsIDEsIDI2MCk7CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9WSURFTzoKCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsICgxIDw8IDE0KSAtIDEsIDEsIDI1Nik7CgljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9QQ1I6CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAoMSA8PCAxNCkgLSAxLCAxLCAyNTkpOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QRVNfSURfQVVESU86CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAyNTUsIDEsIDApOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QRVNfSURfVklERU86CgkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAyNTUsIDEsIDApOwoJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9WQklfRk1UOgoJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKCQkJCVY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9OT05FLAoJCQkJVjRMMl9NUEVHX1NUUkVBTV9WQklfRk1UX0lWVFYsIDEsCgkJCQlWNEwyX01QRUdfU1RSRUFNX1ZCSV9GTVRfTk9ORSk7CglkZWZhdWx0OgoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgovKiBGaWxsIGluIGEgc3RydWN0IHY0bDJfcXVlcnltZW51IGJhc2VkIG9uIHRoZSBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgYW5kCiAgIHRoZSBtZW51LiBUaGUgcWN0cmwgcG9pbnRlciBtYXkgYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBpZ25vcmVkLiAqLwppbnQgdjRsMl9jdHJsX3F1ZXJ5X21lbnUoc3RydWN0IHY0bDJfcXVlcnltZW51ICpxbWVudSwgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCwKCSAgICAgICBjb25zdCBjaGFyICoqbWVudV9pdGVtcykKewoJaW50IGk7CgoJaWYgKG1lbnVfaXRlbXMgPT0gTlVMTCB8fAoJICAgIChxY3RybCAmJiAocW1lbnUtPmluZGV4IDwgcWN0cmwtPm1pbmltdW0gfHwgcW1lbnUtPmluZGV4ID4gcWN0cmwtPm1heGltdW0pKSkKCQlyZXR1cm4gLUVJTlZBTDsKCWZvciAoaSA9IDA7IGkgPCBxbWVudS0+aW5kZXggJiYgbWVudV9pdGVtc1tpXTsgaSsrKSA7CglpZiAobWVudV9pdGVtc1tpXSA9PSBOVUxMIHx8IG1lbnVfaXRlbXNbaV1bMF0gPT0gJ1wwJykKCQlyZXR1cm4gLUVJTlZBTDsKCXNucHJpbnRmKHFtZW51LT5uYW1lLCBzaXplb2YocW1lbnUtPm5hbWUpLCBtZW51X2l0ZW1zW3FtZW51LT5pbmRleF0pOwoJcW1lbnUtPnJlc2VydmVkID0gMDsKCXJldHVybiAwOwp9CgovKiBjdHJsX2NsYXNzZXMgcG9pbnRzIHRvIGFuIGFycmF5IG9mIHUzMiBwb2ludGVycywgdGhlIGxhc3QgZWxlbWVudCBpcwogICBhIE5VTEwgcG9pbnRlci4gRWFjaCB1MzIgYXJyYXkgaXMgYSAwLXRlcm1pbmF0ZWQgYXJyYXkgb2YgY29udHJvbCBJRHMuCiAgIEVhY2ggYXJyYXkgbXVzdCBiZSBzb3J0ZWQgbG93IHRvIGhpZ2ggYW5kIGJlbG9uZyB0byB0aGUgc2FtZSBjb250cm9sCiAgIGNsYXNzLiBUaGUgYXJyYXkgb2YgdTMyIHBvaW50ZXIgbXVzdCBhbHNvIGJlIHNvcnRlZCwgZnJvbSBsb3cgY2xhc3MgSURzCiAgIHRvIGhpZ2ggY2xhc3MgSURzLgoKICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBmaXJzdCBJRCB0aGF0IGZvbGxvd3MgYWZ0ZXIgdGhlIGdpdmVuIElELgogICBXaGVuIG5vIG1vcmUgY29udHJvbHMgYXJlIGF2YWlsYWJsZSAwIGlzIHJldHVybmVkLiAqLwp1MzIgdjRsMl9jdHJsX25leHQoY29uc3QgdTMyICogY29uc3QgKiBjdHJsX2NsYXNzZXMsIHUzMiBpZCkKewoJdTMyIGN0cmxfY2xhc3MgPSBWNEwyX0NUUkxfSUQyQ0xBU1MoaWQpOwoJY29uc3QgdTMyICpwY3RybDsKCglpZiAoY3RybF9jbGFzc2VzID09IE5VTEwpCgkJcmV0dXJuIDA7CgoJLyogaWYgbm8gcXVlcnkgaXMgZGVzaXJlZCwgdGhlbiBjaGVjayBpZiB0aGUgSUQgaXMgcGFydCBvZiBjdHJsX2NsYXNzZXMgKi8KCWlmICgoaWQgJiBWNEwyX0NUUkxfRkxBR19ORVhUX0NUUkwpID09IDApIHsKCQkvKiBmaW5kIGNsYXNzICovCgkJd2hpbGUgKCpjdHJsX2NsYXNzZXMgJiYgVjRMMl9DVFJMX0lEMkNMQVNTKCoqY3RybF9jbGFzc2VzKSAhPSBjdHJsX2NsYXNzKQoJCQljdHJsX2NsYXNzZXMrKzsKCQlpZiAoKmN0cmxfY2xhc3NlcyA9PSBOVUxMKQoJCQlyZXR1cm4gMDsKCQlwY3RybCA9ICpjdHJsX2NsYXNzZXM7CgkJLyogZmluZCBjb250cm9sIElEICovCgkJd2hpbGUgKCpwY3RybCAmJiAqcGN0cmwgIT0gaWQpIHBjdHJsKys7CgkJcmV0dXJuICpwY3RybCA/IGlkIDogMDsKCX0KCWlkICY9IFY0TDJfQ1RSTF9JRF9NQVNLOwoJaWQrKzsJLyogc2VsZWN0IG5leHQgY29udHJvbCAqLwoJLyogZmluZCBmaXJzdCBjbGFzcyB0aGF0IG1hdGNoZXMgKG9yIGlzIGdyZWF0ZXIgdGhhbikgdGhlIGNsYXNzIG9mCgkgICB0aGUgSUQgKi8KCXdoaWxlICgqY3RybF9jbGFzc2VzICYmIFY0TDJfQ1RSTF9JRDJDTEFTUygqKmN0cmxfY2xhc3NlcykgPCBjdHJsX2NsYXNzKQoJCWN0cmxfY2xhc3NlcysrOwoJLyogbm8gbW9yZSBjbGFzc2VzICovCglpZiAoKmN0cmxfY2xhc3NlcyA9PSBOVUxMKQoJCXJldHVybiAwOwoJcGN0cmwgPSAqY3RybF9jbGFzc2VzOwoJLyogZmluZCBmaXJzdCBjdHJsIHdpdGhpbiB0aGUgY2xhc3MgdGhhdCBpcyA+PSBJRCAqLwoJd2hpbGUgKCpwY3RybCAmJiAqcGN0cmwgPCBpZCkgcGN0cmwrKzsKCWlmICgqcGN0cmwpCgkJcmV0dXJuICpwY3RybDsKCS8qIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBjb250cm9scyBvZiB0aGUgY3VycmVudCBjbGFzcy4gKi8KCS8qIGNvbnRpbnVlIHdpdGggbmV4dCBjbGFzcyBpZiBhdmFpbGFibGUgKi8KCWN0cmxfY2xhc3NlcysrOwoJaWYgKCpjdHJsX2NsYXNzZXMgPT0gTlVMTCkKCQlyZXR1cm4gMDsKCXJldHVybiAqKmN0cmxfY2xhc3NlczsKfQoKaW50IHY0bDJfY2hpcF9tYXRjaF9pMmNfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1MzIgbWF0Y2hfdHlwZSwgdTMyIG1hdGNoX2NoaXApCnsKCXN3aXRjaCAobWF0Y2hfdHlwZSkgewoJY2FzZSBWNEwyX0NISVBfTUFUQ0hfSTJDX0RSSVZFUjoKCQlyZXR1cm4gKGMgIT0gTlVMTCAmJiBjLT5kcml2ZXIgIT0gTlVMTCAmJiBjLT5kcml2ZXItPmlkID09IG1hdGNoX2NoaXApOwoJY2FzZSBWNEwyX0NISVBfTUFUQ0hfSTJDX0FERFI6CgkJcmV0dXJuIChjICE9IE5VTEwgJiYgYy0+YWRkciA9PSBtYXRjaF9jaGlwKTsKCWRlZmF1bHQ6CgkJcmV0dXJuIDA7Cgl9Cn0KCmludCB2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqYywgc3RydWN0IHY0bDJfY2hpcF9pZGVudCAqY2hpcCwKCQl1MzIgaWRlbnQsIHUzMiByZXZpc2lvbikKewoJaWYgKCF2NGwyX2NoaXBfbWF0Y2hfaTJjX2NsaWVudChjLCBjaGlwLT5tYXRjaF90eXBlLCBjaGlwLT5tYXRjaF9jaGlwKSkKCQlyZXR1cm4gMDsKCWlmIChjaGlwLT5pZGVudCA9PSBWNEwyX0lERU5UX05PTkUpIHsKCQljaGlwLT5pZGVudCA9IGlkZW50OwoJCWNoaXAtPnJldmlzaW9uID0gcmV2aXNpb247Cgl9CgllbHNlIHsKCQljaGlwLT5pZGVudCA9IFY0TDJfSURFTlRfQU1CSUdVT1VTOwoJCWNoaXAtPnJldmlzaW9uID0gMDsKCX0KCXJldHVybiAwOwp9CgppbnQgdjRsMl9jaGlwX21hdGNoX2hvc3QodTMyIG1hdGNoX3R5cGUsIHUzMiBtYXRjaF9jaGlwKQp7Cglzd2l0Y2ggKG1hdGNoX3R5cGUpIHsKCWNhc2UgVjRMMl9DSElQX01BVENIX0hPU1Q6CgkJcmV0dXJuIG1hdGNoX2NoaXAgPT0gMDsKCWRlZmF1bHQ6CgkJcmV0dXJuIDA7Cgl9Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpFWFBPUlRfU1lNQk9MKHY0bDJfbm9ybV90b19uYW1lKTsKRVhQT1JUX1NZTUJPTCh2NGwyX3ZpZGVvX3N0ZF9jb25zdHJ1Y3QpOwoKRVhQT1JUX1NZTUJPTCh2NGwyX3ByaW9faW5pdCk7CkVYUE9SVF9TWU1CT0wodjRsMl9wcmlvX2NoYW5nZSk7CkVYUE9SVF9TWU1CT0wodjRsMl9wcmlvX29wZW4pOwpFWFBPUlRfU1lNQk9MKHY0bDJfcHJpb19jbG9zZSk7CkVYUE9SVF9TWU1CT0wodjRsMl9wcmlvX21heCk7CkVYUE9SVF9TWU1CT0wodjRsMl9wcmlvX2NoZWNrKTsKCkVYUE9SVF9TWU1CT0wodjRsMl9maWVsZF9uYW1lcyk7CkVYUE9SVF9TWU1CT0wodjRsMl90eXBlX25hbWVzKTsKRVhQT1JUX1NZTUJPTCh2NGxfcHJpbnRrX2lvY3RsKTsKCkVYUE9SVF9TWU1CT0wodjRsMl9jdHJsX25leHQpOwpFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9jaGVjayk7CkVYUE9SVF9TWU1CT0wodjRsMl9jdHJsX2dldF9tZW51KTsKRVhQT1JUX1NZTUJPTCh2NGwyX2N0cmxfcXVlcnlfbWVudSk7CkVYUE9SVF9TWU1CT0wodjRsMl9jdHJsX3F1ZXJ5X2ZpbGwpOwpFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9xdWVyeV9maWxsX3N0ZCk7CgpFWFBPUlRfU1lNQk9MKHY0bDJfY2hpcF9tYXRjaF9pMmNfY2xpZW50KTsKRVhQT1JUX1NZTUJPTCh2NGwyX2NoaXBfaWRlbnRfaTJjX2NsaWVudCk7CkVYUE9SVF9TWU1CT0wodjRsMl9jaGlwX21hdGNoX2hvc3QpOwoKLyoKICogTG9jYWwgdmFyaWFibGVzOgogKiBjLWJhc2ljLW9mZnNldDogOAogKiBFbmQ6CiAqLwo=