LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCCpIDIwMDcgUmVkIEhhdCBJbmMuCiAqIENvcHlyaWdodCCpIDIwMDctMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbgogKiBDb3B5cmlnaHQgMjAwNiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQmlzbWFyY2ssIE5ELiwgVVNBCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAogKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCiAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgogKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCiAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCiAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiAqIG9mIHRoZSBTb2Z0d2FyZS4KICoKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBBdXRob3JzOiBUaG9tYXMgSGVsbHN0cvZtIDx0aG9tYXMtYXQtdHVuZ3N0ZW5ncmFwaGljcy1kb3QtY29tPgogKiAgICAgICAgICBLZWl0aCBXaGl0d2VsbCA8a2VpdGh3LWF0LXR1bmdzdGVuZ3JhcGhpY3MtZG90LWNvbT4KICoJICAgIEVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CiAqCSAgICBEYXZlIEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4KICovCgojaWZkZWYgSEFWRV9DT05GSUdfSAojaW5jbHVkZSAiY29uZmlnLmgiCiNlbmRpZgoKI2luY2x1ZGUgPHhmODZkcm0uaD4KI2luY2x1ZGUgPHhmODZhdG9taWMuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN0ZGJvb2wuaD4KCiNpbmNsdWRlICJlcnJuby5oIgojaWZuZGVmIEVUSU1FCiNkZWZpbmUgRVRJTUUgRVRJTUVET1VUCiNlbmRpZgojaW5jbHVkZSAibGliZHJtX21hY3Jvcy5oIgojaW5jbHVkZSAibGliZHJtX2xpc3RzLmgiCiNpbmNsdWRlICJpbnRlbF9idWZtZ3IuaCIKI2luY2x1ZGUgImludGVsX2J1Zm1ncl9wcml2LmgiCiNpbmNsdWRlICJpbnRlbF9jaGlwc2V0LmgiCiNpbmNsdWRlICJzdHJpbmcuaCIKCiNpbmNsdWRlICJpOTE1X2RybS5oIgojaW5jbHVkZSAidXRoYXNoLmgiCgojaWZkZWYgSEFWRV9WQUxHUklORAojaW5jbHVkZSA8dmFsZ3JpbmQuaD4KI2luY2x1ZGUgPG1lbWNoZWNrLmg+CiNkZWZpbmUgVkcoeCkgeAojZWxzZQojZGVmaW5lIFZHKHgpCiNlbmRpZgoKI2RlZmluZSBtZW1jbGVhcihzKSBtZW1zZXQoJnMsIDAsIHNpemVvZihzKSkKCiNkZWZpbmUgREJHKC4uLikgZG8gewkJCQkJXAoJaWYgKGJ1Zm1ncl9nZW0tPmJ1Zm1nci5kZWJ1ZykJCQlcCgkJZnByaW50ZihzdGRlcnIsIF9fVkFfQVJHU19fKTsJCVwKfSB3aGlsZSAoMCkKCiNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKCh4KVswXSkpCiNkZWZpbmUgTUFYMihBLCBCKSAoKEEpID4gKEIpID8gKEEpIDogKEIpKQoKLyoqCiAqIHVwcGVyXzMyX2JpdHMgLSByZXR1cm4gYml0cyAzMi02MyBvZiBhIG51bWJlcgogKiBAbjogdGhlIG51bWJlciB3ZSdyZSBhY2Nlc3NpbmcKICoKICogQSBiYXNpYyBzaGlmdC1yaWdodCBvZiBhIDY0LSBvciAzMi1iaXQgcXVhbnRpdHkuICBVc2UgdGhpcyB0byBzdXBwcmVzcwogKiB0aGUgInJpZ2h0IHNoaWZ0IGNvdW50ID49IHdpZHRoIG9mIHR5cGUiIHdhcm5pbmcgd2hlbiB0aGF0IHF1YW50aXR5IGlzCiAqIDMyLWJpdHMuCiAqLwojZGVmaW5lIHVwcGVyXzMyX2JpdHMobikgKChfX3UzMikoKChuKSA+PiAxNikgPj4gMTYpKQoKLyoqCiAqIGxvd2VyXzMyX2JpdHMgLSByZXR1cm4gYml0cyAwLTMxIG9mIGEgbnVtYmVyCiAqIEBuOiB0aGUgbnVtYmVyIHdlJ3JlIGFjY2Vzc2luZwogKi8KI2RlZmluZSBsb3dlcl8zMl9iaXRzKG4pICgoX191MzIpKG4pKQoKdHlwZWRlZiBzdHJ1Y3QgX2RybV9pbnRlbF9ib19nZW0gZHJtX2ludGVsX2JvX2dlbTsKCnN0cnVjdCBkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldCB7Cglkcm1NTUxpc3RIZWFkIGhlYWQ7Cgl1bnNpZ25lZCBsb25nIHNpemU7Cn07Cgp0eXBlZGVmIHN0cnVjdCBfZHJtX2ludGVsX2J1Zm1ncl9nZW0gewoJZHJtX2ludGVsX2J1Zm1nciBidWZtZ3I7CgoJYXRvbWljX3QgcmVmY291bnQ7CgoJaW50IGZkOwoKCWludCBtYXhfcmVsb2NzOwoKCXB0aHJlYWRfbXV0ZXhfdCBsb2NrOwoKCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QgKmV4ZWNfb2JqZWN0czsKCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICpleGVjMl9vYmplY3RzOwoJZHJtX2ludGVsX2JvICoqZXhlY19ib3M7CglpbnQgZXhlY19zaXplOwoJaW50IGV4ZWNfY291bnQ7CgoJLyoqIEFycmF5IG9mIGxpc3RzIG9mIGNhY2hlZCBnZW0gb2JqZWN0cyBvZiBwb3dlci1vZi10d28gc2l6ZXMgKi8KCXN0cnVjdCBkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldCBjYWNoZV9idWNrZXRbMTQgKiA0XTsKCWludCBudW1fYnVja2V0czsKCXRpbWVfdCB0aW1lOwoKCWRybU1NTGlzdEhlYWQgbWFuYWdlcnM7CgoJZHJtX2ludGVsX2JvX2dlbSAqbmFtZV90YWJsZTsKCWRybV9pbnRlbF9ib19nZW0gKmhhbmRsZV90YWJsZTsKCglkcm1NTUxpc3RIZWFkIHZtYV9jYWNoZTsKCWludCB2bWFfY291bnQsIHZtYV9vcGVuLCB2bWFfbWF4OwoKCXVpbnQ2NF90IGd0dF9zaXplOwoJaW50IGF2YWlsYWJsZV9mZW5jZXM7CglpbnQgcGNpX2RldmljZTsKCWludCBnZW47Cgl1bnNpZ25lZCBpbnQgaGFzX2JzZCA6IDE7Cgl1bnNpZ25lZCBpbnQgaGFzX2JsdCA6IDE7Cgl1bnNpZ25lZCBpbnQgaGFzX3JlbGF4ZWRfZmVuY2luZyA6IDE7Cgl1bnNpZ25lZCBpbnQgaGFzX2xsYyA6IDE7Cgl1bnNpZ25lZCBpbnQgaGFzX3dhaXRfdGltZW91dCA6IDE7Cgl1bnNpZ25lZCBpbnQgYm9fcmV1c2UgOiAxOwoJdW5zaWduZWQgaW50IG5vX2V4ZWMgOiAxOwoJdW5zaWduZWQgaW50IGhhc192ZWJveCA6IDE7Cgl1bnNpZ25lZCBpbnQgaGFzX2V4ZWNfYXN5bmMgOiAxOwoJYm9vbCBmZW5jZWRfcmVsb2NzOwoKCXN0cnVjdCB7CgkJdm9pZCAqcHRyOwoJCXVpbnQzMl90IGhhbmRsZTsKCX0gdXNlcnB0cl9hY3RpdmU7Cgp9IGRybV9pbnRlbF9idWZtZ3JfZ2VtOwoKI2RlZmluZSBEUk1fSU5URUxfUkVMT0NfRkVOQ0UgKDE8PDApCgp0eXBlZGVmIHN0cnVjdCBfZHJtX2ludGVsX3JlbG9jX3RhcmdldF9pbmZvIHsKCWRybV9pbnRlbF9ibyAqYm87CglpbnQgZmxhZ3M7Cn0gZHJtX2ludGVsX3JlbG9jX3RhcmdldDsKCnN0cnVjdCBfZHJtX2ludGVsX2JvX2dlbSB7Cglkcm1faW50ZWxfYm8gYm87CgoJYXRvbWljX3QgcmVmY291bnQ7Cgl1aW50MzJfdCBnZW1faGFuZGxlOwoJY29uc3QgY2hhciAqbmFtZTsKCgkvKioKCSAqIEtlbmVsLWFzc2lnbmVkIGdsb2JhbCBuYW1lIGZvciB0aGlzIG9iamVjdAogICAgICAgICAqCiAgICAgICAgICogTGlzdCBjb250YWlucyBib3RoIGZsaW5rIG5hbWVkIGFuZCBwcmltZSBmZCdkIG9iamVjdHMKCSAqLwoJdW5zaWduZWQgaW50IGdsb2JhbF9uYW1lOwoKCVVUX2hhc2hfaGFuZGxlIGhhbmRsZV9oaDsKCVVUX2hhc2hfaGFuZGxlIG5hbWVfaGg7CgoJLyoqCgkgKiBJbmRleCBvZiB0aGUgYnVmZmVyIHdpdGhpbiB0aGUgdmFsaWRhdGlvbiBsaXN0IHdoaWxlIHByZXBhcmluZyBhCgkgKiBiYXRjaGJ1ZmZlciBleGVjdXRpb24uCgkgKi8KCWludCB2YWxpZGF0ZV9pbmRleDsKCgkvKioKCSAqIEN1cnJlbnQgdGlsaW5nIG1vZGUKCSAqLwoJdWludDMyX3QgdGlsaW5nX21vZGU7Cgl1aW50MzJfdCBzd2l6emxlX21vZGU7Cgl1bnNpZ25lZCBsb25nIHN0cmlkZTsKCgl1bnNpZ25lZCBsb25nIGtmbGFnczsKCgl0aW1lX3QgZnJlZV90aW1lOwoKCS8qKiBBcnJheSBwYXNzZWQgdG8gdGhlIERSTSBjb250YWluaW5nIHJlbG9jYXRpb24gaW5mb3JtYXRpb24uICovCglzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgKnJlbG9jczsKCS8qKgoJICogQXJyYXkgb2YgaW5mbyBzdHJ1Y3RzIGNvcnJlc3BvbmRpbmcgdG8gcmVsb2NzW2ldLnRhcmdldF9oYW5kbGUgZXRjCgkgKi8KCWRybV9pbnRlbF9yZWxvY190YXJnZXQgKnJlbG9jX3RhcmdldF9pbmZvOwoJLyoqIE51bWJlciBvZiBlbnRyaWVzIGluIHJlbG9jcyAqLwoJaW50IHJlbG9jX2NvdW50OwoJLyoqIEFycmF5IG9mIEJPcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IHRoaXMgYnVmZmVyIGFuZCB3aWxsIGJlIHNvZnRwaW5uZWQgKi8KCWRybV9pbnRlbF9ibyAqKnNvZnRwaW5fdGFyZ2V0OwoJLyoqIE51bWJlciBzb2Z0cGlubmVkIEJPcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IHRoaXMgYnVmZmVyICovCglpbnQgc29mdHBpbl90YXJnZXRfY291bnQ7CgkvKiogTWF4aW11bSBhbW91bnQgb2Ygc29mdHBpbm5lZCBCT3MgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSB0aGlzIGJ1ZmZlciAqLwoJaW50IHNvZnRwaW5fdGFyZ2V0X3NpemU7CgoJLyoqIE1hcHBlZCBhZGRyZXNzIGZvciB0aGUgYnVmZmVyLCBzYXZlZCBhY3Jvc3MgbWFwL3VubWFwIGN5Y2xlcyAqLwoJdm9pZCAqbWVtX3ZpcnR1YWw7CgkvKiogR1RUIHZpcnR1YWwgYWRkcmVzcyBmb3IgdGhlIGJ1ZmZlciwgc2F2ZWQgYWNyb3NzIG1hcC91bm1hcCBjeWNsZXMgKi8KCXZvaWQgKmd0dF92aXJ0dWFsOwoJLyoqIFdDIENQVSBhZGRyZXNzIGZvciB0aGUgYnVmZmVyLCBzYXZlZCBhY3Jvc3MgbWFwL3VubWFwIGN5Y2xlcyAqLwoJdm9pZCAqd2NfdmlydHVhbDsKCS8qKgoJICogVmlydHVhbCBhZGRyZXNzIG9mIHRoZSBidWZmZXIgYWxsb2NhdGVkIGJ5IHVzZXIsIHVzZWQgZm9yIHVzZXJwdHIKCSAqIG9iamVjdHMgb25seS4KCSAqLwoJdm9pZCAqdXNlcl92aXJ0dWFsOwoJaW50IG1hcF9jb3VudDsKCWRybU1NTGlzdEhlYWQgdm1hX2xpc3Q7CgoJLyoqIEJPIGNhY2hlIGxpc3QgKi8KCWRybU1NTGlzdEhlYWQgaGVhZDsKCgkvKioKCSAqIEJvb2xlYW4gb2Ygd2hldGhlciB0aGlzIEJPIGFuZCBpdHMgY2hpbGRyZW4gaGF2ZSBiZWVuIGluY2x1ZGVkIGluCgkgKiB0aGUgY3VycmVudCBkcm1faW50ZWxfYnVmbWdyX2NoZWNrX2FwZXJ0dXJlX3NwYWNlKCkgdG90YWwuCgkgKi8KCWJvb2wgaW5jbHVkZWRfaW5fY2hlY2tfYXBlcnR1cmU7CgoJLyoqCgkgKiBCb29sZWFuIG9mIHdoZXRoZXIgdGhpcyBidWZmZXIgaGFzIGJlZW4gdXNlZCBhcyBhIHJlbG9jYXRpb24KCSAqIHRhcmdldCBhbmQgaGFkIGl0cyBzaXplIGFjY291bnRlZCBmb3IsIGFuZCB0aHVzIGNhbid0IGhhdmUgYW55CgkgKiBmdXJ0aGVyIHJlbG9jYXRpb25zIGFkZGVkIHRvIGl0LgoJICovCglib29sIHVzZWRfYXNfcmVsb2NfdGFyZ2V0OwoKCS8qKgoJICogQm9vbGVhbiBvZiB3aGV0aGVyIHdlIGhhdmUgZW5jb3VudGVyZWQgYW4gZXJyb3Igd2hpbHN0IGJ1aWxkaW5nIHRoZSByZWxvY2F0aW9uIHRyZWUuCgkgKi8KCWJvb2wgaGFzX2Vycm9yOwoKCS8qKgoJICogQm9vbGVhbiBvZiB3aGV0aGVyIHRoaXMgYnVmZmVyIGNhbiBiZSByZS11c2VkCgkgKi8KCWJvb2wgcmV1c2FibGU7CgoJLyoqCgkgKiBCb29sZWFuIG9mIHdoZXRoZXIgdGhlIEdQVSBpcyBkZWZpbml0ZWx5IG5vdCBhY2Nlc3NpbmcgdGhlIGJ1ZmZlci4KCSAqCgkgKiBUaGlzIGlzIG9ubHkgdmFsaWQgd2hlbiByZXVzYWJsZSwgc2luY2Ugbm9uLXJldXNhYmxlCgkgKiBidWZmZXJzIGFyZSB0aG9zZSB0aGF0IGhhdmUgYmVlbiBzaGFyZWQgd2l0aCBvdGhlcgoJICogcHJvY2Vzc2VzLCBzbyB3ZSBkb24ndCBrbm93IHRoZWlyIHN0YXRlLgoJICovCglib29sIGlkbGU7CgoJLyoqCgkgKiBCb29sZWFuIG9mIHdoZXRoZXIgdGhpcyBidWZmZXIgd2FzIGFsbG9jYXRlZCB3aXRoIHVzZXJwdHIKCSAqLwoJYm9vbCBpc191c2VycHRyOwoKCS8qKgoJICogU2l6ZSBpbiBieXRlcyBvZiB0aGlzIGJ1ZmZlciBhbmQgaXRzIHJlbG9jYXRpb24gZGVzY2VuZGVudHMuCgkgKgoJICogVXNlZCB0byBhdm9pZCBjb3N0bHkgdHJlZSB3YWxraW5nIGluCgkgKiBkcm1faW50ZWxfYnVmbWdyX2NoZWNrX2FwZXJ0dXJlIGluIHRoZSBjb21tb24gY2FzZS4KCSAqLwoJaW50IHJlbG9jX3RyZWVfc2l6ZTsKCgkvKioKCSAqIE51bWJlciBvZiBwb3RlbnRpYWwgZmVuY2UgcmVnaXN0ZXJzIHJlcXVpcmVkIGJ5IHRoaXMgYnVmZmVyIGFuZCBpdHMKCSAqIHJlbG9jYXRpb25zLgoJICovCglpbnQgcmVsb2NfdHJlZV9mZW5jZXM7CgoJLyoqIEZsYWdzIHRoYXQgd2UgbWF5IG5lZWQgdG8gZG8gdGhlIFNXX0ZJTklTSCBpb2N0bCBvbiB1bm1hcC4gKi8KCWJvb2wgbWFwcGVkX2NwdV93cml0ZTsKfTsKCnN0YXRpYyB1bnNpZ25lZCBpbnQKZHJtX2ludGVsX2dlbV9lc3RpbWF0ZV9iYXRjaF9zcGFjZShkcm1faW50ZWxfYm8gKiogYm9fYXJyYXksIGludCBjb3VudCk7CgpzdGF0aWMgdW5zaWduZWQgaW50CmRybV9pbnRlbF9nZW1fY29tcHV0ZV9iYXRjaF9zcGFjZShkcm1faW50ZWxfYm8gKiogYm9fYXJyYXksIGludCBjb3VudCk7CgpzdGF0aWMgaW50CmRybV9pbnRlbF9nZW1fYm9fZ2V0X3RpbGluZyhkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCAqIHRpbGluZ19tb2RlLAoJCQkgICAgdWludDMyX3QgKiBzd2l6emxlX21vZGUpOwoKc3RhdGljIGludApkcm1faW50ZWxfZ2VtX2JvX3NldF90aWxpbmdfaW50ZXJuYWwoZHJtX2ludGVsX2JvICpibywKCQkJCSAgICAgdWludDMyX3QgdGlsaW5nX21vZGUsCgkJCQkgICAgIHVpbnQzMl90IHN0cmlkZSk7CgpzdGF0aWMgdm9pZCBkcm1faW50ZWxfZ2VtX2JvX3VucmVmZXJlbmNlX2xvY2tlZF90aW1lZChkcm1faW50ZWxfYm8gKmJvLAoJCQkJCQkgICAgICB0aW1lX3QgdGltZSk7CgpzdGF0aWMgdm9pZCBkcm1faW50ZWxfZ2VtX2JvX3VucmVmZXJlbmNlKGRybV9pbnRlbF9ibyAqYm8pOwoKc3RhdGljIHZvaWQgZHJtX2ludGVsX2dlbV9ib19mcmVlKGRybV9pbnRlbF9ibyAqYm8pOwoKc3RhdGljIGlubGluZSBkcm1faW50ZWxfYm9fZ2VtICp0b19ib19nZW0oZHJtX2ludGVsX2JvICpibykKewogICAgICAgIHJldHVybiAoZHJtX2ludGVsX2JvX2dlbSAqKWJvOwp9CgpzdGF0aWMgdW5zaWduZWQgbG9uZwpkcm1faW50ZWxfZ2VtX2JvX3RpbGVfc2l6ZShkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSwgdW5zaWduZWQgbG9uZyBzaXplLAoJCQkgICB1aW50MzJfdCAqdGlsaW5nX21vZGUpCnsKCXVuc2lnbmVkIGxvbmcgbWluX3NpemUsIG1heF9zaXplOwoJdW5zaWduZWQgbG9uZyBpOwoKCWlmICgqdGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfTk9ORSkKCQlyZXR1cm4gc2l6ZTsKCgkvKiA5NjUrIGp1c3QgbmVlZCBtdWx0aXBsZXMgb2YgcGFnZSBzaXplIGZvciB0aWxpbmcgKi8KCWlmIChidWZtZ3JfZ2VtLT5nZW4gPj0gNCkKCQlyZXR1cm4gUk9VTkRfVVBfVE8oc2l6ZSwgNDA5Nik7CgoJLyogT2xkZXIgY2hpcHMgbmVlZCBwb3dlcnMgb2YgdHdvLCBvZiBhdCBsZWFzdCA1MTJrIG9yIDFNICovCglpZiAoYnVmbWdyX2dlbS0+Z2VuID09IDMpIHsKCQltaW5fc2l6ZSA9IDEwMjQqMTAyNDsKCQltYXhfc2l6ZSA9IDEyOCoxMDI0KjEwMjQ7Cgl9IGVsc2UgewoJCW1pbl9zaXplID0gNTEyKjEwMjQ7CgkJbWF4X3NpemUgPSA2NCoxMDI0KjEwMjQ7Cgl9CgoJaWYgKHNpemUgPiBtYXhfc2l6ZSkgewoJCSp0aWxpbmdfbW9kZSA9IEk5MTVfVElMSU5HX05PTkU7CgkJcmV0dXJuIHNpemU7Cgl9CgoJLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBldmVyeSBwYWdlIGZvciB0aGUgZmVuY2U/ICovCglpZiAoYnVmbWdyX2dlbS0+aGFzX3JlbGF4ZWRfZmVuY2luZykKCQlyZXR1cm4gUk9VTkRfVVBfVE8oc2l6ZSwgNDA5Nik7CgoJZm9yIChpID0gbWluX3NpemU7IGkgPCBzaXplOyBpIDw8PSAxKQoJCTsKCglyZXR1cm4gaTsKfQoKLyoKICogUm91bmQgYSBnaXZlbiBwaXRjaCB1cCB0byB0aGUgbWluaW11bSByZXF1aXJlZCBmb3IgWCB0aWxpbmcgb24gYQogKiBnaXZlbiBjaGlwLiAgV2UgdXNlIDUxMiBhcyB0aGUgbWluaW11bSB0byBhbGxvdyBmb3IgYSBsYXRlciB0aWxpbmcKICogY2hhbmdlLgogKi8Kc3RhdGljIHVuc2lnbmVkIGxvbmcKZHJtX2ludGVsX2dlbV9ib190aWxlX3BpdGNoKGRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtLAoJCQkgICAgdW5zaWduZWQgbG9uZyBwaXRjaCwgdWludDMyX3QgKnRpbGluZ19tb2RlKQp7Cgl1bnNpZ25lZCBsb25nIHRpbGVfd2lkdGg7Cgl1bnNpZ25lZCBsb25nIGk7CgoJLyogSWYgdW50aWxlZCwgdGhlbiBqdXN0IGFsaWduIGl0IHNvIHRoYXQgd2UgY2FuIGRvIHJlbmRlcmluZwoJICogdG8gaXQgd2l0aCB0aGUgM0QgZW5naW5lLgoJICovCglpZiAoKnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX05PTkUpCgkJcmV0dXJuIEFMSUdOKHBpdGNoLCA2NCk7CgoJaWYgKCp0aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19YCgkJCXx8IChJU185MTUoYnVmbWdyX2dlbS0+cGNpX2RldmljZSkKCQkJICAgICYmICp0aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19ZKSkKCQl0aWxlX3dpZHRoID0gNTEyOwoJZWxzZQoJCXRpbGVfd2lkdGggPSAxMjg7CgoJLyogOTY1IGlzIGZsZXhpYmxlICovCglpZiAoYnVmbWdyX2dlbS0+Z2VuID49IDQpCgkJcmV0dXJuIFJPVU5EX1VQX1RPKHBpdGNoLCB0aWxlX3dpZHRoKTsKCgkvKiBUaGUgb2xkZXIgaGFyZHdhcmUgaGFzIGEgbWF4aW11bSBwaXRjaCBvZiA4MTkyIHdpdGggdGlsZWQKCSAqIHN1cmZhY2VzLCBzbyBmYWxsYmFjayB0byB1bnRpbGVkIGlmIGl0J3MgdG9vIGxhcmdlLgoJICovCglpZiAocGl0Y2ggPiA4MTkyKSB7CgkJKnRpbGluZ19tb2RlID0gSTkxNV9USUxJTkdfTk9ORTsKCQlyZXR1cm4gQUxJR04ocGl0Y2gsIDY0KTsKCX0KCgkvKiBQcmUtOTY1IG5lZWRzIHBvd2VyIG9mIHR3byB0aWxlIHdpZHRoICovCglmb3IgKGkgPSB0aWxlX3dpZHRoOyBpIDwgcGl0Y2g7IGkgPDw9IDEpCgkJOwoKCXJldHVybiBpOwp9CgpzdGF0aWMgc3RydWN0IGRybV9pbnRlbF9nZW1fYm9fYnVja2V0ICoKZHJtX2ludGVsX2dlbV9ib19idWNrZXRfZm9yX3NpemUoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0sCgkJCQkgdW5zaWduZWQgbG9uZyBzaXplKQp7CglpbnQgaTsKCglmb3IgKGkgPSAwOyBpIDwgYnVmbWdyX2dlbS0+bnVtX2J1Y2tldHM7IGkrKykgewoJCXN0cnVjdCBkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldCAqYnVja2V0ID0KCQkgICAgJmJ1Zm1ncl9nZW0tPmNhY2hlX2J1Y2tldFtpXTsKCQlpZiAoYnVja2V0LT5zaXplID49IHNpemUpIHsKCQkJcmV0dXJuIGJ1Y2tldDsKCQl9Cgl9CgoJcmV0dXJuIE5VTEw7Cn0KCnN0YXRpYyB2b2lkCmRybV9pbnRlbF9nZW1fZHVtcF92YWxpZGF0aW9uX2xpc3QoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0pCnsKCWludCBpLCBqOwoKCWZvciAoaSA9IDA7IGkgPCBidWZtZ3JfZ2VtLT5leGVjX2NvdW50OyBpKyspIHsKCQlkcm1faW50ZWxfYm8gKmJvID0gYnVmbWdyX2dlbS0+ZXhlY19ib3NbaV07CgkJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CgoJCWlmIChib19nZW0tPnJlbG9jcyA9PSBOVUxMICYmIGJvX2dlbS0+c29mdHBpbl90YXJnZXQgPT0gTlVMTCkgewoJCQlEQkcoIiUyZDogJWQgJXMoJXMpXG4iLCBpLCBib19nZW0tPmdlbV9oYW5kbGUsCgkJCSAgICBib19nZW0tPmtmbGFncyAmIEVYRUNfT0JKRUNUX1BJTk5FRCA/ICIqIiA6ICIiLAoJCQkgICAgYm9fZ2VtLT5uYW1lKTsKCQkJY29udGludWU7CgkJfQoKCQlmb3IgKGogPSAwOyBqIDwgYm9fZ2VtLT5yZWxvY19jb3VudDsgaisrKSB7CgkJCWRybV9pbnRlbF9ibyAqdGFyZ2V0X2JvID0gYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mb1tqXS5ibzsKCQkJZHJtX2ludGVsX2JvX2dlbSAqdGFyZ2V0X2dlbSA9CgkJCSAgICAoZHJtX2ludGVsX2JvX2dlbSAqKSB0YXJnZXRfYm87CgoJCQlEQkcoIiUyZDogJWQgJXMoJXMpQDB4JTA4eCAlMDh4IC0+ICIKCQkJICAgICIlZCAoJXMpQDB4JTA4eCAlMDh4ICsgMHglMDh4XG4iLAoJCQkgICAgaSwKCQkJICAgIGJvX2dlbS0+Z2VtX2hhbmRsZSwKCQkJICAgIGJvX2dlbS0+a2ZsYWdzICYgRVhFQ19PQkpFQ1RfUElOTkVEID8gIioiIDogIiIsCgkJCSAgICBib19nZW0tPm5hbWUsCgkJCSAgICB1cHBlcl8zMl9iaXRzKGJvX2dlbS0+cmVsb2NzW2pdLm9mZnNldCksCgkJCSAgICBsb3dlcl8zMl9iaXRzKGJvX2dlbS0+cmVsb2NzW2pdLm9mZnNldCksCgkJCSAgICB0YXJnZXRfZ2VtLT5nZW1faGFuZGxlLAoJCQkgICAgdGFyZ2V0X2dlbS0+bmFtZSwKCQkJICAgIHVwcGVyXzMyX2JpdHModGFyZ2V0X2JvLT5vZmZzZXQ2NCksCgkJCSAgICBsb3dlcl8zMl9iaXRzKHRhcmdldF9iby0+b2Zmc2V0NjQpLAoJCQkgICAgYm9fZ2VtLT5yZWxvY3Nbal0uZGVsdGEpOwoJCX0KCgkJZm9yIChqID0gMDsgaiA8IGJvX2dlbS0+c29mdHBpbl90YXJnZXRfY291bnQ7IGorKykgewoJCQlkcm1faW50ZWxfYm8gKnRhcmdldF9ibyA9IGJvX2dlbS0+c29mdHBpbl90YXJnZXRbal07CgkJCWRybV9pbnRlbF9ib19nZW0gKnRhcmdldF9nZW0gPQoJCQkgICAgKGRybV9pbnRlbF9ib19nZW0gKikgdGFyZ2V0X2JvOwoJCQlEQkcoIiUyZDogJWQgJXMoJXMpIC0+ICIKCQkJICAgICIlZCAqKCVzKUAweCUwOHggJTA4eFxuIiwKCQkJICAgIGksCgkJCSAgICBib19nZW0tPmdlbV9oYW5kbGUsCgkJCSAgICBib19nZW0tPmtmbGFncyAmIEVYRUNfT0JKRUNUX1BJTk5FRCA/ICIqIiA6ICIiLAoJCQkgICAgYm9fZ2VtLT5uYW1lLAoJCQkgICAgdGFyZ2V0X2dlbS0+Z2VtX2hhbmRsZSwKCQkJICAgIHRhcmdldF9nZW0tPm5hbWUsCgkJCSAgICB1cHBlcl8zMl9iaXRzKHRhcmdldF9iby0+b2Zmc2V0NjQpLAoJCQkgICAgbG93ZXJfMzJfYml0cyh0YXJnZXRfYm8tPm9mZnNldDY0KSk7CgkJfQoJfQp9CgpzdGF0aWMgaW5saW5lIHZvaWQKZHJtX2ludGVsX2dlbV9ib19yZWZlcmVuY2UoZHJtX2ludGVsX2JvICpibykKewoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CgoJYXRvbWljX2luYygmYm9fZ2VtLT5yZWZjb3VudCk7Cn0KCi8qKgogKiBBZGRzIHRoZSBnaXZlbiBidWZmZXIgdG8gdGhlIGxpc3Qgb2YgYnVmZmVycyB0byBiZSB2YWxpZGF0ZWQgKG1vdmVkIGludG8gdGhlCiAqIGFwcHJvcHJpYXRlIG1lbW9yeSB0eXBlKSB3aXRoIHRoZSBuZXh0IGJhdGNoIHN1Ym1pc3Npb24uCiAqCiAqIElmIGEgYnVmZmVyIGlzIHZhbGlkYXRlZCBtdWx0aXBsZSB0aW1lcyBpbiBhIGJhdGNoIHN1Ym1pc3Npb24sIGl0IGVuZHMgdXAKICogd2l0aCB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBtZW1vcnkgdHlwZSBmbGFncyBhbmQgdGhlIHVuaW9uIG9mIHRoZQogKiBhY2Nlc3MgZmxhZ3MuCiAqLwpzdGF0aWMgdm9pZApkcm1faW50ZWxfYWRkX3ZhbGlkYXRlX2J1ZmZlcihkcm1faW50ZWxfYm8gKmJvKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CglpbnQgaW5kZXg7CgoJaWYgKGJvX2dlbS0+dmFsaWRhdGVfaW5kZXggIT0gLTEpCgkJcmV0dXJuOwoKCS8qIEV4dGVuZCB0aGUgYXJyYXkgb2YgdmFsaWRhdGlvbiBlbnRyaWVzIGFzIG5lY2Vzc2FyeS4gKi8KCWlmIChidWZtZ3JfZ2VtLT5leGVjX2NvdW50ID09IGJ1Zm1ncl9nZW0tPmV4ZWNfc2l6ZSkgewoJCWludCBuZXdfc2l6ZSA9IGJ1Zm1ncl9nZW0tPmV4ZWNfc2l6ZSAqIDI7CgoJCWlmIChuZXdfc2l6ZSA9PSAwKQoJCQluZXdfc2l6ZSA9IDU7CgoJCWJ1Zm1ncl9nZW0tPmV4ZWNfb2JqZWN0cyA9CgkJICAgIHJlYWxsb2MoYnVmbWdyX2dlbS0+ZXhlY19vYmplY3RzLAoJCQkgICAgc2l6ZW9mKCpidWZtZ3JfZ2VtLT5leGVjX29iamVjdHMpICogbmV3X3NpemUpOwoJCWJ1Zm1ncl9nZW0tPmV4ZWNfYm9zID0KCQkgICAgcmVhbGxvYyhidWZtZ3JfZ2VtLT5leGVjX2JvcywKCQkJICAgIHNpemVvZigqYnVmbWdyX2dlbS0+ZXhlY19ib3MpICogbmV3X3NpemUpOwoJCWJ1Zm1ncl9nZW0tPmV4ZWNfc2l6ZSA9IG5ld19zaXplOwoJfQoKCWluZGV4ID0gYnVmbWdyX2dlbS0+ZXhlY19jb3VudDsKCWJvX2dlbS0+dmFsaWRhdGVfaW5kZXggPSBpbmRleDsKCS8qIEZpbGwgaW4gYXJyYXkgZW50cnkgKi8KCWJ1Zm1ncl9nZW0tPmV4ZWNfb2JqZWN0c1tpbmRleF0uaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOwoJYnVmbWdyX2dlbS0+ZXhlY19vYmplY3RzW2luZGV4XS5yZWxvY2F0aW9uX2NvdW50ID0gYm9fZ2VtLT5yZWxvY19jb3VudDsKCWJ1Zm1ncl9nZW0tPmV4ZWNfb2JqZWN0c1tpbmRleF0ucmVsb2NzX3B0ciA9ICh1aW50cHRyX3QpIGJvX2dlbS0+cmVsb2NzOwoJYnVmbWdyX2dlbS0+ZXhlY19vYmplY3RzW2luZGV4XS5hbGlnbm1lbnQgPSBiby0+YWxpZ247CglidWZtZ3JfZ2VtLT5leGVjX29iamVjdHNbaW5kZXhdLm9mZnNldCA9IDA7CglidWZtZ3JfZ2VtLT5leGVjX2Jvc1tpbmRleF0gPSBibzsKCWJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQrKzsKfQoKc3RhdGljIHZvaWQKZHJtX2ludGVsX2FkZF92YWxpZGF0ZV9idWZmZXIyKGRybV9pbnRlbF9ibyAqYm8sIGludCBuZWVkX2ZlbmNlKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKWJvLT5idWZtZ3I7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKWJvOwoJaW50IGluZGV4OwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglmbGFncyA9IDA7CglpZiAobmVlZF9mZW5jZSkKCQlmbGFncyB8PSBFWEVDX09CSkVDVF9ORUVEU19GRU5DRTsKCglpZiAoYm9fZ2VtLT52YWxpZGF0ZV9pbmRleCAhPSAtMSkgewoJCWJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHNbYm9fZ2VtLT52YWxpZGF0ZV9pbmRleF0uZmxhZ3MgfD0gZmxhZ3M7CgkJcmV0dXJuOwoJfQoKCS8qIEV4dGVuZCB0aGUgYXJyYXkgb2YgdmFsaWRhdGlvbiBlbnRyaWVzIGFzIG5lY2Vzc2FyeS4gKi8KCWlmIChidWZtZ3JfZ2VtLT5leGVjX2NvdW50ID09IGJ1Zm1ncl9nZW0tPmV4ZWNfc2l6ZSkgewoJCWludCBuZXdfc2l6ZSA9IGJ1Zm1ncl9nZW0tPmV4ZWNfc2l6ZSAqIDI7CgoJCWlmIChuZXdfc2l6ZSA9PSAwKQoJCQluZXdfc2l6ZSA9IDU7CgoJCWJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHMgPQoJCQlyZWFsbG9jKGJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHMsCgkJCQlzaXplb2YoKmJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHMpICogbmV3X3NpemUpOwoJCWJ1Zm1ncl9nZW0tPmV4ZWNfYm9zID0KCQkJcmVhbGxvYyhidWZtZ3JfZ2VtLT5leGVjX2JvcywKCQkJCXNpemVvZigqYnVmbWdyX2dlbS0+ZXhlY19ib3MpICogbmV3X3NpemUpOwoJCWJ1Zm1ncl9nZW0tPmV4ZWNfc2l6ZSA9IG5ld19zaXplOwoJfQoKCWluZGV4ID0gYnVmbWdyX2dlbS0+ZXhlY19jb3VudDsKCWJvX2dlbS0+dmFsaWRhdGVfaW5kZXggPSBpbmRleDsKCS8qIEZpbGwgaW4gYXJyYXkgZW50cnkgKi8KCWJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHNbaW5kZXhdLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKCWJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHNbaW5kZXhdLnJlbG9jYXRpb25fY291bnQgPSBib19nZW0tPnJlbG9jX2NvdW50OwoJYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0c1tpbmRleF0ucmVsb2NzX3B0ciA9ICh1aW50cHRyX3QpYm9fZ2VtLT5yZWxvY3M7CglidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzW2luZGV4XS5hbGlnbm1lbnQgPSBiby0+YWxpZ247CglidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzW2luZGV4XS5vZmZzZXQgPSBiby0+b2Zmc2V0NjQ7CglidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzW2luZGV4XS5mbGFncyA9IGJvX2dlbS0+a2ZsYWdzIHwgZmxhZ3M7CglidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzW2luZGV4XS5yc3ZkMSA9IDA7CglidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzW2luZGV4XS5yc3ZkMiA9IDA7CglidWZtZ3JfZ2VtLT5leGVjX2Jvc1tpbmRleF0gPSBibzsKCWJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQrKzsKfQoKI2RlZmluZSBSRUxPQ19CVUZfU0laRSh4KSAoKEk5MTVfUkVMT0NfSEVBREVSICsgeCAqIEk5MTVfUkVMT0MwX1NUUklERSkgKiBcCglzaXplb2YodWludDMyX3QpKQoKc3RhdGljIHZvaWQKZHJtX2ludGVsX2JvX2dlbV9zZXRfaW5fYXBlcnR1cmVfc2l6ZShkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSwKCQkJCSAgICAgIGRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSwKCQkJCSAgICAgIHVuc2lnbmVkIGludCBhbGlnbm1lbnQpCnsKCXVuc2lnbmVkIGludCBzaXplOwoKCWFzc2VydCghYm9fZ2VtLT51c2VkX2FzX3JlbG9jX3RhcmdldCk7CgoJLyogVGhlIG9sZGVyIGNoaXBzZXRzIGFyZSBmYXItbGVzcyBmbGV4aWJsZSBpbiB0ZXJtcyBvZiB0aWxpbmcsCgkgKiBhbmQgcmVxdWlyZSB0aWxlZCBidWZmZXIgdG8gYmUgc2l6ZSBhbGlnbmVkIGluIHRoZSBhcGVydHVyZS4KCSAqIFRoaXMgbWVhbnMgdGhhdCBpbiB0aGUgd29yc3QgcG9zc2libGUgY2FzZSB3ZSB3aWxsIG5lZWQgYSBob2xlCgkgKiB0d2ljZSBhcyBsYXJnZSBhcyB0aGUgb2JqZWN0IGluIG9yZGVyIGZvciBpdCB0byBmaXQgaW50byB0aGUKCSAqIGFwZXJ0dXJlLiBPcHRpbWFsIHBhY2tpbmcgaXMgZm9yIHdpbXBzLgoJICovCglzaXplID0gYm9fZ2VtLT5iby5zaXplOwoJaWYgKGJ1Zm1ncl9nZW0tPmdlbiA8IDQgJiYgYm9fZ2VtLT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKSB7CgkJdW5zaWduZWQgaW50IG1pbl9zaXplOwoKCQlpZiAoYnVmbWdyX2dlbS0+aGFzX3JlbGF4ZWRfZmVuY2luZykgewoJCQlpZiAoYnVmbWdyX2dlbS0+Z2VuID09IDMpCgkJCQltaW5fc2l6ZSA9IDEwMjQqMTAyNDsKCQkJZWxzZQoJCQkJbWluX3NpemUgPSA1MTIqMTAyNDsKCgkJCXdoaWxlIChtaW5fc2l6ZSA8IHNpemUpCgkJCQltaW5fc2l6ZSAqPSAyOwoJCX0gZWxzZQoJCQltaW5fc2l6ZSA9IHNpemU7CgoJCS8qIEFjY291bnQgZm9yIHdvcnN0LWNhc2UgYWxpZ25tZW50LiAqLwoJCWFsaWdubWVudCA9IE1BWDIoYWxpZ25tZW50LCBtaW5fc2l6ZSk7Cgl9CgoJYm9fZ2VtLT5yZWxvY190cmVlX3NpemUgPSBzaXplICsgYWxpZ25tZW50Owp9CgpzdGF0aWMgaW50CmRybV9pbnRlbF9zZXR1cF9yZWxvY19saXN0KGRybV9pbnRlbF9ibyAqYm8pCnsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKCXVuc2lnbmVkIGludCBtYXhfcmVsb2NzID0gYnVmbWdyX2dlbS0+bWF4X3JlbG9jczsKCglpZiAoYm8tPnNpemUgLyA0IDwgbWF4X3JlbG9jcykKCQltYXhfcmVsb2NzID0gYm8tPnNpemUgLyA0OwoKCWJvX2dlbS0+cmVsb2NzID0gbWFsbG9jKG1heF9yZWxvY3MgKgoJCQkJc2l6ZW9mKHN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSkpOwoJYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mbyA9IG1hbGxvYyhtYXhfcmVsb2NzICoKCQkJCQkgICBzaXplb2YoZHJtX2ludGVsX3JlbG9jX3RhcmdldCkpOwoJaWYgKGJvX2dlbS0+cmVsb2NzID09IE5VTEwgfHwgYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mbyA9PSBOVUxMKSB7CgkJYm9fZ2VtLT5oYXNfZXJyb3IgPSB0cnVlOwoKCQlmcmVlIChib19nZW0tPnJlbG9jcyk7CgkJYm9fZ2VtLT5yZWxvY3MgPSBOVUxMOwoKCQlmcmVlIChib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvKTsKCQlib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvID0gTlVMTDsKCgkJcmV0dXJuIDE7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKZHJtX2ludGVsX2dlbV9ib19idXN5KGRybV9pbnRlbF9ibyAqYm8pCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCXN0cnVjdCBkcm1faTkxNV9nZW1fYnVzeSBidXN5OwoJaW50IHJldDsKCglpZiAoYm9fZ2VtLT5yZXVzYWJsZSAmJiBib19nZW0tPmlkbGUpCgkJcmV0dXJuIGZhbHNlOwoKCW1lbWNsZWFyKGJ1c3kpOwoJYnVzeS5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CgoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFTV9CVVNZLCAmYnVzeSk7CglpZiAocmV0ID09IDApIHsKCQlib19nZW0tPmlkbGUgPSAhYnVzeS5idXN5OwoJCXJldHVybiBidXN5LmJ1c3k7Cgl9IGVsc2UgewoJCXJldHVybiBmYWxzZTsKCX0KfQoKc3RhdGljIGludApkcm1faW50ZWxfZ2VtX2JvX21hZHZpc2VfaW50ZXJuYWwoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0sCgkJCQkgIGRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSwgaW50IHN0YXRlKQp7CglzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21hZHZpc2UgbWFkdjsKCgltZW1jbGVhcihtYWR2KTsKCW1hZHYuaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOwoJbWFkdi5tYWR2ID0gc3RhdGU7CgltYWR2LnJldGFpbmVkID0gMTsKCWRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfSTkxNV9HRU1fTUFEVklTRSwgJm1hZHYpOwoKCXJldHVybiBtYWR2LnJldGFpbmVkOwp9CgpzdGF0aWMgaW50CmRybV9pbnRlbF9nZW1fYm9fbWFkdmlzZShkcm1faW50ZWxfYm8gKmJvLCBpbnQgbWFkdikKewoJcmV0dXJuIGRybV9pbnRlbF9nZW1fYm9fbWFkdmlzZV9pbnRlcm5hbAoJCSgoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1nciwKCQkgKGRybV9pbnRlbF9ib19nZW0gKikgYm8sCgkJIG1hZHYpOwp9CgovKiBkcm9wIHRoZSBvbGRlc3QgZW50cmllcyB0aGF0IGhhdmUgYmVlbiBwdXJnZWQgYnkgdGhlIGtlcm5lbCAqLwpzdGF0aWMgdm9pZApkcm1faW50ZWxfZ2VtX2JvX2NhY2hlX3B1cmdlX2J1Y2tldChkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSwKCQkJCSAgICBzdHJ1Y3QgZHJtX2ludGVsX2dlbV9ib19idWNrZXQgKmJ1Y2tldCkKewoJd2hpbGUgKCFEUk1MSVNURU1QVFkoJmJ1Y2tldC0+aGVhZCkpIHsKCQlkcm1faW50ZWxfYm9fZ2VtICpib19nZW07CgoJCWJvX2dlbSA9IERSTUxJU1RFTlRSWShkcm1faW50ZWxfYm9fZ2VtLAoJCQkJICAgICAgYnVja2V0LT5oZWFkLm5leHQsIGhlYWQpOwoJCWlmIChkcm1faW50ZWxfZ2VtX2JvX21hZHZpc2VfaW50ZXJuYWwKCQkgICAgKGJ1Zm1ncl9nZW0sIGJvX2dlbSwgSTkxNV9NQURWX0RPTlRORUVEKSkKCQkJYnJlYWs7CgoJCURSTUxJU1RERUwoJmJvX2dlbS0+aGVhZCk7CgkJZHJtX2ludGVsX2dlbV9ib19mcmVlKCZib19nZW0tPmJvKTsKCX0KfQoKc3RhdGljIGRybV9pbnRlbF9ibyAqCmRybV9pbnRlbF9nZW1fYm9fYWxsb2NfaW50ZXJuYWwoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAoJCQkJY29uc3QgY2hhciAqbmFtZSwKCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwKCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsCgkJCQl1aW50MzJfdCB0aWxpbmdfbW9kZSwKCQkJCXVuc2lnbmVkIGxvbmcgc3RyaWRlLAoJCQkJdW5zaWduZWQgaW50IGFsaWdubWVudCkKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtOwoJdW5zaWduZWQgaW50IHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7CglpbnQgcmV0OwoJc3RydWN0IGRybV9pbnRlbF9nZW1fYm9fYnVja2V0ICpidWNrZXQ7Cglib29sIGFsbG9jX2Zyb21fY2FjaGU7Cgl1bnNpZ25lZCBsb25nIGJvX3NpemU7Cglib29sIGZvcl9yZW5kZXIgPSBmYWxzZTsKCglpZiAoZmxhZ3MgJiBCT19BTExPQ19GT1JfUkVOREVSKQoJCWZvcl9yZW5kZXIgPSB0cnVlOwoKCS8qIFJvdW5kIHRoZSBhbGxvY2F0ZWQgc2l6ZSB1cCB0byBhIHBvd2VyIG9mIHR3byBudW1iZXIgb2YgcGFnZXMuICovCglidWNrZXQgPSBkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldF9mb3Jfc2l6ZShidWZtZ3JfZ2VtLCBzaXplKTsKCgkvKiBJZiB3ZSBkb24ndCBoYXZlIGNhY2hpbmcgYXQgdGhpcyBzaXplLCBkb24ndCBhY3R1YWxseSByb3VuZCB0aGUKCSAqIGFsbG9jYXRpb24gdXAuCgkgKi8KCWlmIChidWNrZXQgPT0gTlVMTCkgewoJCWJvX3NpemUgPSBzaXplOwoJCWlmIChib19zaXplIDwgcGFnZV9zaXplKQoJCQlib19zaXplID0gcGFnZV9zaXplOwoJfSBlbHNlIHsKCQlib19zaXplID0gYnVja2V0LT5zaXplOwoJfQoKCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CgkvKiBHZXQgYSBidWZmZXIgb3V0IG9mIHRoZSBjYWNoZSBpZiBhdmFpbGFibGUgKi8KcmV0cnk6CglhbGxvY19mcm9tX2NhY2hlID0gZmFsc2U7CglpZiAoYnVja2V0ICE9IE5VTEwgJiYgIURSTUxJU1RFTVBUWSgmYnVja2V0LT5oZWFkKSkgewoJCWlmIChmb3JfcmVuZGVyKSB7CgkJCS8qIEFsbG9jYXRlIG5ldyByZW5kZXItdGFyZ2V0IEJPcyBmcm9tIHRoZSB0YWlsIChNUlUpCgkJCSAqIG9mIHRoZSBsaXN0LCBhcyBpdCB3aWxsIGxpa2VseSBiZSBob3QgaW4gdGhlIEdQVQoJCQkgKiBjYWNoZSBhbmQgaW4gdGhlIGFwZXJ0dXJlIGZvciB1cy4KCQkJICovCgkJCWJvX2dlbSA9IERSTUxJU1RFTlRSWShkcm1faW50ZWxfYm9fZ2VtLAoJCQkJCSAgICAgIGJ1Y2tldC0+aGVhZC5wcmV2LCBoZWFkKTsKCQkJRFJNTElTVERFTCgmYm9fZ2VtLT5oZWFkKTsKCQkJYWxsb2NfZnJvbV9jYWNoZSA9IHRydWU7CgkJCWJvX2dlbS0+Ym8uYWxpZ24gPSBhbGlnbm1lbnQ7CgkJfSBlbHNlIHsKCQkJYXNzZXJ0KGFsaWdubWVudCA9PSAwKTsKCQkJLyogRm9yIG5vbi1yZW5kZXItdGFyZ2V0IEJPcyAod2hlcmUgd2UncmUgcHJvYmFibHkKCQkJICogZ29pbmcgdG8gbWFwIGl0IGZpcnN0IHRoaW5nIGluIG9yZGVyIHRvIGZpbGwgaXQKCQkJICogd2l0aCBkYXRhKSwgY2hlY2sgaWYgdGhlIGxhc3QgQk8gaW4gdGhlIGNhY2hlIGlzCgkJCSAqIHVuYnVzeSwgYW5kIG9ubHkgcmV1c2UgaW4gdGhhdCBjYXNlLiBPdGhlcndpc2UsCgkJCSAqIGFsbG9jYXRpbmcgYSBuZXcgYnVmZmVyIGlzIHByb2JhYmx5IGZhc3RlciB0aGFuCgkJCSAqIHdhaXRpbmcgZm9yIHRoZSBHUFUgdG8gZmluaXNoLgoJCQkgKi8KCQkJYm9fZ2VtID0gRFJNTElTVEVOVFJZKGRybV9pbnRlbF9ib19nZW0sCgkJCQkJICAgICAgYnVja2V0LT5oZWFkLm5leHQsIGhlYWQpOwoJCQlpZiAoIWRybV9pbnRlbF9nZW1fYm9fYnVzeSgmYm9fZ2VtLT5ibykpIHsKCQkJCWFsbG9jX2Zyb21fY2FjaGUgPSB0cnVlOwoJCQkJRFJNTElTVERFTCgmYm9fZ2VtLT5oZWFkKTsKCQkJfQoJCX0KCgkJaWYgKGFsbG9jX2Zyb21fY2FjaGUpIHsKCQkJaWYgKCFkcm1faW50ZWxfZ2VtX2JvX21hZHZpc2VfaW50ZXJuYWwKCQkJICAgIChidWZtZ3JfZ2VtLCBib19nZW0sIEk5MTVfTUFEVl9XSUxMTkVFRCkpIHsKCQkJCWRybV9pbnRlbF9nZW1fYm9fZnJlZSgmYm9fZ2VtLT5ibyk7CgkJCQlkcm1faW50ZWxfZ2VtX2JvX2NhY2hlX3B1cmdlX2J1Y2tldChidWZtZ3JfZ2VtLAoJCQkJCQkJCSAgICBidWNrZXQpOwoJCQkJZ290byByZXRyeTsKCQkJfQoKCQkJaWYgKGRybV9pbnRlbF9nZW1fYm9fc2V0X3RpbGluZ19pbnRlcm5hbCgmYm9fZ2VtLT5ibywKCQkJCQkJCQkgdGlsaW5nX21vZGUsCgkJCQkJCQkJIHN0cmlkZSkpIHsKCQkJCWRybV9pbnRlbF9nZW1fYm9fZnJlZSgmYm9fZ2VtLT5ibyk7CgkJCQlnb3RvIHJldHJ5OwoJCQl9CgkJfQoJfQoKCWlmICghYWxsb2NfZnJvbV9jYWNoZSkgewoJCXN0cnVjdCBkcm1faTkxNV9nZW1fY3JlYXRlIGNyZWF0ZTsKCgkJYm9fZ2VtID0gY2FsbG9jKDEsIHNpemVvZigqYm9fZ2VtKSk7CgkJaWYgKCFib19nZW0pCgkJCWdvdG8gZXJyOwoKCQkvKiBkcm1faW50ZWxfZ2VtX2JvX2ZyZWUgY2FsbHMgRFJNTElTVERFTCgpIGZvciBhbiB1bmluaXRpYWxpemVkCgkJICAgbGlzdCAodm1hX2xpc3QpLCBzbyBiZXR0ZXIgc2V0IHRoZSBsaXN0IGhlYWQgaGVyZSAqLwoJCURSTUlOSVRMSVNUSEVBRCgmYm9fZ2VtLT52bWFfbGlzdCk7CgoJCWJvX2dlbS0+Ym8uc2l6ZSA9IGJvX3NpemU7CgoJCW1lbWNsZWFyKGNyZWF0ZSk7CgkJY3JlYXRlLnNpemUgPSBib19zaXplOwoKCQlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKCQkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9DUkVBVEUsCgkJCSAgICAgICAmY3JlYXRlKTsKCQlpZiAocmV0ICE9IDApIHsKCQkJZnJlZShib19nZW0pOwoJCQlnb3RvIGVycjsKCQl9CgoJCWJvX2dlbS0+Z2VtX2hhbmRsZSA9IGNyZWF0ZS5oYW5kbGU7CgkJSEFTSF9BREQoaGFuZGxlX2hoLCBidWZtZ3JfZ2VtLT5oYW5kbGVfdGFibGUsCgkJCSBnZW1faGFuZGxlLCBzaXplb2YoYm9fZ2VtLT5nZW1faGFuZGxlKSwKCQkJIGJvX2dlbSk7CgoJCWJvX2dlbS0+Ym8uaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOwoJCWJvX2dlbS0+Ym8uYnVmbWdyID0gYnVmbWdyOwoJCWJvX2dlbS0+Ym8uYWxpZ24gPSBhbGlnbm1lbnQ7CgoJCWJvX2dlbS0+dGlsaW5nX21vZGUgPSBJOTE1X1RJTElOR19OT05FOwoJCWJvX2dlbS0+c3dpenpsZV9tb2RlID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7CgkJYm9fZ2VtLT5zdHJpZGUgPSAwOwoKCQlpZiAoZHJtX2ludGVsX2dlbV9ib19zZXRfdGlsaW5nX2ludGVybmFsKCZib19nZW0tPmJvLAoJCQkJCQkJIHRpbGluZ19tb2RlLAoJCQkJCQkJIHN0cmlkZSkpCgkJCWdvdG8gZXJyX2ZyZWU7Cgl9CgoJYm9fZ2VtLT5uYW1lID0gbmFtZTsKCWF0b21pY19zZXQoJmJvX2dlbS0+cmVmY291bnQsIDEpOwoJYm9fZ2VtLT52YWxpZGF0ZV9pbmRleCA9IC0xOwoJYm9fZ2VtLT5yZWxvY190cmVlX2ZlbmNlcyA9IDA7Cglib19nZW0tPnVzZWRfYXNfcmVsb2NfdGFyZ2V0ID0gZmFsc2U7Cglib19nZW0tPmhhc19lcnJvciA9IGZhbHNlOwoJYm9fZ2VtLT5yZXVzYWJsZSA9IHRydWU7CgoJZHJtX2ludGVsX2JvX2dlbV9zZXRfaW5fYXBlcnR1cmVfc2l6ZShidWZtZ3JfZ2VtLCBib19nZW0sIGFsaWdubWVudCk7CglwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CgoJREJHKCJib19jcmVhdGU6IGJ1ZiAlZCAoJXMpICVsZGJcbiIsCgkgICAgYm9fZ2VtLT5nZW1faGFuZGxlLCBib19nZW0tPm5hbWUsIHNpemUpOwoKCXJldHVybiAmYm9fZ2VtLT5ibzsKCmVycl9mcmVlOgoJZHJtX2ludGVsX2dlbV9ib19mcmVlKCZib19nZW0tPmJvKTsKZXJyOgoJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoJcmV0dXJuIE5VTEw7Cn0KCnN0YXRpYyBkcm1faW50ZWxfYm8gKgpkcm1faW50ZWxfZ2VtX2JvX2FsbG9jX2Zvcl9yZW5kZXIoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAoJCQkJICBjb25zdCBjaGFyICpuYW1lLAoJCQkJICB1bnNpZ25lZCBsb25nIHNpemUsCgkJCQkgIHVuc2lnbmVkIGludCBhbGlnbm1lbnQpCnsKCXJldHVybiBkcm1faW50ZWxfZ2VtX2JvX2FsbG9jX2ludGVybmFsKGJ1Zm1nciwgbmFtZSwgc2l6ZSwKCQkJCQkgICAgICAgQk9fQUxMT0NfRk9SX1JFTkRFUiwKCQkJCQkgICAgICAgSTkxNV9USUxJTkdfTk9ORSwgMCwKCQkJCQkgICAgICAgYWxpZ25tZW50KTsKfQoKc3RhdGljIGRybV9pbnRlbF9ibyAqCmRybV9pbnRlbF9nZW1fYm9fYWxsb2MoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAoJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLAoJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsCgkJICAgICAgIHVuc2lnbmVkIGludCBhbGlnbm1lbnQpCnsKCXJldHVybiBkcm1faW50ZWxfZ2VtX2JvX2FsbG9jX2ludGVybmFsKGJ1Zm1nciwgbmFtZSwgc2l6ZSwgMCwKCQkJCQkgICAgICAgSTkxNV9USUxJTkdfTk9ORSwgMCwgMCk7Cn0KCnN0YXRpYyBkcm1faW50ZWxfYm8gKgpkcm1faW50ZWxfZ2VtX2JvX2FsbG9jX3RpbGVkKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwgY29uc3QgY2hhciAqbmFtZSwKCQkJICAgICBpbnQgeCwgaW50IHksIGludCBjcHAsIHVpbnQzMl90ICp0aWxpbmdfbW9kZSwKCQkJICAgICB1bnNpZ25lZCBsb25nICpwaXRjaCwgdW5zaWduZWQgbG9uZyBmbGFncykKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKilidWZtZ3I7Cgl1bnNpZ25lZCBsb25nIHNpemUsIHN0cmlkZTsKCXVpbnQzMl90IHRpbGluZzsKCglkbyB7CgkJdW5zaWduZWQgbG9uZyBhbGlnbmVkX3ksIGhlaWdodF9hbGlnbm1lbnQ7CgoJCXRpbGluZyA9ICp0aWxpbmdfbW9kZTsKCgkJLyogSWYgd2UncmUgdGlsZWQsIG91ciBhbGxvY2F0aW9ucyBhcmUgaW4gOCBvciAzMi1yb3cgYmxvY2tzLAoJCSAqIHNvIGZhaWx1cmUgdG8gYWxpZ24gb3VyIGhlaWdodCBtZWFucyB0aGF0IHdlIHdvbid0IGFsbG9jYXRlCgkJICogZW5vdWdoIHBhZ2VzLgoJCSAqCgkJICogSWYgd2UncmUgdW50aWxlZCwgd2Ugc3RpbGwgaGF2ZSB0byBhbGlnbiB0byAyIHJvd3MgaGlnaAoJCSAqIGJlY2F1c2UgdGhlIGRhdGEgcG9ydCBhY2Nlc3NlcyAyeDIgYmxvY2tzIGV2ZW4gaWYgdGhlCgkJICogYm90dG9tIHJvdyBpc24ndCB0byBiZSByZW5kZXJlZCwgc28gZmFpbHVyZSB0byBhbGlnbiBtZWFucwoJCSAqIHdlIGNvdWxkIHdhbGsgb2ZmIHRoZSBlbmQgb2YgdGhlIEdUVCBhbmQgZmF1bHQuICBUaGlzIGlzCgkJICogZG9jdW1lbnRlZCBvbiA5NjUsIGFuZCBtYXkgYmUgdGhlIGNhc2Ugb24gb2xkZXIgY2hpcHNldHMKCQkgKiB0b28gc28gd2UgdHJ5IHRvIGJlIGNhcmVmdWwuCgkJICovCgkJYWxpZ25lZF95ID0geTsKCQloZWlnaHRfYWxpZ25tZW50ID0gMjsKCgkJaWYgKChidWZtZ3JfZ2VtLT5nZW4gPT0gMikgJiYgdGlsaW5nICE9IEk5MTVfVElMSU5HX05PTkUpCgkJCWhlaWdodF9hbGlnbm1lbnQgPSAxNjsKCQllbHNlIGlmICh0aWxpbmcgPT0gSTkxNV9USUxJTkdfWAoJCQl8fCAoSVNfOTE1KGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpCgkJCSAgICAmJiB0aWxpbmcgPT0gSTkxNV9USUxJTkdfWSkpCgkJCWhlaWdodF9hbGlnbm1lbnQgPSA4OwoJCWVsc2UgaWYgKHRpbGluZyA9PSBJOTE1X1RJTElOR19ZKQoJCQloZWlnaHRfYWxpZ25tZW50ID0gMzI7CgkJYWxpZ25lZF95ID0gQUxJR04oeSwgaGVpZ2h0X2FsaWdubWVudCk7CgoJCXN0cmlkZSA9IHggKiBjcHA7CgkJc3RyaWRlID0gZHJtX2ludGVsX2dlbV9ib190aWxlX3BpdGNoKGJ1Zm1ncl9nZW0sIHN0cmlkZSwgdGlsaW5nX21vZGUpOwoJCXNpemUgPSBzdHJpZGUgKiBhbGlnbmVkX3k7CgkJc2l6ZSA9IGRybV9pbnRlbF9nZW1fYm9fdGlsZV9zaXplKGJ1Zm1ncl9nZW0sIHNpemUsIHRpbGluZ19tb2RlKTsKCX0gd2hpbGUgKCp0aWxpbmdfbW9kZSAhPSB0aWxpbmcpOwoJKnBpdGNoID0gc3RyaWRlOwoKCWlmICh0aWxpbmcgPT0gSTkxNV9USUxJTkdfTk9ORSkKCQlzdHJpZGUgPSAwOwoKCXJldHVybiBkcm1faW50ZWxfZ2VtX2JvX2FsbG9jX2ludGVybmFsKGJ1Zm1nciwgbmFtZSwgc2l6ZSwgZmxhZ3MsCgkJCQkJICAgICAgIHRpbGluZywgc3RyaWRlLCAwKTsKfQoKc3RhdGljIGRybV9pbnRlbF9ibyAqCmRybV9pbnRlbF9nZW1fYm9fYWxsb2NfdXNlcnB0cihkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCgkJCQljb25zdCBjaGFyICpuYW1lLAoJCQkJdm9pZCAqYWRkciwKCQkJCXVpbnQzMl90IHRpbGluZ19tb2RlLAoJCQkJdWludDMyX3Qgc3RyaWRlLAoJCQkJdW5zaWduZWQgbG9uZyBzaXplLAoJCQkJdW5zaWduZWQgbG9uZyBmbGFncykKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtOwoJaW50IHJldDsKCXN0cnVjdCBkcm1faTkxNV9nZW1fdXNlcnB0ciB1c2VycHRyOwoKCS8qIFRpbGluZyB3aXRoIHVzZXJwdHIgc3VyZmFjZXMgaXMgbm90IHN1cHBvcnRlZAoJICogb24gYWxsIGhhcmR3YXJlIHNvIHJlZnVzZSBpdCBmb3IgdGltZSBiZWluZy4KCSAqLwoJaWYgKHRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX05PTkUpCgkJcmV0dXJuIE5VTEw7CgoJYm9fZ2VtID0gY2FsbG9jKDEsIHNpemVvZigqYm9fZ2VtKSk7CglpZiAoIWJvX2dlbSkKCQlyZXR1cm4gTlVMTDsKCglhdG9taWNfc2V0KCZib19nZW0tPnJlZmNvdW50LCAxKTsKCURSTUlOSVRMSVNUSEVBRCgmYm9fZ2VtLT52bWFfbGlzdCk7CgoJYm9fZ2VtLT5iby5zaXplID0gc2l6ZTsKCgltZW1jbGVhcih1c2VycHRyKTsKCXVzZXJwdHIudXNlcl9wdHIgPSAoX191NjQpKCh1bnNpZ25lZCBsb25nKWFkZHIpOwoJdXNlcnB0ci51c2VyX3NpemUgPSBzaXplOwoJdXNlcnB0ci5mbGFncyA9IGZsYWdzOwoKCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAoJCQlEUk1fSU9DVExfSTkxNV9HRU1fVVNFUlBUUiwKCQkJJnVzZXJwdHIpOwoJaWYgKHJldCAhPSAwKSB7CgkJREJHKCJib19jcmVhdGVfdXNlcnB0cjogIgoJCSAgICAiaW9jdGwgZmFpbGVkIHdpdGggdXNlciBwdHIgJXAgc2l6ZSAweCVseCwgIgoJCSAgICAidXNlciBmbGFncyAweCVseFxuIiwgYWRkciwgc2l6ZSwgZmxhZ3MpOwoJCWZyZWUoYm9fZ2VtKTsKCQlyZXR1cm4gTlVMTDsKCX0KCglwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoKCWJvX2dlbS0+Z2VtX2hhbmRsZSA9IHVzZXJwdHIuaGFuZGxlOwoJYm9fZ2VtLT5iby5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7Cglib19nZW0tPmJvLmJ1Zm1nciAgICA9IGJ1Zm1ncjsKCWJvX2dlbS0+aXNfdXNlcnB0ciAgID0gdHJ1ZTsKCWJvX2dlbS0+Ym8udmlydHVhbCAgID0gYWRkcjsKCS8qIFNhdmUgdGhlIGFkZHJlc3MgcHJvdmlkZWQgYnkgdXNlciAqLwoJYm9fZ2VtLT51c2VyX3ZpcnR1YWwgPSBhZGRyOwoJYm9fZ2VtLT50aWxpbmdfbW9kZSAgPSBJOTE1X1RJTElOR19OT05FOwoJYm9fZ2VtLT5zd2l6emxlX21vZGUgPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKCWJvX2dlbS0+c3RyaWRlICAgICAgID0gMDsKCglIQVNIX0FERChoYW5kbGVfaGgsIGJ1Zm1ncl9nZW0tPmhhbmRsZV90YWJsZSwKCQkgZ2VtX2hhbmRsZSwgc2l6ZW9mKGJvX2dlbS0+Z2VtX2hhbmRsZSksCgkJIGJvX2dlbSk7CgoJYm9fZ2VtLT5uYW1lID0gbmFtZTsKCWJvX2dlbS0+dmFsaWRhdGVfaW5kZXggPSAtMTsKCWJvX2dlbS0+cmVsb2NfdHJlZV9mZW5jZXMgPSAwOwoJYm9fZ2VtLT51c2VkX2FzX3JlbG9jX3RhcmdldCA9IGZhbHNlOwoJYm9fZ2VtLT5oYXNfZXJyb3IgPSBmYWxzZTsKCWJvX2dlbS0+cmV1c2FibGUgPSBmYWxzZTsKCglkcm1faW50ZWxfYm9fZ2VtX3NldF9pbl9hcGVydHVyZV9zaXplKGJ1Zm1ncl9nZW0sIGJvX2dlbSwgMCk7CglwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CgoJREJHKCJib19jcmVhdGVfdXNlcnB0cjogIgoJICAgICJwdHIgJXAgYnVmICVkICglcykgc2l6ZSAlbGRiLCBzdHJpZGUgMHgleCwgdGlsZSBtb2RlICVkXG4iLAoJCWFkZHIsIGJvX2dlbS0+Z2VtX2hhbmRsZSwgYm9fZ2VtLT5uYW1lLAoJCXNpemUsIHN0cmlkZSwgdGlsaW5nX21vZGUpOwoKCXJldHVybiAmYm9fZ2VtLT5ibzsKfQoKc3RhdGljIGJvb2wKaGFzX3VzZXJwdHIoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0pCnsKCWludCByZXQ7Cgl2b2lkICpwdHI7Cglsb25nIHBnc3o7CglzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3VzZXJwdHIgdXNlcnB0cjsKCglwZ3N6ID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOwoJYXNzZXJ0KHBnc3ogPiAwKTsKCglyZXQgPSBwb3NpeF9tZW1hbGlnbigmcHRyLCBwZ3N6LCBwZ3N6KTsKCWlmIChyZXQpIHsKCQlEQkcoIkZhaWxlZCB0byBnZXQgYSBwYWdlICglbGQpIGZvciB1c2VycHRyIGRldGVjdGlvbiFcbiIsCgkJCXBnc3opOwoJCXJldHVybiBmYWxzZTsKCX0KCgltZW1jbGVhcih1c2VycHRyKTsKCXVzZXJwdHIudXNlcl9wdHIgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpcHRyOwoJdXNlcnB0ci51c2VyX3NpemUgPSBwZ3N6OwoKcmV0cnk6CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VNX1VTRVJQVFIsICZ1c2VycHRyKTsKCWlmIChyZXQpIHsKCQlpZiAoZXJybm8gPT0gRU5PREVWICYmIHVzZXJwdHIuZmxhZ3MgPT0gMCkgewoJCQl1c2VycHRyLmZsYWdzID0gSTkxNV9VU0VSUFRSX1VOU1lOQ0hST05JWkVEOwoJCQlnb3RvIHJldHJ5OwoJCX0KCQlmcmVlKHB0cik7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qIFdlIGRvbid0IHJlbGVhc2UgdGhlIHVzZXJwdHIgYm8gaGVyZSBhcyB3ZSB3YW50IHRvIGtlZXAgdGhlCgkgKiBrZXJuZWwgbW0gdHJhY2tpbmcgYWxpdmUgZm9yIG91ciBsaWZldGltZS4gVGhlIGZpcnN0IHRpbWUgd2UKCSAqIGNyZWF0ZSBhIHVzZXJwdHIgb2JqZWN0IHRoZSBrZXJuZWwgaGFzIHRvIGluc3RhbGwgYSBtbXVfbm90aWZlcgoJICogd2hpY2ggaXMgYSBoZWF2eXdlaWdodCBvcGVyYXRpb24gKGUuZy4gaXQgcmVxdWlyZXMgdGFraW5nIGFsbAoJICogbW1fbG9ja3MgYW5kIHN0b3BfbWFjaGluZSgpKS4KCSAqLwoKCWJ1Zm1ncl9nZW0tPnVzZXJwdHJfYWN0aXZlLnB0ciA9IHB0cjsKCWJ1Zm1ncl9nZW0tPnVzZXJwdHJfYWN0aXZlLmhhbmRsZSA9IHVzZXJwdHIuaGFuZGxlOwoKCXJldHVybiB0cnVlOwp9CgpzdGF0aWMgZHJtX2ludGVsX2JvICoKY2hlY2tfYm9fYWxsb2NfdXNlcnB0cihkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCgkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCgkJICAgICAgIHZvaWQgKmFkZHIsCgkJICAgICAgIHVpbnQzMl90IHRpbGluZ19tb2RlLAoJCSAgICAgICB1aW50MzJfdCBzdHJpZGUsCgkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKCQkgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKewoJaWYgKGhhc191c2VycHRyKChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKWJ1Zm1ncikpCgkJYnVmbWdyLT5ib19hbGxvY191c2VycHRyID0gZHJtX2ludGVsX2dlbV9ib19hbGxvY191c2VycHRyOwoJZWxzZQoJCWJ1Zm1nci0+Ym9fYWxsb2NfdXNlcnB0ciA9IE5VTEw7CgoJcmV0dXJuIGRybV9pbnRlbF9ib19hbGxvY191c2VycHRyKGJ1Zm1nciwgbmFtZSwgYWRkciwKCQkJCQkgIHRpbGluZ19tb2RlLCBzdHJpZGUsIHNpemUsIGZsYWdzKTsKfQoKLyoqCiAqIFJldHVybnMgYSBkcm1faW50ZWxfYm8gd3JhcHBpbmcgdGhlIGdpdmVuIGJ1ZmZlciBvYmplY3QgaGFuZGxlLgogKgogKiBUaGlzIGNhbiBiZSB1c2VkIHdoZW4gb25lIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHBhc3MgYSBidWZmZXIgb2JqZWN0CiAqIHRvIGFub3RoZXIuCiAqLwpkcm1faW50ZWxfYm8gKgpkcm1faW50ZWxfYm9fZ2VtX2NyZWF0ZV9mcm9tX25hbWUoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAoJCQkJICBjb25zdCBjaGFyICpuYW1lLAoJCQkJICB1bnNpZ25lZCBpbnQgaGFuZGxlKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBidWZtZ3I7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW07CglpbnQgcmV0OwoJc3RydWN0IGRybV9nZW1fb3BlbiBvcGVuX2FyZzsKCXN0cnVjdCBkcm1faTkxNV9nZW1fZ2V0X3RpbGluZyBnZXRfdGlsaW5nOwoKCS8qIEF0IHRoZSBtb21lbnQgbW9zdCBhcHBsaWNhdGlvbnMgb25seSBoYXZlIGEgZmV3IG5hbWVkIGJvLgoJICogRm9yIGluc3RhbmNlLCBpbiBhIERSSSBjbGllbnQgb25seSB0aGUgcmVuZGVyIGJ1ZmZlcnMgcGFzc2VkCgkgKiBiZXR3ZWVuIFggYW5kIHRoZSBjbGllbnQgYXJlIG5hbWVkLiBBbmQgc2luY2UgWCByZXR1cm5zIHRoZQoJICogYWx0ZXJuYXRpbmcgbmFtZXMgZm9yIHRoZSBmcm9udC9iYWNrIGJ1ZmZlciBhIGxpbmVhciBzZWFyY2gKCSAqIHByb3ZpZGVzIGEgc3VmZmljaWVudGx5IGZhc3QgbWF0Y2guCgkgKi8KCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CglIQVNIX0ZJTkQobmFtZV9oaCwgYnVmbWdyX2dlbS0+bmFtZV90YWJsZSwKCQkgICZoYW5kbGUsIHNpemVvZihoYW5kbGUpLCBib19nZW0pOwoJaWYgKGJvX2dlbSkgewoJCWRybV9pbnRlbF9nZW1fYm9fcmVmZXJlbmNlKCZib19nZW0tPmJvKTsKCQlnb3RvIG91dDsKCX0KCgltZW1jbGVhcihvcGVuX2FyZyk7CglvcGVuX2FyZy5uYW1lID0gaGFuZGxlOwoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCgkJICAgICAgIERSTV9JT0NUTF9HRU1fT1BFTiwKCQkgICAgICAgJm9wZW5fYXJnKTsKCWlmIChyZXQgIT0gMCkgewoJCURCRygiQ291bGRuJ3QgcmVmZXJlbmNlICVzIGhhbmRsZSAweCUwOHg6ICVzXG4iLAoJCSAgICBuYW1lLCBoYW5kbGUsIHN0cmVycm9yKGVycm5vKSk7CgkJYm9fZ2VtID0gTlVMTDsKCQlnb3RvIG91dDsKCX0KICAgICAgICAvKiBOb3cgc2VlIGlmIHNvbWVvbmUgaGFzIHVzZWQgYSBwcmltZSBoYW5kbGUgdG8gZ2V0IHRoaXMKICAgICAgICAgKiBvYmplY3QgZnJvbSB0aGUga2VybmVsIGJlZm9yZSBieSBsb29raW5nIHRocm91Z2ggdGhlIGxpc3QKICAgICAgICAgKiBhZ2FpbiBmb3IgYSBtYXRjaGluZyBnZW1faGFuZGxlCiAgICAgICAgICovCglIQVNIX0ZJTkQoaGFuZGxlX2hoLCBidWZtZ3JfZ2VtLT5oYW5kbGVfdGFibGUsCgkJICAmb3Blbl9hcmcuaGFuZGxlLCBzaXplb2Yob3Blbl9hcmcuaGFuZGxlKSwgYm9fZ2VtKTsKCWlmIChib19nZW0pIHsKCQlkcm1faW50ZWxfZ2VtX2JvX3JlZmVyZW5jZSgmYm9fZ2VtLT5ibyk7CgkJZ290byBvdXQ7Cgl9CgoJYm9fZ2VtID0gY2FsbG9jKDEsIHNpemVvZigqYm9fZ2VtKSk7CglpZiAoIWJvX2dlbSkKCQlnb3RvIG91dDsKCglhdG9taWNfc2V0KCZib19nZW0tPnJlZmNvdW50LCAxKTsKCURSTUlOSVRMSVNUSEVBRCgmYm9fZ2VtLT52bWFfbGlzdCk7CgoJYm9fZ2VtLT5iby5zaXplID0gb3Blbl9hcmcuc2l6ZTsKCWJvX2dlbS0+Ym8ub2Zmc2V0ID0gMDsKCWJvX2dlbS0+Ym8ub2Zmc2V0NjQgPSAwOwoJYm9fZ2VtLT5iby52aXJ0dWFsID0gTlVMTDsKCWJvX2dlbS0+Ym8uYnVmbWdyID0gYnVmbWdyOwoJYm9fZ2VtLT5uYW1lID0gbmFtZTsKCWJvX2dlbS0+dmFsaWRhdGVfaW5kZXggPSAtMTsKCWJvX2dlbS0+Z2VtX2hhbmRsZSA9IG9wZW5fYXJnLmhhbmRsZTsKCWJvX2dlbS0+Ym8uaGFuZGxlID0gb3Blbl9hcmcuaGFuZGxlOwoJYm9fZ2VtLT5nbG9iYWxfbmFtZSA9IGhhbmRsZTsKCWJvX2dlbS0+cmV1c2FibGUgPSBmYWxzZTsKCglIQVNIX0FERChoYW5kbGVfaGgsIGJ1Zm1ncl9nZW0tPmhhbmRsZV90YWJsZSwKCQkgZ2VtX2hhbmRsZSwgc2l6ZW9mKGJvX2dlbS0+Z2VtX2hhbmRsZSksIGJvX2dlbSk7CglIQVNIX0FERChuYW1lX2hoLCBidWZtZ3JfZ2VtLT5uYW1lX3RhYmxlLAoJCSBnbG9iYWxfbmFtZSwgc2l6ZW9mKGJvX2dlbS0+Z2xvYmFsX25hbWUpLCBib19nZW0pOwoKCW1lbWNsZWFyKGdldF90aWxpbmcpOwoJZ2V0X3RpbGluZy5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKCQkgICAgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX0dFVF9USUxJTkcsCgkJICAgICAgICZnZXRfdGlsaW5nKTsKCWlmIChyZXQgIT0gMCkKCQlnb3RvIGVycl91bnJlZjsKCglib19nZW0tPnRpbGluZ19tb2RlID0gZ2V0X3RpbGluZy50aWxpbmdfbW9kZTsKCWJvX2dlbS0+c3dpenpsZV9tb2RlID0gZ2V0X3RpbGluZy5zd2l6emxlX21vZGU7CgkvKiBYWFggc3RyaWRlIGlzIHVua25vd24gKi8KCWRybV9pbnRlbF9ib19nZW1fc2V0X2luX2FwZXJ0dXJlX3NpemUoYnVmbWdyX2dlbSwgYm9fZ2VtLCAwKTsKCURCRygiYm9fY3JlYXRlX2Zyb21faGFuZGxlOiAlZCAoJXMpXG4iLCBoYW5kbGUsIGJvX2dlbS0+bmFtZSk7CgpvdXQ6CglwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CglyZXR1cm4gJmJvX2dlbS0+Ym87CgplcnJfdW5yZWY6Cglkcm1faW50ZWxfZ2VtX2JvX2ZyZWUoJmJvX2dlbS0+Ym8pOwoJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoJcmV0dXJuIE5VTEw7Cn0KCnN0YXRpYyB2b2lkCmRybV9pbnRlbF9nZW1fYm9fZnJlZShkcm1faW50ZWxfYm8gKmJvKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CglzdHJ1Y3QgZHJtX2dlbV9jbG9zZSBjbG9zZTsKCWludCByZXQ7CgoJRFJNTElTVERFTCgmYm9fZ2VtLT52bWFfbGlzdCk7CglpZiAoYm9fZ2VtLT5tZW1fdmlydHVhbCkgewoJCVZHKFZBTEdSSU5EX0ZSRUVMSUtFX0JMT0NLKGJvX2dlbS0+bWVtX3ZpcnR1YWwsIDApKTsKCQlkcm1fbXVubWFwKGJvX2dlbS0+bWVtX3ZpcnR1YWwsIGJvX2dlbS0+Ym8uc2l6ZSk7CgkJYnVmbWdyX2dlbS0+dm1hX2NvdW50LS07Cgl9CglpZiAoYm9fZ2VtLT53Y192aXJ0dWFsKSB7CgkJVkcoVkFMR1JJTkRfRlJFRUxJS0VfQkxPQ0soYm9fZ2VtLT53Y192aXJ0dWFsLCAwKSk7CgkJZHJtX211bm1hcChib19nZW0tPndjX3ZpcnR1YWwsIGJvX2dlbS0+Ym8uc2l6ZSk7CgkJYnVmbWdyX2dlbS0+dm1hX2NvdW50LS07Cgl9CglpZiAoYm9fZ2VtLT5ndHRfdmlydHVhbCkgewoJCWRybV9tdW5tYXAoYm9fZ2VtLT5ndHRfdmlydHVhbCwgYm9fZ2VtLT5iby5zaXplKTsKCQlidWZtZ3JfZ2VtLT52bWFfY291bnQtLTsKCX0KCglpZiAoYm9fZ2VtLT5nbG9iYWxfbmFtZSkKCQlIQVNIX0RFTEVURShuYW1lX2hoLCBidWZtZ3JfZ2VtLT5uYW1lX3RhYmxlLCBib19nZW0pOwoJSEFTSF9ERUxFVEUoaGFuZGxlX2hoLCBidWZtZ3JfZ2VtLT5oYW5kbGVfdGFibGUsIGJvX2dlbSk7CgoJLyogQ2xvc2UgdGhpcyBvYmplY3QgKi8KCW1lbWNsZWFyKGNsb3NlKTsKCWNsb3NlLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfR0VNX0NMT1NFLCAmY2xvc2UpOwoJaWYgKHJldCAhPSAwKSB7CgkJREJHKCJEUk1fSU9DVExfR0VNX0NMT1NFICVkIGZhaWxlZCAoJXMpOiAlc1xuIiwKCQkgICAgYm9fZ2VtLT5nZW1faGFuZGxlLCBib19nZW0tPm5hbWUsIHN0cmVycm9yKGVycm5vKSk7Cgl9CglmcmVlKGJvKTsKfQoKc3RhdGljIHZvaWQKZHJtX2ludGVsX2dlbV9ib19tYXJrX21tYXBzX2luY29oZXJlbnQoZHJtX2ludGVsX2JvICpibykKewojaWYgSEFWRV9WQUxHUklORAoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CgoJaWYgKGJvX2dlbS0+bWVtX3ZpcnR1YWwpCgkJVkFMR1JJTkRfTUFLRV9NRU1fTk9BQ0NFU1MoYm9fZ2VtLT5tZW1fdmlydHVhbCwgYm8tPnNpemUpOwoKCWlmIChib19nZW0tPndjX3ZpcnR1YWwpCgkJVkFMR1JJTkRfTUFLRV9NRU1fTk9BQ0NFU1MoYm9fZ2VtLT53Y192aXJ0dWFsLCBiby0+c2l6ZSk7CgoJaWYgKGJvX2dlbS0+Z3R0X3ZpcnR1YWwpCgkJVkFMR1JJTkRfTUFLRV9NRU1fTk9BQ0NFU1MoYm9fZ2VtLT5ndHRfdmlydHVhbCwgYm8tPnNpemUpOwojZW5kaWYKfQoKLyoqIEZyZWVzIGFsbCBjYWNoZWQgYnVmZmVycyBzaWduaWZpY2FudGx5IG9sZGVyIHRoYW4gQHRpbWUuICovCnN0YXRpYyB2b2lkCmRybV9pbnRlbF9nZW1fY2xlYW51cF9ib19jYWNoZShkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSwgdGltZV90IHRpbWUpCnsKCWludCBpOwoKCWlmIChidWZtZ3JfZ2VtLT50aW1lID09IHRpbWUpCgkJcmV0dXJuOwoKCWZvciAoaSA9IDA7IGkgPCBidWZtZ3JfZ2VtLT5udW1fYnVja2V0czsgaSsrKSB7CgkJc3RydWN0IGRybV9pbnRlbF9nZW1fYm9fYnVja2V0ICpidWNrZXQgPQoJCSAgICAmYnVmbWdyX2dlbS0+Y2FjaGVfYnVja2V0W2ldOwoKCQl3aGlsZSAoIURSTUxJU1RFTVBUWSgmYnVja2V0LT5oZWFkKSkgewoJCQlkcm1faW50ZWxfYm9fZ2VtICpib19nZW07CgoJCQlib19nZW0gPSBEUk1MSVNURU5UUlkoZHJtX2ludGVsX2JvX2dlbSwKCQkJCQkgICAgICBidWNrZXQtPmhlYWQubmV4dCwgaGVhZCk7CgkJCWlmICh0aW1lIC0gYm9fZ2VtLT5mcmVlX3RpbWUgPD0gMSkKCQkJCWJyZWFrOwoKCQkJRFJNTElTVERFTCgmYm9fZ2VtLT5oZWFkKTsKCgkJCWRybV9pbnRlbF9nZW1fYm9fZnJlZSgmYm9fZ2VtLT5ibyk7CgkJfQoJfQoKCWJ1Zm1ncl9nZW0tPnRpbWUgPSB0aW1lOwp9CgpzdGF0aWMgdm9pZCBkcm1faW50ZWxfZ2VtX2JvX3B1cmdlX3ZtYV9jYWNoZShkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSkKewoJaW50IGxpbWl0OwoKCURCRygiJXM6IGNhY2hlZD0lZCwgb3Blbj0lZCwgbGltaXQ9JWRcbiIsIF9fRlVOQ1RJT05fXywKCSAgICBidWZtZ3JfZ2VtLT52bWFfY291bnQsIGJ1Zm1ncl9nZW0tPnZtYV9vcGVuLCBidWZtZ3JfZ2VtLT52bWFfbWF4KTsKCglpZiAoYnVmbWdyX2dlbS0+dm1hX21heCA8IDApCgkJcmV0dXJuOwoKCS8qIFdlIG1heSBuZWVkIHRvIGV2aWN0IGEgZmV3IGVudHJpZXMgaW4gb3JkZXIgdG8gY3JlYXRlIG5ldyBtbWFwcyAqLwoJbGltaXQgPSBidWZtZ3JfZ2VtLT52bWFfbWF4IC0gMipidWZtZ3JfZ2VtLT52bWFfb3BlbjsKCWlmIChsaW1pdCA8IDApCgkJbGltaXQgPSAwOwoKCXdoaWxlIChidWZtZ3JfZ2VtLT52bWFfY291bnQgPiBsaW1pdCkgewoJCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbTsKCgkJYm9fZ2VtID0gRFJNTElTVEVOVFJZKGRybV9pbnRlbF9ib19nZW0sCgkJCQkgICAgICBidWZtZ3JfZ2VtLT52bWFfY2FjaGUubmV4dCwKCQkJCSAgICAgIHZtYV9saXN0KTsKCQlhc3NlcnQoYm9fZ2VtLT5tYXBfY291bnQgPT0gMCk7CgkJRFJNTElTVERFTElOSVQoJmJvX2dlbS0+dm1hX2xpc3QpOwoKCQlpZiAoYm9fZ2VtLT5tZW1fdmlydHVhbCkgewoJCQlkcm1fbXVubWFwKGJvX2dlbS0+bWVtX3ZpcnR1YWwsIGJvX2dlbS0+Ym8uc2l6ZSk7CgkJCWJvX2dlbS0+bWVtX3ZpcnR1YWwgPSBOVUxMOwoJCQlidWZtZ3JfZ2VtLT52bWFfY291bnQtLTsKCQl9CgkJaWYgKGJvX2dlbS0+d2NfdmlydHVhbCkgewoJCQlkcm1fbXVubWFwKGJvX2dlbS0+d2NfdmlydHVhbCwgYm9fZ2VtLT5iby5zaXplKTsKCQkJYm9fZ2VtLT53Y192aXJ0dWFsID0gTlVMTDsKCQkJYnVmbWdyX2dlbS0+dm1hX2NvdW50LS07CgkJfQoJCWlmIChib19nZW0tPmd0dF92aXJ0dWFsKSB7CgkJCWRybV9tdW5tYXAoYm9fZ2VtLT5ndHRfdmlydHVhbCwgYm9fZ2VtLT5iby5zaXplKTsKCQkJYm9fZ2VtLT5ndHRfdmlydHVhbCA9IE5VTEw7CgkJCWJ1Zm1ncl9nZW0tPnZtYV9jb3VudC0tOwoJCX0KCX0KfQoKc3RhdGljIHZvaWQgZHJtX2ludGVsX2dlbV9ib19jbG9zZV92bWEoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0sCgkJCQkgICAgICAgZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtKQp7CglidWZtZ3JfZ2VtLT52bWFfb3Blbi0tOwoJRFJNTElTVEFERFRBSUwoJmJvX2dlbS0+dm1hX2xpc3QsICZidWZtZ3JfZ2VtLT52bWFfY2FjaGUpOwoJaWYgKGJvX2dlbS0+bWVtX3ZpcnR1YWwpCgkJYnVmbWdyX2dlbS0+dm1hX2NvdW50Kys7CglpZiAoYm9fZ2VtLT53Y192aXJ0dWFsKQoJCWJ1Zm1ncl9nZW0tPnZtYV9jb3VudCsrOwoJaWYgKGJvX2dlbS0+Z3R0X3ZpcnR1YWwpCgkJYnVmbWdyX2dlbS0+dm1hX2NvdW50Kys7Cglkcm1faW50ZWxfZ2VtX2JvX3B1cmdlX3ZtYV9jYWNoZShidWZtZ3JfZ2VtKTsKfQoKc3RhdGljIHZvaWQgZHJtX2ludGVsX2dlbV9ib19vcGVuX3ZtYShkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSwKCQkJCSAgICAgIGRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSkKewoJYnVmbWdyX2dlbS0+dm1hX29wZW4rKzsKCURSTUxJU1RERUwoJmJvX2dlbS0+dm1hX2xpc3QpOwoJaWYgKGJvX2dlbS0+bWVtX3ZpcnR1YWwpCgkJYnVmbWdyX2dlbS0+dm1hX2NvdW50LS07CglpZiAoYm9fZ2VtLT53Y192aXJ0dWFsKQoJCWJ1Zm1ncl9nZW0tPnZtYV9jb3VudC0tOwoJaWYgKGJvX2dlbS0+Z3R0X3ZpcnR1YWwpCgkJYnVmbWdyX2dlbS0+dm1hX2NvdW50LS07Cglkcm1faW50ZWxfZ2VtX2JvX3B1cmdlX3ZtYV9jYWNoZShidWZtZ3JfZ2VtKTsKfQoKc3RhdGljIHZvaWQKZHJtX2ludGVsX2dlbV9ib191bnJlZmVyZW5jZV9maW5hbChkcm1faW50ZWxfYm8gKmJvLCB0aW1lX3QgdGltZSkKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoJc3RydWN0IGRybV9pbnRlbF9nZW1fYm9fYnVja2V0ICpidWNrZXQ7CglpbnQgaTsKCgkvKiBVbnJlZmVyZW5jZSBhbGwgdGhlIHRhcmdldCBidWZmZXJzICovCglmb3IgKGkgPSAwOyBpIDwgYm9fZ2VtLT5yZWxvY19jb3VudDsgaSsrKSB7CgkJaWYgKGJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm9baV0uYm8gIT0gYm8pIHsKCQkJZHJtX2ludGVsX2dlbV9ib191bnJlZmVyZW5jZV9sb2NrZWRfdGltZWQoYm9fZ2VtLT4KCQkJCQkJCQkgIHJlbG9jX3RhcmdldF9pbmZvW2ldLmJvLAoJCQkJCQkJCSAgdGltZSk7CgkJfQoJfQoJZm9yIChpID0gMDsgaSA8IGJvX2dlbS0+c29mdHBpbl90YXJnZXRfY291bnQ7IGkrKykKCQlkcm1faW50ZWxfZ2VtX2JvX3VucmVmZXJlbmNlX2xvY2tlZF90aW1lZChib19nZW0tPnNvZnRwaW5fdGFyZ2V0W2ldLAoJCQkJCQkJCSAgdGltZSk7Cglib19nZW0tPmtmbGFncyA9IDA7Cglib19nZW0tPnJlbG9jX2NvdW50ID0gMDsKCWJvX2dlbS0+dXNlZF9hc19yZWxvY190YXJnZXQgPSBmYWxzZTsKCWJvX2dlbS0+c29mdHBpbl90YXJnZXRfY291bnQgPSAwOwoKCURCRygiYm9fdW5yZWZlcmVuY2UgZmluYWw6ICVkICglcylcbiIsCgkgICAgYm9fZ2VtLT5nZW1faGFuZGxlLCBib19nZW0tPm5hbWUpOwoKCS8qIHJlbGVhc2UgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdCAqLwoJaWYgKGJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm8pIHsKCQlmcmVlKGJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm8pOwoJCWJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm8gPSBOVUxMOwoJfQoJaWYgKGJvX2dlbS0+cmVsb2NzKSB7CgkJZnJlZShib19nZW0tPnJlbG9jcyk7CgkJYm9fZ2VtLT5yZWxvY3MgPSBOVUxMOwoJfQoJaWYgKGJvX2dlbS0+c29mdHBpbl90YXJnZXQpIHsKCQlmcmVlKGJvX2dlbS0+c29mdHBpbl90YXJnZXQpOwoJCWJvX2dlbS0+c29mdHBpbl90YXJnZXQgPSBOVUxMOwoJCWJvX2dlbS0+c29mdHBpbl90YXJnZXRfc2l6ZSA9IDA7Cgl9CgoJLyogQ2xlYXIgYW55IGxlZnQtb3ZlciBtYXBwaW5ncyAqLwoJaWYgKGJvX2dlbS0+bWFwX2NvdW50KSB7CgkJREJHKCJibyBmcmVlZCB3aXRoIG5vbi16ZXJvIG1hcC1jb3VudCAlZFxuIiwgYm9fZ2VtLT5tYXBfY291bnQpOwoJCWJvX2dlbS0+bWFwX2NvdW50ID0gMDsKCQlkcm1faW50ZWxfZ2VtX2JvX2Nsb3NlX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOwoJCWRybV9pbnRlbF9nZW1fYm9fbWFya19tbWFwc19pbmNvaGVyZW50KGJvKTsKCX0KCglidWNrZXQgPSBkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldF9mb3Jfc2l6ZShidWZtZ3JfZ2VtLCBiby0+c2l6ZSk7CgkvKiBQdXQgdGhlIGJ1ZmZlciBpbnRvIG91ciBpbnRlcm5hbCBjYWNoZSBmb3IgcmV1c2UgaWYgd2UgY2FuLiAqLwoJaWYgKGJ1Zm1ncl9nZW0tPmJvX3JldXNlICYmIGJvX2dlbS0+cmV1c2FibGUgJiYgYnVja2V0ICE9IE5VTEwgJiYKCSAgICBkcm1faW50ZWxfZ2VtX2JvX21hZHZpc2VfaW50ZXJuYWwoYnVmbWdyX2dlbSwgYm9fZ2VtLAoJCQkJCSAgICAgIEk5MTVfTUFEVl9ET05UTkVFRCkpIHsKCQlib19nZW0tPmZyZWVfdGltZSA9IHRpbWU7CgoJCWJvX2dlbS0+bmFtZSA9IE5VTEw7CgkJYm9fZ2VtLT52YWxpZGF0ZV9pbmRleCA9IC0xOwoKCQlEUk1MSVNUQUREVEFJTCgmYm9fZ2VtLT5oZWFkLCAmYnVja2V0LT5oZWFkKTsKCX0gZWxzZSB7CgkJZHJtX2ludGVsX2dlbV9ib19mcmVlKGJvKTsKCX0KfQoKc3RhdGljIHZvaWQgZHJtX2ludGVsX2dlbV9ib191bnJlZmVyZW5jZV9sb2NrZWRfdGltZWQoZHJtX2ludGVsX2JvICpibywKCQkJCQkJICAgICAgdGltZV90IHRpbWUpCnsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoKCWFzc2VydChhdG9taWNfcmVhZCgmYm9fZ2VtLT5yZWZjb3VudCkgPiAwKTsKCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZib19nZW0tPnJlZmNvdW50KSkKCQlkcm1faW50ZWxfZ2VtX2JvX3VucmVmZXJlbmNlX2ZpbmFsKGJvLCB0aW1lKTsKfQoKc3RhdGljIHZvaWQgZHJtX2ludGVsX2dlbV9ib191bnJlZmVyZW5jZShkcm1faW50ZWxfYm8gKmJvKQp7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCglhc3NlcnQoYXRvbWljX3JlYWQoJmJvX2dlbS0+cmVmY291bnQpID4gMCk7CgoJaWYgKGF0b21pY19hZGRfdW5sZXNzKCZib19nZW0tPnJlZmNvdW50LCAtMSwgMSkpIHsKCQlkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9CgkJICAgIChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoJCXN0cnVjdCB0aW1lc3BlYyB0aW1lOwoKCQljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRpbWUpOwoKCQlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoKCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYm9fZ2VtLT5yZWZjb3VudCkpIHsKCQkJZHJtX2ludGVsX2dlbV9ib191bnJlZmVyZW5jZV9maW5hbChibywgdGltZS50dl9zZWMpOwoJCQlkcm1faW50ZWxfZ2VtX2NsZWFudXBfYm9fY2FjaGUoYnVmbWdyX2dlbSwgdGltZS50dl9zZWMpOwoJCX0KCgkJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoJfQp9CgpzdGF0aWMgaW50IGRybV9pbnRlbF9nZW1fYm9fbWFwKGRybV9pbnRlbF9ibyAqYm8sIGludCB3cml0ZV9lbmFibGUpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCXN0cnVjdCBkcm1faTkxNV9nZW1fc2V0X2RvbWFpbiBzZXRfZG9tYWluOwoJaW50IHJldDsKCglpZiAoYm9fZ2VtLT5pc191c2VycHRyKSB7CgkJLyogUmV0dXJuIHRoZSBzYW1lIHVzZXIgcHRyICovCgkJYm8tPnZpcnR1YWwgPSBib19nZW0tPnVzZXJfdmlydHVhbDsKCQlyZXR1cm4gMDsKCX0KCglwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoKCWlmIChib19nZW0tPm1hcF9jb3VudCsrID09IDApCgkJZHJtX2ludGVsX2dlbV9ib19vcGVuX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOwoKCWlmICghYm9fZ2VtLT5tZW1fdmlydHVhbCkgewoJCXN0cnVjdCBkcm1faTkxNV9nZW1fbW1hcCBtbWFwX2FyZzsKCgkJREJHKCJib19tYXA6ICVkICglcyksIG1hcF9jb3VudD0lZFxuIiwKCQkgICAgYm9fZ2VtLT5nZW1faGFuZGxlLCBib19nZW0tPm5hbWUsIGJvX2dlbS0+bWFwX2NvdW50KTsKCgkJbWVtY2xlYXIobW1hcF9hcmcpOwoJCW1tYXBfYXJnLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKCQltbWFwX2FyZy5zaXplID0gYm8tPnNpemU7CgkJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCgkJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fTU1BUCwKCQkJICAgICAgICZtbWFwX2FyZyk7CgkJaWYgKHJldCAhPSAwKSB7CgkJCXJldCA9IC1lcnJubzsKCQkJREJHKCIlczolZDogRXJyb3IgbWFwcGluZyBidWZmZXIgJWQgKCVzKTogJXMgLlxuIiwKCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgYm9fZ2VtLT5nZW1faGFuZGxlLAoJCQkgICAgYm9fZ2VtLT5uYW1lLCBzdHJlcnJvcihlcnJubykpOwoJCQlpZiAoLS1ib19nZW0tPm1hcF9jb3VudCA9PSAwKQoJCQkJZHJtX2ludGVsX2dlbV9ib19jbG9zZV92bWEoYnVmbWdyX2dlbSwgYm9fZ2VtKTsKCQkJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoJCQlyZXR1cm4gcmV0OwoJCX0KCQlWRyhWQUxHUklORF9NQUxMT0NMSUtFX0JMT0NLKG1tYXBfYXJnLmFkZHJfcHRyLCBtbWFwX2FyZy5zaXplLCAwLCAxKSk7CgkJYm9fZ2VtLT5tZW1fdmlydHVhbCA9ICh2b2lkICopKHVpbnRwdHJfdCkgbW1hcF9hcmcuYWRkcl9wdHI7Cgl9CglEQkcoImJvX21hcDogJWQgKCVzKSAtPiAlcFxuIiwgYm9fZ2VtLT5nZW1faGFuZGxlLCBib19nZW0tPm5hbWUsCgkgICAgYm9fZ2VtLT5tZW1fdmlydHVhbCk7Cgliby0+dmlydHVhbCA9IGJvX2dlbS0+bWVtX3ZpcnR1YWw7CgoJbWVtY2xlYXIoc2V0X2RvbWFpbik7CglzZXRfZG9tYWluLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKCXNldF9kb21haW4ucmVhZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlOX0NQVTsKCWlmICh3cml0ZV9lbmFibGUpCgkJc2V0X2RvbWFpbi53cml0ZV9kb21haW4gPSBJOTE1X0dFTV9ET01BSU5fQ1BVOwoJZWxzZQoJCXNldF9kb21haW4ud3JpdGVfZG9tYWluID0gMDsKCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAoJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fU0VUX0RPTUFJTiwKCQkgICAgICAgJnNldF9kb21haW4pOwoJaWYgKHJldCAhPSAwKSB7CgkJREJHKCIlczolZDogRXJyb3Igc2V0dGluZyB0byBDUFUgZG9tYWluICVkOiAlc1xuIiwKCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBib19nZW0tPmdlbV9oYW5kbGUsCgkJICAgIHN0cmVycm9yKGVycm5vKSk7Cgl9CgoJaWYgKHdyaXRlX2VuYWJsZSkKCQlib19nZW0tPm1hcHBlZF9jcHVfd3JpdGUgPSB0cnVlOwoKCWRybV9pbnRlbF9nZW1fYm9fbWFya19tbWFwc19pbmNvaGVyZW50KGJvKTsKCVZHKFZBTEdSSU5EX01BS0VfTUVNX0RFRklORUQoYm9fZ2VtLT5tZW1fdmlydHVhbCwgYm8tPnNpemUpKTsKCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludAptYXBfZ3R0KGRybV9pbnRlbF9ibyAqYm8pCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCWludCByZXQ7CgoJaWYgKGJvX2dlbS0+aXNfdXNlcnB0cikKCQlyZXR1cm4gLUVJTlZBTDsKCglpZiAoYm9fZ2VtLT5tYXBfY291bnQrKyA9PSAwKQoJCWRybV9pbnRlbF9nZW1fYm9fb3Blbl92bWEoYnVmbWdyX2dlbSwgYm9fZ2VtKTsKCgkvKiBHZXQgYSBtYXBwaW5nIG9mIHRoZSBidWZmZXIgaWYgd2UgaGF2ZW4ndCBiZWZvcmUuICovCglpZiAoYm9fZ2VtLT5ndHRfdmlydHVhbCA9PSBOVUxMKSB7CgkJc3RydWN0IGRybV9pOTE1X2dlbV9tbWFwX2d0dCBtbWFwX2FyZzsKCgkJREJHKCJib19tYXBfZ3R0OiBtbWFwICVkICglcyksIG1hcF9jb3VudD0lZFxuIiwKCQkgICAgYm9fZ2VtLT5nZW1faGFuZGxlLCBib19nZW0tPm5hbWUsIGJvX2dlbS0+bWFwX2NvdW50KTsKCgkJbWVtY2xlYXIobW1hcF9hcmcpOwoJCW1tYXBfYXJnLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKCgkJLyogR2V0IHRoZSBmYWtlIG9mZnNldCBiYWNrLi4uICovCgkJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCgkJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fTU1BUF9HVFQsCgkJCSAgICAgICAmbW1hcF9hcmcpOwoJCWlmIChyZXQgIT0gMCkgewoJCQlyZXQgPSAtZXJybm87CgkJCURCRygiJXM6JWQ6IEVycm9yIHByZXBhcmluZyBidWZmZXIgbWFwICVkICglcyk6ICVzIC5cbiIsCgkJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sCgkJCSAgICBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwKCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CgkJCWlmICgtLWJvX2dlbS0+bWFwX2NvdW50ID09IDApCgkJCQlkcm1faW50ZWxfZ2VtX2JvX2Nsb3NlX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOwoJCQlyZXR1cm4gcmV0OwoJCX0KCgkJLyogYW5kIG1tYXAgaXQgKi8KCQlib19nZW0tPmd0dF92aXJ0dWFsID0gZHJtX21tYXAoMCwgYm8tPnNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCgkJCQkJICAgICAgIE1BUF9TSEFSRUQsIGJ1Zm1ncl9nZW0tPmZkLAoJCQkJCSAgICAgICBtbWFwX2FyZy5vZmZzZXQpOwoJCWlmIChib19nZW0tPmd0dF92aXJ0dWFsID09IE1BUF9GQUlMRUQpIHsKCQkJYm9fZ2VtLT5ndHRfdmlydHVhbCA9IE5VTEw7CgkJCXJldCA9IC1lcnJubzsKCQkJREJHKCIlczolZDogRXJyb3IgbWFwcGluZyBidWZmZXIgJWQgKCVzKTogJXMgLlxuIiwKCQkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywKCQkJICAgIGJvX2dlbS0+Z2VtX2hhbmRsZSwgYm9fZ2VtLT5uYW1lLAoJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKCQkJaWYgKC0tYm9fZ2VtLT5tYXBfY291bnQgPT0gMCkKCQkJCWRybV9pbnRlbF9nZW1fYm9fY2xvc2Vfdm1hKGJ1Zm1ncl9nZW0sIGJvX2dlbSk7CgkJCXJldHVybiByZXQ7CgkJfQoJfQoKCWJvLT52aXJ0dWFsID0gYm9fZ2VtLT5ndHRfdmlydHVhbDsKCglEQkcoImJvX21hcF9ndHQ6ICVkICglcykgLT4gJXBcbiIsIGJvX2dlbS0+Z2VtX2hhbmRsZSwgYm9fZ2VtLT5uYW1lLAoJICAgIGJvX2dlbS0+Z3R0X3ZpcnR1YWwpOwoKCXJldHVybiAwOwp9CgppbnQKZHJtX2ludGVsX2dlbV9ib19tYXBfZ3R0KGRybV9pbnRlbF9ibyAqYm8pCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCXN0cnVjdCBkcm1faTkxNV9nZW1fc2V0X2RvbWFpbiBzZXRfZG9tYWluOwoJaW50IHJldDsKCglwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoKCXJldCA9IG1hcF9ndHQoYm8pOwoJaWYgKHJldCkgewoJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKCQlyZXR1cm4gcmV0OwoJfQoKCS8qIE5vdyBtb3ZlIGl0IHRvIHRoZSBHVFQgZG9tYWluIHNvIHRoYXQgdGhlIEdQVSBhbmQgQ1BVCgkgKiBjYWNoZXMgYXJlIGZsdXNoZWQgYW5kIHRoZSBHUFUgaXNuJ3QgYWN0aXZlbHkgdXNpbmcgdGhlCgkgKiBidWZmZXIuCgkgKgoJICogVGhlIHBhZ2VmYXVsdCBoYW5kbGVyIGRvZXMgdGhpcyBkb21haW4gY2hhbmdlIGZvciB1cyB3aGVuCgkgKiBpdCBoYXMgdW5ib3VuZCB0aGUgQk8gZnJvbSB0aGUgR1RULCBidXQgaXQncyB1cCB0byB1cyB0bwoJICogdGVsbCBpdCB3aGVuIHdlJ3JlIGFib3V0IHRvIHVzZSB0aGluZ3MgaWYgd2UgaGFkIGRvbmUKCSAqIHJlbmRlcmluZyBhbmQgaXQgc3RpbGwgaGFwcGVucyB0byBiZSBib3VuZCB0byB0aGUgR1RULgoJICovCgltZW1jbGVhcihzZXRfZG9tYWluKTsKCXNldF9kb21haW4uaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOwoJc2V0X2RvbWFpbi5yZWFkX2RvbWFpbnMgPSBJOTE1X0dFTV9ET01BSU5fR1RUOwoJc2V0X2RvbWFpbi53cml0ZV9kb21haW4gPSBJOTE1X0dFTV9ET01BSU5fR1RUOwoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCgkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9TRVRfRE9NQUlOLAoJCSAgICAgICAmc2V0X2RvbWFpbik7CglpZiAocmV0ICE9IDApIHsKCQlEQkcoIiVzOiVkOiBFcnJvciBzZXR0aW5nIGRvbWFpbiAlZDogJXNcbiIsCgkJICAgIF9fRklMRV9fLCBfX0xJTkVfXywgYm9fZ2VtLT5nZW1faGFuZGxlLAoJCSAgICBzdHJlcnJvcihlcnJubykpOwoJfQoKCWRybV9pbnRlbF9nZW1fYm9fbWFya19tbWFwc19pbmNvaGVyZW50KGJvKTsKCVZHKFZBTEdSSU5EX01BS0VfTUVNX0RFRklORUQoYm9fZ2VtLT5ndHRfdmlydHVhbCwgYm8tPnNpemUpKTsKCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKCglyZXR1cm4gMDsKfQoKLyoqCiAqIFBlcmZvcm1zIGEgbWFwcGluZyBvZiB0aGUgYnVmZmVyIG9iamVjdCBsaWtlIHRoZSBub3JtYWwgR1RUCiAqIG1hcHBpbmcsIGJ1dCBhdm9pZHMgd2FpdGluZyBmb3IgdGhlIEdQVSB0byBiZSBkb25lIHJlYWRpbmcgZnJvbSBvcgogKiByZW5kZXJpbmcgdG8gdGhlIGJ1ZmZlci4KICoKICogVGhpcyBpcyB1c2VkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBHTF9BUkJfbWFwX2J1ZmZlcl9yYW5nZTogVGhlCiAqIHVzZXIgYXNrcyB0byBjcmVhdGUgYSBidWZmZXIsIHRoZW4gZG9lcyBhIG1hcHBpbmcsIGZpbGxzIHNvbWUKICogc3BhY2UsIHJ1bnMgYSBkcmF3aW5nIGNvbW1hbmQsIHRoZW4gYXNrcyB0byBtYXAgaXQgYWdhaW4gd2l0aG91dAogKiBzeW5jaHJvbml6aW5nIGJlY2F1c2UgaXQgZ3VhcmFudGVlcyB0aGF0IGl0IHdvbid0IHdyaXRlIG92ZXIgdGhlCiAqIGRhdGEgdGhhdCB0aGUgR1BVIGlzIGJ1c3kgdXNpbmcgKG9yLCBtb3JlIHNwZWNpZmljYWxseSwgdGhhdCBpZiBpdAogKiBkb2VzIHdyaXRlIG92ZXIgdGhlIGRhdGEsIGl0IGFja25vd2xlZGdlcyB0aGF0IHJlbmRlcmluZyBpcwogKiB1bmRlZmluZWQpLgogKi8KCmludApkcm1faW50ZWxfZ2VtX2JvX21hcF91bnN5bmNocm9uaXplZChkcm1faW50ZWxfYm8gKmJvKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwojaWZkZWYgSEFWRV9WQUxHUklORAoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CiNlbmRpZgoJaW50IHJldDsKCgkvKiBJZiB0aGUgQ1BVIGNhY2hlIGlzbid0IGNvaGVyZW50IHdpdGggdGhlIEdUVCwgdGhlbiB1c2UgYQoJICogcmVndWxhciBzeW5jaHJvbml6ZWQgbWFwcGluZy4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgd2UgZG9uJ3QKCSAqIHRyYWNrIHdoZXJlIHRoZSBidWZmZXIgd2FzIGxhc3QgdXNlZCBvbiB0aGUgQ1BVIHNpZGUgaW4KCSAqIHRlcm1zIG9mIGRybV9pbnRlbF9ib19tYXAgdnMgZHJtX2ludGVsX2dlbV9ib19tYXBfZ3R0LCBzbwoJICogd2Ugd291bGQgcG90ZW50aWFsbHkgY29ycnVwdCB0aGUgYnVmZmVyIGV2ZW4gd2hlbiB0aGUgdXNlcgoJICogZG9lcyByZWFzb25hYmxlIHRoaW5ncy4KCSAqLwoJaWYgKCFidWZtZ3JfZ2VtLT5oYXNfbGxjKQoJCXJldHVybiBkcm1faW50ZWxfZ2VtX2JvX21hcF9ndHQoYm8pOwoKCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CgoJcmV0ID0gbWFwX2d0dChibyk7CglpZiAocmV0ID09IDApIHsKCQlkcm1faW50ZWxfZ2VtX2JvX21hcmtfbW1hcHNfaW5jb2hlcmVudChibyk7CgkJVkcoVkFMR1JJTkRfTUFLRV9NRU1fREVGSU5FRChib19nZW0tPmd0dF92aXJ0dWFsLCBiby0+c2l6ZSkpOwoJfQoKCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IGRybV9pbnRlbF9nZW1fYm9fdW5tYXAoZHJtX2ludGVsX2JvICpibykKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW07Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCWludCByZXQgPSAwOwoKCWlmIChibyA9PSBOVUxMKQoJCXJldHVybiAwOwoKCWlmIChib19nZW0tPmlzX3VzZXJwdHIpCgkJcmV0dXJuIDA7CgoJYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoKCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CgoJaWYgKGJvX2dlbS0+bWFwX2NvdW50IDw9IDApIHsKCQlEQkcoImF0dGVtcHRlZCB0byB1bm1hcCBhbiB1bm1hcHBlZCBib1xuIik7CgkJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoJCS8qIFByZXNlcnZlIHRoZSBvbGQgYmVoYXZpb3VyIG9mIGp1c3QgdHJlYXRpbmcgdGhpcyBhcyBhCgkJICogbm8tb3AgcmF0aGVyIHRoYW4gcmVwb3J0aW5nIHRoZSBlcnJvci4KCQkgKi8KCQlyZXR1cm4gMDsKCX0KCglpZiAoYm9fZ2VtLT5tYXBwZWRfY3B1X3dyaXRlKSB7CgkJc3RydWN0IGRybV9pOTE1X2dlbV9zd19maW5pc2ggc3dfZmluaXNoOwoKCQkvKiBDYXVzZSBhIGZsdXNoIHRvIGhhcHBlbiBpZiB0aGUgYnVmZmVyJ3MgcGlubmVkIGZvcgoJCSAqIHNjYW5vdXQsIHNvIHRoZSByZXN1bHRzIHNob3cgdXAgaW4gYSB0aW1lbHkgbWFubmVyLgoJCSAqIFVubGlrZSBHVFQgc2V0IGRvbWFpbnMsIHRoaXMgb25seSBkb2VzIHdvcmsgaWYgdGhlCgkJICogYnVmZmVyIHNob3VsZCBiZSBzY2Fub3V0LXJlbGF0ZWQuCgkJICovCgkJbWVtY2xlYXIoc3dfZmluaXNoKTsKCQlzd19maW5pc2guaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOwoJCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAoJCQkgICAgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX1NXX0ZJTklTSCwKCQkJICAgICAgICZzd19maW5pc2gpOwoJCXJldCA9IHJldCA9PSAtMSA/IC1lcnJubyA6IDA7CgoJCWJvX2dlbS0+bWFwcGVkX2NwdV93cml0ZSA9IGZhbHNlOwoJfQoKCS8qIFdlIG5lZWQgdG8gdW5tYXAgYWZ0ZXIgZXZlcnkgaW5ub3ZhdGlvbiBhcyB3ZSBjYW5ub3QgdHJhY2sKCSAqIGFuIG9wZW4gdm1hIGZvciBldmVyeSBibyBhcyB0aGF0IHdpbGwgZXhoYXVzdCB0aGUgc3lzdGVtCgkgKiBsaW1pdHMgYW5kIGNhdXNlIGxhdGVyIGZhaWx1cmVzLgoJICovCglpZiAoLS1ib19nZW0tPm1hcF9jb3VudCA9PSAwKSB7CgkJZHJtX2ludGVsX2dlbV9ib19jbG9zZV92bWEoYnVmbWdyX2dlbSwgYm9fZ2VtKTsKCQlkcm1faW50ZWxfZ2VtX2JvX21hcmtfbW1hcHNfaW5jb2hlcmVudChibyk7CgkJYm8tPnZpcnR1YWwgPSBOVUxMOwoJfQoJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoKCXJldHVybiByZXQ7Cn0KCmludApkcm1faW50ZWxfZ2VtX2JvX3VubWFwX2d0dChkcm1faW50ZWxfYm8gKmJvKQp7CglyZXR1cm4gZHJtX2ludGVsX2dlbV9ib191bm1hcChibyk7Cn0KCnN0YXRpYyBpbnQKZHJtX2ludGVsX2dlbV9ib19zdWJkYXRhKGRybV9pbnRlbF9ibyAqYm8sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAoJCQkgdW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCB2b2lkICpkYXRhKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CglzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3B3cml0ZSBwd3JpdGU7CglpbnQgcmV0OwoKCWlmIChib19nZW0tPmlzX3VzZXJwdHIpCgkJcmV0dXJuIC1FSU5WQUw7CgoJbWVtY2xlYXIocHdyaXRlKTsKCXB3cml0ZS5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7Cglwd3JpdGUub2Zmc2V0ID0gb2Zmc2V0OwoJcHdyaXRlLnNpemUgPSBzaXplOwoJcHdyaXRlLmRhdGFfcHRyID0gKHVpbnQ2NF90KSAodWludHB0cl90KSBkYXRhOwoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCgkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9QV1JJVEUsCgkJICAgICAgICZwd3JpdGUpOwoJaWYgKHJldCAhPSAwKSB7CgkJcmV0ID0gLWVycm5vOwoJCURCRygiJXM6JWQ6IEVycm9yIHdyaXRpbmcgZGF0YSB0byBidWZmZXIgJWQ6ICglZCAlZCkgJXMgLlxuIiwKCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBib19nZW0tPmdlbV9oYW5kbGUsIChpbnQpb2Zmc2V0LAoJCSAgICAoaW50KXNpemUsIHN0cmVycm9yKGVycm5vKSk7Cgl9CgoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludApkcm1faW50ZWxfZ2VtX2dldF9waXBlX2Zyb21fY3J0Y19pZChkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsIGludCBjcnRjX2lkKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBidWZtZ3I7CglzdHJ1Y3QgZHJtX2k5MTVfZ2V0X3BpcGVfZnJvbV9jcnRjX2lkIGdldF9waXBlX2Zyb21fY3J0Y19pZDsKCWludCByZXQ7CgoJbWVtY2xlYXIoZ2V0X3BpcGVfZnJvbV9jcnRjX2lkKTsKCWdldF9waXBlX2Zyb21fY3J0Y19pZC5jcnRjX2lkID0gY3J0Y19pZDsKCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAoJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRVRfUElQRV9GUk9NX0NSVENfSUQsCgkJICAgICAgICZnZXRfcGlwZV9mcm9tX2NydGNfaWQpOwoJaWYgKHJldCAhPSAwKSB7CgkJLyogV2UgcmV0dXJuIC0xIGhlcmUgdG8gc2lnbmFsIHRoYXQgd2UgZG9uJ3QKCQkgKiBrbm93IHdoaWNoIHBpcGUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY3J0Yy4KCQkgKiBUaGlzIGxldHMgdGhlIGNhbGxlciBrbm93IHRoYXQgdGhpcyBpbmZvcm1hdGlvbgoJCSAqIGlzbid0IGF2YWlsYWJsZTsgdXNpbmcgdGhlIHdyb25nIHBpcGUgZm9yCgkJICogdmJsYW5rIHdhaXRpbmcgY2FuIGNhdXNlIHRoZSBjaGlwc2V0IHRvIGxvY2sgdXAKCQkgKi8KCQlyZXR1cm4gLTE7Cgl9CgoJcmV0dXJuIGdldF9waXBlX2Zyb21fY3J0Y19pZC5waXBlOwp9CgpzdGF0aWMgaW50CmRybV9pbnRlbF9nZW1fYm9fZ2V0X3N1YmRhdGEoZHJtX2ludGVsX2JvICpibywgdW5zaWduZWQgbG9uZyBvZmZzZXQsCgkJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB2b2lkICpkYXRhKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CglzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3ByZWFkIHByZWFkOwoJaW50IHJldDsKCglpZiAoYm9fZ2VtLT5pc191c2VycHRyKQoJCXJldHVybiAtRUlOVkFMOwoKCW1lbWNsZWFyKHByZWFkKTsKCXByZWFkLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKCXByZWFkLm9mZnNldCA9IG9mZnNldDsKCXByZWFkLnNpemUgPSBzaXplOwoJcHJlYWQuZGF0YV9wdHIgPSAodWludDY0X3QpICh1aW50cHRyX3QpIGRhdGE7CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKCQkgICAgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX1BSRUFELAoJCSAgICAgICAmcHJlYWQpOwoJaWYgKHJldCAhPSAwKSB7CgkJcmV0ID0gLWVycm5vOwoJCURCRygiJXM6JWQ6IEVycm9yIHJlYWRpbmcgZGF0YSBmcm9tIGJ1ZmZlciAlZDogKCVkICVkKSAlcyAuXG4iLAoJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGJvX2dlbS0+Z2VtX2hhbmRsZSwgKGludClvZmZzZXQsCgkJICAgIChpbnQpc2l6ZSwgc3RyZXJyb3IoZXJybm8pKTsKCX0KCglyZXR1cm4gcmV0Owp9CgovKiogV2FpdHMgZm9yIGFsbCBHUFUgcmVuZGVyaW5nIHdpdGggdGhlIG9iamVjdCB0byBoYXZlIGNvbXBsZXRlZC4gKi8Kc3RhdGljIHZvaWQKZHJtX2ludGVsX2dlbV9ib193YWl0X3JlbmRlcmluZyhkcm1faW50ZWxfYm8gKmJvKQp7Cglkcm1faW50ZWxfZ2VtX2JvX3N0YXJ0X2d0dF9hY2Nlc3MoYm8sIDEpOwp9CgovKioKICogV2FpdHMgb24gYSBCTyBmb3IgdGhlIGdpdmVuIGFtb3VudCBvZiB0aW1lLgogKgogKiBAYm86IGJ1ZmZlciBvYmplY3QgdG8gd2FpdCBmb3IKICogQHRpbWVvdXRfbnM6IGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgaW4gbmFub3NlY29uZHMuCiAqICAgSWYgdmFsdWUgaXMgbGVzcyB0aGFuIDAsIGFuIGluZmluaXRlIHdhaXQgd2lsbCBvY2N1ci4KICoKICogUmV0dXJucyAwIGlmIHRoZSB3YWl0IHdhcyBzdWNjZXNzZnVsIGllLiB0aGUgbGFzdCBiYXRjaCByZWZlcmVuY2luZyB0aGUKICogb2JqZWN0IGhhcyBjb21wbGV0ZWQgd2l0aGluIHRoZSBhbGxvdHRlZCB0aW1lLiBPdGhlcndpc2Ugc29tZSBuZWdhdGl2ZSByZXR1cm4KICogdmFsdWUgZGVzY3JpYmVzIHRoZSBlcnJvci4gT2YgcGFydGljdWxhciBpbnRlcmVzdCBpcyAtRVRJTUUgd2hlbiB0aGUgd2FpdCBoYXMKICogZmFpbGVkIHRvIHlpZWxkIHRoZSBkZXNpcmVkIHJlc3VsdC4KICoKICogU2ltaWxhciB0byBkcm1faW50ZWxfZ2VtX2JvX3dhaXRfcmVuZGVyaW5nIGV4Y2VwdCBhIHRpbWVvdXQgcGFyYW1ldGVyIGFsbG93cwogKiB0aGUgb3BlcmF0aW9uIHRvIGdpdmUgdXAgYWZ0ZXIgYSBjZXJ0YWluIGFtb3VudCBvZiB0aW1lLiBBbm90aGVyIHN1YnRsZQogKiBkaWZmZXJlbmNlIGlzIHRoZSBpbnRlcm5hbCBsb2NraW5nIHNlbWFudGljcyBhcmUgZGlmZmVyZW50ICh0aGlzIHZhcmlhbnQgZG9lcwogKiBub3QgaG9sZCB0aGUgbG9jayBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB3YWl0KS4gVGhpcyBtYWtlcyB0aGUgd2FpdCBzdWJqZWN0CiAqIHRvIGEgbGFyZ2VyIHVzZXJzcGFjZSByYWNlIHdpbmRvdy4KICoKICogVGhlIGltcGxlbWVudGF0aW9uIHNoYWxsIHdhaXQgdW50aWwgdGhlIG9iamVjdCBpcyBubyBsb25nZXIgYWN0aXZlbHkKICogcmVmZXJlbmNlZCB3aXRoaW4gYSBiYXRjaCBidWZmZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGNhbGwuIFRoZSB3YWl0IHdpbGwKICogbm90IGd1YXJhbnRlZSB0aGF0IHRoZSBidWZmZXIgaXMgcmUtaXNzdWVkIHZpYSBhbm90aGVyIHRocmVhZCwgb3IgYW4gZmxpbmtlZAogKiBoYW5kbGUuIFVzZXJzcGFjZSBtdXN0IG1ha2Ugc3VyZSB0aGlzIHJhY2UgZG9lcyBub3Qgb2NjdXIgaWYgc3VjaCBwcmVjaXNpb24KICogaXMgaW1wb3J0YW50LgogKgogKiBOb3RlIHRoYXQgc29tZSBrZXJuZWxzIGhhdmUgYnJva2VuIHRoZSBpbmlmaXRlIHdhaXQgZm9yIG5lZ2F0aXZlIHZhbHVlcwogKiBwcm9taXNlLCB1cGdyYWRlIHRvIGxhdGVzdCBzdGFibGUga2VybmVscyBpZiB0aGlzIGlzIHRoZSBjYXNlLgogKi8KaW50CmRybV9pbnRlbF9nZW1fYm9fd2FpdChkcm1faW50ZWxfYm8gKmJvLCBpbnQ2NF90IHRpbWVvdXRfbnMpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCXN0cnVjdCBkcm1faTkxNV9nZW1fd2FpdCB3YWl0OwoJaW50IHJldDsKCglpZiAoIWJ1Zm1ncl9nZW0tPmhhc193YWl0X3RpbWVvdXQpIHsKCQlEQkcoIiVzOiVkOiBUaW1lZCB3YWl0IGlzIG5vdCBzdXBwb3J0ZWQuIEZhbGxpbmcgYmFjayB0byAiCgkJICAgICJpbmZpbml0ZSB3YWl0XG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOwoJCWlmICh0aW1lb3V0X25zKSB7CgkJCWRybV9pbnRlbF9nZW1fYm9fd2FpdF9yZW5kZXJpbmcoYm8pOwoJCQlyZXR1cm4gMDsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZHJtX2ludGVsX2dlbV9ib19idXN5KGJvKSA/IC1FVElNRSA6IDA7CgkJfQoJfQoKCW1lbWNsZWFyKHdhaXQpOwoJd2FpdC5ib19oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7Cgl3YWl0LnRpbWVvdXRfbnMgPSB0aW1lb3V0X25zOwoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFTV9XQUlULCAmd2FpdCk7CglpZiAocmV0ID09IC0xKQoJCXJldHVybiAtZXJybm87CgoJcmV0dXJuIHJldDsKfQoKLyoqCiAqIFNldHMgdGhlIG9iamVjdCB0byB0aGUgR1RUIHJlYWQgYW5kIHBvc3NpYmx5IHdyaXRlIGRvbWFpbiwgdXNlZCBieSB0aGUgWAogKiAyRCBkcml2ZXIgaW4gdGhlIGFic2VuY2Ugb2Yga2VybmVsIHN1cHBvcnQgdG8gZG8gZHJtX2ludGVsX2dlbV9ib19tYXBfZ3R0KCkuCiAqCiAqIEluIGNvbWJpbmF0aW9uIHdpdGggZHJtX2ludGVsX2dlbV9ib19waW4oKSBhbmQgbWFudWFsIGZlbmNlIG1hbmFnZW1lbnQsIHdlCiAqIGNhbiBkbyB0aWxlZCBwaXhtYXBzIHRoaXMgd2F5LgogKi8Kdm9pZApkcm1faW50ZWxfZ2VtX2JvX3N0YXJ0X2d0dF9hY2Nlc3MoZHJtX2ludGVsX2JvICpibywgaW50IHdyaXRlX2VuYWJsZSkKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoJc3RydWN0IGRybV9pOTE1X2dlbV9zZXRfZG9tYWluIHNldF9kb21haW47CglpbnQgcmV0OwoKCW1lbWNsZWFyKHNldF9kb21haW4pOwoJc2V0X2RvbWFpbi5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CglzZXRfZG9tYWluLnJlYWRfZG9tYWlucyA9IEk5MTVfR0VNX0RPTUFJTl9HVFQ7CglzZXRfZG9tYWluLndyaXRlX2RvbWFpbiA9IHdyaXRlX2VuYWJsZSA/IEk5MTVfR0VNX0RPTUFJTl9HVFQgOiAwOwoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCgkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9TRVRfRE9NQUlOLAoJCSAgICAgICAmc2V0X2RvbWFpbik7CglpZiAocmV0ICE9IDApIHsKCQlEQkcoIiVzOiVkOiBFcnJvciBzZXR0aW5nIG1lbW9yeSBkb21haW5zICVkICglMDh4ICUwOHgpOiAlcyAuXG4iLAoJCSAgICBfX0ZJTEVfXywgX19MSU5FX18sIGJvX2dlbS0+Z2VtX2hhbmRsZSwKCQkgICAgc2V0X2RvbWFpbi5yZWFkX2RvbWFpbnMsIHNldF9kb21haW4ud3JpdGVfZG9tYWluLAoJCSAgICBzdHJlcnJvcihlcnJubykpOwoJfQp9CgpzdGF0aWMgdm9pZApkcm1faW50ZWxfYnVmbWdyX2dlbV9kZXN0cm95KGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1ncikKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYnVmbWdyOwoJc3RydWN0IGRybV9nZW1fY2xvc2UgY2xvc2VfYm87CglpbnQgaSwgcmV0OwoKCWZyZWUoYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0cyk7CglmcmVlKGJ1Zm1ncl9nZW0tPmV4ZWNfb2JqZWN0cyk7CglmcmVlKGJ1Zm1ncl9nZW0tPmV4ZWNfYm9zKTsKCglwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmJ1Zm1ncl9nZW0tPmxvY2spOwoKCS8qIEZyZWUgYW55IGNhY2hlZCBidWZmZXIgb2JqZWN0cyB3ZSB3ZXJlIGdvaW5nIHRvIHJldXNlICovCglmb3IgKGkgPSAwOyBpIDwgYnVmbWdyX2dlbS0+bnVtX2J1Y2tldHM7IGkrKykgewoJCXN0cnVjdCBkcm1faW50ZWxfZ2VtX2JvX2J1Y2tldCAqYnVja2V0ID0KCQkgICAgJmJ1Zm1ncl9nZW0tPmNhY2hlX2J1Y2tldFtpXTsKCQlkcm1faW50ZWxfYm9fZ2VtICpib19nZW07CgoJCXdoaWxlICghRFJNTElTVEVNUFRZKCZidWNrZXQtPmhlYWQpKSB7CgkJCWJvX2dlbSA9IERSTUxJU1RFTlRSWShkcm1faW50ZWxfYm9fZ2VtLAoJCQkJCSAgICAgIGJ1Y2tldC0+aGVhZC5uZXh0LCBoZWFkKTsKCQkJRFJNTElTVERFTCgmYm9fZ2VtLT5oZWFkKTsKCgkJCWRybV9pbnRlbF9nZW1fYm9fZnJlZSgmYm9fZ2VtLT5ibyk7CgkJfQoJfQoKCS8qIFJlbGVhc2UgdXNlcnB0ciBibyBrZXB0IGhhbmdpbmcgYXJvdW5kIGZvciBvcHRpbWlzYXRpb24uICovCglpZiAoYnVmbWdyX2dlbS0+dXNlcnB0cl9hY3RpdmUucHRyKSB7CgkJbWVtY2xlYXIoY2xvc2VfYm8pOwoJCWNsb3NlX2JvLmhhbmRsZSA9IGJ1Zm1ncl9nZW0tPnVzZXJwdHJfYWN0aXZlLmhhbmRsZTsKCQlyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0dFTV9DTE9TRSwgJmNsb3NlX2JvKTsKCQlmcmVlKGJ1Zm1ncl9nZW0tPnVzZXJwdHJfYWN0aXZlLnB0cik7CgkJaWYgKHJldCkKCQkJZnByaW50ZihzdGRlcnIsCgkJCQkiRmFpbGVkIHRvIHJlbGVhc2UgdGVzdCB1c2VycHRyIG9iamVjdCEgKCVkKSAiCgkJCQkiaTkxNSBrZXJuZWwgZHJpdmVyIG1heSBub3QgYmUgc2FuZSFcbiIsIGVycm5vKTsKCX0KCglmcmVlKGJ1Zm1ncik7Cn0KCi8qKgogKiBBZGRzIHRoZSB0YXJnZXQgYnVmZmVyIHRvIHRoZSB2YWxpZGF0aW9uIGxpc3QgYW5kIGFkZHMgdGhlIHJlbG9jYXRpb24KICogdG8gdGhlIHJlbG9jX2J1ZmZlcidzIHJlbG9jYXRpb24gbGlzdC4KICoKICogVGhlIHJlbG9jYXRpb24gZW50cnkgYXQgdGhlIGdpdmVuIG9mZnNldCBtdXN0IGFscmVhZHkgY29udGFpbiB0aGUKICogcHJlY29tcHV0ZWQgcmVsb2NhdGlvbiB2YWx1ZSwgYmVjYXVzZSB0aGUga2VybmVsIHdpbGwgb3B0aW1pemUgb3V0CiAqIHRoZSByZWxvY2F0aW9uIGVudHJ5IHdyaXRlIHdoZW4gdGhlIGJ1ZmZlciBoYXNuJ3QgbW92ZWQgZnJvbSB0aGUKICogbGFzdCBrbm93biBvZmZzZXQgaW4gdGFyZ2V0X2JvLgogKi8Kc3RhdGljIGludApkb19ib19lbWl0X3JlbG9jKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90IG9mZnNldCwKCQkgZHJtX2ludGVsX2JvICp0YXJnZXRfYm8sIHVpbnQzMl90IHRhcmdldF9vZmZzZXQsCgkJIHVpbnQzMl90IHJlYWRfZG9tYWlucywgdWludDMyX3Qgd3JpdGVfZG9tYWluLAoJCSBib29sIG5lZWRfZmVuY2UpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCWRybV9pbnRlbF9ib19nZW0gKnRhcmdldF9ib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSB0YXJnZXRfYm87Cglib29sIGZlbmNlZF9jb21tYW5kOwoKCWlmIChib19nZW0tPmhhc19lcnJvcikKCQlyZXR1cm4gLUVOT01FTTsKCglpZiAodGFyZ2V0X2JvX2dlbS0+aGFzX2Vycm9yKSB7CgkJYm9fZ2VtLT5oYXNfZXJyb3IgPSB0cnVlOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCS8qIFdlIG5ldmVyIHVzZSBIVyBmZW5jZXMgZm9yIHJlbmRlcmluZyBvbiA5NjUrICovCglpZiAoYnVmbWdyX2dlbS0+Z2VuID49IDQpCgkJbmVlZF9mZW5jZSA9IGZhbHNlOwoKCWZlbmNlZF9jb21tYW5kID0gbmVlZF9mZW5jZTsKCWlmICh0YXJnZXRfYm9fZ2VtLT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19OT05FKQoJCW5lZWRfZmVuY2UgPSBmYWxzZTsKCgkvKiBDcmVhdGUgYSBuZXcgcmVsb2NhdGlvbiBsaXN0IGlmIG5lZWRlZCAqLwoJaWYgKGJvX2dlbS0+cmVsb2NzID09IE5VTEwgJiYgZHJtX2ludGVsX3NldHVwX3JlbG9jX2xpc3QoYm8pKQoJCXJldHVybiAtRU5PTUVNOwoKCS8qIENoZWNrIG92ZXJmbG93ICovCglhc3NlcnQoYm9fZ2VtLT5yZWxvY19jb3VudCA8IGJ1Zm1ncl9nZW0tPm1heF9yZWxvY3MpOwoKCS8qIENoZWNrIGFyZ3MgKi8KCWFzc2VydChvZmZzZXQgPD0gYm8tPnNpemUgLSA0KTsKCWFzc2VydCgod3JpdGVfZG9tYWluICYgKHdyaXRlX2RvbWFpbiAtIDEpKSA9PSAwKTsKCgkvKiBBbiBvYmplY3QgbmVlZGluZyBhIGZlbmNlIGlzIGEgdGlsZWQgYnVmZmVyLCBzbyBpdCB3b24ndCBoYXZlCgkgKiByZWxvY3MgdG8gb3RoZXIgYnVmZmVycy4KCSAqLwoJaWYgKG5lZWRfZmVuY2UpIHsKCQlhc3NlcnQodGFyZ2V0X2JvX2dlbS0+cmVsb2NfY291bnQgPT0gMCk7CgkJdGFyZ2V0X2JvX2dlbS0+cmVsb2NfdHJlZV9mZW5jZXMgPSAxOwoJfQoKCS8qIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIG5vdCBhZGRpbmcgYSByZWxvYyB0byBzb21ldGhpbmcgd2hvc2Ugc2l6ZSBoYXMKCSAqIGFscmVhZHkgYmVlbiBhY2NvdW50ZWQgZm9yLgoJICovCglhc3NlcnQoIWJvX2dlbS0+dXNlZF9hc19yZWxvY190YXJnZXQpOwoJaWYgKHRhcmdldF9ib19nZW0gIT0gYm9fZ2VtKSB7CgkJdGFyZ2V0X2JvX2dlbS0+dXNlZF9hc19yZWxvY190YXJnZXQgPSB0cnVlOwoJCWJvX2dlbS0+cmVsb2NfdHJlZV9zaXplICs9IHRhcmdldF9ib19nZW0tPnJlbG9jX3RyZWVfc2l6ZTsKCQlib19nZW0tPnJlbG9jX3RyZWVfZmVuY2VzICs9IHRhcmdldF9ib19nZW0tPnJlbG9jX3RyZWVfZmVuY2VzOwoJfQoKCWJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm9bYm9fZ2VtLT5yZWxvY19jb3VudF0uYm8gPSB0YXJnZXRfYm87CglpZiAodGFyZ2V0X2JvICE9IGJvKQoJCWRybV9pbnRlbF9nZW1fYm9fcmVmZXJlbmNlKHRhcmdldF9ibyk7CglpZiAoZmVuY2VkX2NvbW1hbmQpCgkJYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mb1tib19nZW0tPnJlbG9jX2NvdW50XS5mbGFncyA9CgkJCURSTV9JTlRFTF9SRUxPQ19GRU5DRTsKCWVsc2UKCQlib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvW2JvX2dlbS0+cmVsb2NfY291bnRdLmZsYWdzID0gMDsKCglib19nZW0tPnJlbG9jc1tib19nZW0tPnJlbG9jX2NvdW50XS5vZmZzZXQgPSBvZmZzZXQ7Cglib19nZW0tPnJlbG9jc1tib19nZW0tPnJlbG9jX2NvdW50XS5kZWx0YSA9IHRhcmdldF9vZmZzZXQ7Cglib19nZW0tPnJlbG9jc1tib19nZW0tPnJlbG9jX2NvdW50XS50YXJnZXRfaGFuZGxlID0KCSAgICB0YXJnZXRfYm9fZ2VtLT5nZW1faGFuZGxlOwoJYm9fZ2VtLT5yZWxvY3NbYm9fZ2VtLT5yZWxvY19jb3VudF0ucmVhZF9kb21haW5zID0gcmVhZF9kb21haW5zOwoJYm9fZ2VtLT5yZWxvY3NbYm9fZ2VtLT5yZWxvY19jb3VudF0ud3JpdGVfZG9tYWluID0gd3JpdGVfZG9tYWluOwoJYm9fZ2VtLT5yZWxvY3NbYm9fZ2VtLT5yZWxvY19jb3VudF0ucHJlc3VtZWRfb2Zmc2V0ID0gdGFyZ2V0X2JvLT5vZmZzZXQ2NDsKCWJvX2dlbS0+cmVsb2NfY291bnQrKzsKCglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQKZHJtX2ludGVsX2dlbV9ib191c2VfNDhiX2FkZHJlc3NfcmFuZ2UoZHJtX2ludGVsX2JvICpibywgdWludDMyX3QgZW5hYmxlKQp7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCglpZiAoZW5hYmxlKQoJCWJvX2dlbS0+a2ZsYWdzIHw9IEVYRUNfT0JKRUNUX1NVUFBPUlRTXzQ4Ql9BRERSRVNTOwoJZWxzZQoJCWJvX2dlbS0+a2ZsYWdzICY9IH5FWEVDX09CSkVDVF9TVVBQT1JUU180OEJfQUREUkVTUzsKfQoKc3RhdGljIGludApkcm1faW50ZWxfZ2VtX2JvX2FkZF9zb2Z0cGluX3RhcmdldChkcm1faW50ZWxfYm8gKmJvLCBkcm1faW50ZWxfYm8gKnRhcmdldF9ibykKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoJZHJtX2ludGVsX2JvX2dlbSAqdGFyZ2V0X2JvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIHRhcmdldF9ibzsKCWlmIChib19nZW0tPmhhc19lcnJvcikKCQlyZXR1cm4gLUVOT01FTTsKCglpZiAodGFyZ2V0X2JvX2dlbS0+aGFzX2Vycm9yKSB7CgkJYm9fZ2VtLT5oYXNfZXJyb3IgPSB0cnVlOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCWlmICghKHRhcmdldF9ib19nZW0tPmtmbGFncyAmIEVYRUNfT0JKRUNUX1BJTk5FRCkpCgkJcmV0dXJuIC1FSU5WQUw7CglpZiAodGFyZ2V0X2JvX2dlbSA9PSBib19nZW0pCgkJcmV0dXJuIC1FSU5WQUw7CgoJaWYgKGJvX2dlbS0+c29mdHBpbl90YXJnZXRfY291bnQgPT0gYm9fZ2VtLT5zb2Z0cGluX3RhcmdldF9zaXplKSB7CgkJaW50IG5ld19zaXplID0gYm9fZ2VtLT5zb2Z0cGluX3RhcmdldF9zaXplICogMjsKCQlpZiAobmV3X3NpemUgPT0gMCkKCQkJbmV3X3NpemUgPSBidWZtZ3JfZ2VtLT5tYXhfcmVsb2NzOwoKCQlib19nZW0tPnNvZnRwaW5fdGFyZ2V0ID0gcmVhbGxvYyhib19nZW0tPnNvZnRwaW5fdGFyZ2V0LCBuZXdfc2l6ZSAqCgkJCQlzaXplb2YoZHJtX2ludGVsX2JvICopKTsKCQlpZiAoIWJvX2dlbS0+c29mdHBpbl90YXJnZXQpCgkJCXJldHVybiAtRU5PTUVNOwoKCQlib19nZW0tPnNvZnRwaW5fdGFyZ2V0X3NpemUgPSBuZXdfc2l6ZTsKCX0KCWJvX2dlbS0+c29mdHBpbl90YXJnZXRbYm9fZ2VtLT5zb2Z0cGluX3RhcmdldF9jb3VudF0gPSB0YXJnZXRfYm87Cglkcm1faW50ZWxfZ2VtX2JvX3JlZmVyZW5jZSh0YXJnZXRfYm8pOwoJYm9fZ2VtLT5zb2Z0cGluX3RhcmdldF9jb3VudCsrOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CmRybV9pbnRlbF9nZW1fYm9fZW1pdF9yZWxvYyhkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCBvZmZzZXQsCgkJCSAgICBkcm1faW50ZWxfYm8gKnRhcmdldF9ibywgdWludDMyX3QgdGFyZ2V0X29mZnNldCwKCQkJICAgIHVpbnQzMl90IHJlYWRfZG9tYWlucywgdWludDMyX3Qgd3JpdGVfZG9tYWluKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKWJvLT5idWZtZ3I7Cglkcm1faW50ZWxfYm9fZ2VtICp0YXJnZXRfYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKil0YXJnZXRfYm87CgoJaWYgKHRhcmdldF9ib19nZW0tPmtmbGFncyAmIEVYRUNfT0JKRUNUX1BJTk5FRCkKCQlyZXR1cm4gZHJtX2ludGVsX2dlbV9ib19hZGRfc29mdHBpbl90YXJnZXQoYm8sIHRhcmdldF9ibyk7CgllbHNlCgkJcmV0dXJuIGRvX2JvX2VtaXRfcmVsb2MoYm8sIG9mZnNldCwgdGFyZ2V0X2JvLCB0YXJnZXRfb2Zmc2V0LAoJCQkJCXJlYWRfZG9tYWlucywgd3JpdGVfZG9tYWluLAoJCQkJCSFidWZtZ3JfZ2VtLT5mZW5jZWRfcmVsb2NzKTsKfQoKc3RhdGljIGludApkcm1faW50ZWxfZ2VtX2JvX2VtaXRfcmVsb2NfZmVuY2UoZHJtX2ludGVsX2JvICpibywgdWludDMyX3Qgb2Zmc2V0LAoJCQkJICBkcm1faW50ZWxfYm8gKnRhcmdldF9ibywKCQkJCSAgdWludDMyX3QgdGFyZ2V0X29mZnNldCwKCQkJCSAgdWludDMyX3QgcmVhZF9kb21haW5zLCB1aW50MzJfdCB3cml0ZV9kb21haW4pCnsKCXJldHVybiBkb19ib19lbWl0X3JlbG9jKGJvLCBvZmZzZXQsIHRhcmdldF9ibywgdGFyZ2V0X29mZnNldCwKCQkJCXJlYWRfZG9tYWlucywgd3JpdGVfZG9tYWluLCB0cnVlKTsKfQoKaW50CmRybV9pbnRlbF9nZW1fYm9fZ2V0X3JlbG9jX2NvdW50KGRybV9pbnRlbF9ibyAqYm8pCnsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoKCXJldHVybiBib19nZW0tPnJlbG9jX2NvdW50Owp9CgovKioKICogUmVtb3ZlcyBleGlzdGluZyByZWxvY2F0aW9uIGVudHJpZXMgaW4gdGhlIEJPIGFmdGVyICJzdGFydCIuCiAqCiAqIFRoaXMgYWxsb3dzIGEgdXNlciB0byBhdm9pZCBhIHR3by1zdGVwIHByb2Nlc3MgZm9yIHN0YXRlIHNldHVwIHdpdGgKICogY291bnRpbmcgdXAgYWxsIHRoZSBidWZmZXIgb2JqZWN0cyBhbmQgZG9pbmcgYQogKiBkcm1faW50ZWxfYnVmbWdyX2NoZWNrX2FwZXJ0dXJlX3NwYWNlKCkgYmVmb3JlIGVtaXR0aW5nIGFueSBvZiB0aGUKICogcmVsb2NhdGlvbnMgZm9yIHRoZSBzdGF0ZSBzZXR1cC4gIEluc3RlYWQsIHNhdmUgdGhlIHN0YXRlIG9mIHRoZQogKiBiYXRjaGJ1ZmZlciBpbmNsdWRpbmcgZHJtX2ludGVsX2dlbV9nZXRfcmVsb2NfY291bnQoKSwgZW1pdCBhbGwgdGhlCiAqIHN0YXRlLCBhbmQgdGhlbiBjaGVjayBpZiBpdCBzdGlsbCBmaXRzIGluIHRoZSBhcGVydHVyZS4KICoKICogQW55IGZ1cnRoZXIgZHJtX2ludGVsX2J1Zm1ncl9jaGVja19hcGVydHVyZV9zcGFjZSgpIHF1ZXJpZXMKICogaW52b2x2aW5nIHRoaXMgYnVmZmVyIGluIHRoZSB0cmVlIGFyZSB1bmRlZmluZWQgYWZ0ZXIgdGhpcyBjYWxsLgogKgogKiBUaGlzIGFsc28gcmVtb3ZlcyBhbGwgc29mdHBpbm5lZCB0YXJnZXRzIGJlaW5nIHJlZmVyZW5jZWQgYnkgdGhlIEJPLgogKi8Kdm9pZApkcm1faW50ZWxfZ2VtX2JvX2NsZWFyX3JlbG9jcyhkcm1faW50ZWxfYm8gKmJvLCBpbnQgc3RhcnQpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCWludCBpOwoJc3RydWN0IHRpbWVzcGVjIHRpbWU7CgoJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0aW1lKTsKCglhc3NlcnQoYm9fZ2VtLT5yZWxvY19jb3VudCA+PSBzdGFydCk7CgoJLyogVW5yZWZlcmVuY2UgdGhlIGNsZWFyZWQgdGFyZ2V0IGJ1ZmZlcnMgKi8KCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CgoJZm9yIChpID0gc3RhcnQ7IGkgPCBib19nZW0tPnJlbG9jX2NvdW50OyBpKyspIHsKCQlkcm1faW50ZWxfYm9fZ2VtICp0YXJnZXRfYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mb1tpXS5ibzsKCQlpZiAoJnRhcmdldF9ib19nZW0tPmJvICE9IGJvKSB7CgkJCWJvX2dlbS0+cmVsb2NfdHJlZV9mZW5jZXMgLT0gdGFyZ2V0X2JvX2dlbS0+cmVsb2NfdHJlZV9mZW5jZXM7CgkJCWRybV9pbnRlbF9nZW1fYm9fdW5yZWZlcmVuY2VfbG9ja2VkX3RpbWVkKCZ0YXJnZXRfYm9fZ2VtLT5ibywKCQkJCQkJCQkgIHRpbWUudHZfc2VjKTsKCQl9Cgl9Cglib19nZW0tPnJlbG9jX2NvdW50ID0gc3RhcnQ7CgoJZm9yIChpID0gMDsgaSA8IGJvX2dlbS0+c29mdHBpbl90YXJnZXRfY291bnQ7IGkrKykgewoJCWRybV9pbnRlbF9ib19nZW0gKnRhcmdldF9ib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBib19nZW0tPnNvZnRwaW5fdGFyZ2V0W2ldOwoJCWRybV9pbnRlbF9nZW1fYm9fdW5yZWZlcmVuY2VfbG9ja2VkX3RpbWVkKCZ0YXJnZXRfYm9fZ2VtLT5ibywgdGltZS50dl9zZWMpOwoJfQoJYm9fZ2VtLT5zb2Z0cGluX3RhcmdldF9jb3VudCA9IDA7CgoJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoKfQoKLyoqCiAqIFdhbGsgdGhlIHRyZWUgb2YgcmVsb2NhdGlvbnMgcm9vdGVkIGF0IEJPIGFuZCBhY2N1bXVsYXRlIHRoZSBsaXN0IG9mCiAqIHZhbGlkYXRpb25zIHRvIGJlIHBlcmZvcm1lZCBhbmQgdXBkYXRlIHRoZSByZWxvY2F0aW9uIGJ1ZmZlcnMgd2l0aAogKiBpbmRleCB2YWx1ZXMgaW50byB0aGUgdmFsaWRhdGlvbiBsaXN0LgogKi8Kc3RhdGljIHZvaWQKZHJtX2ludGVsX2dlbV9ib19wcm9jZXNzX3JlbG9jKGRybV9pbnRlbF9ibyAqYm8pCnsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoJaW50IGk7CgoJaWYgKGJvX2dlbS0+cmVsb2NzID09IE5VTEwpCgkJcmV0dXJuOwoKCWZvciAoaSA9IDA7IGkgPCBib19nZW0tPnJlbG9jX2NvdW50OyBpKyspIHsKCQlkcm1faW50ZWxfYm8gKnRhcmdldF9ibyA9IGJvX2dlbS0+cmVsb2NfdGFyZ2V0X2luZm9baV0uYm87CgoJCWlmICh0YXJnZXRfYm8gPT0gYm8pCgkJCWNvbnRpbnVlOwoKCQlkcm1faW50ZWxfZ2VtX2JvX21hcmtfbW1hcHNfaW5jb2hlcmVudChibyk7CgoJCS8qIENvbnRpbnVlIHdhbGtpbmcgdGhlIHRyZWUgZGVwdGgtZmlyc3QuICovCgkJZHJtX2ludGVsX2dlbV9ib19wcm9jZXNzX3JlbG9jKHRhcmdldF9ibyk7CgoJCS8qIEFkZCB0aGUgdGFyZ2V0IHRvIHRoZSB2YWxpZGF0ZSBsaXN0ICovCgkJZHJtX2ludGVsX2FkZF92YWxpZGF0ZV9idWZmZXIodGFyZ2V0X2JvKTsKCX0KfQoKc3RhdGljIHZvaWQKZHJtX2ludGVsX2dlbV9ib19wcm9jZXNzX3JlbG9jMihkcm1faW50ZWxfYm8gKmJvKQp7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKWJvOwoJaW50IGk7CgoJaWYgKGJvX2dlbS0+cmVsb2NzID09IE5VTEwgJiYgYm9fZ2VtLT5zb2Z0cGluX3RhcmdldCA9PSBOVUxMKQoJCXJldHVybjsKCglmb3IgKGkgPSAwOyBpIDwgYm9fZ2VtLT5yZWxvY19jb3VudDsgaSsrKSB7CgkJZHJtX2ludGVsX2JvICp0YXJnZXRfYm8gPSBib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvW2ldLmJvOwoJCWludCBuZWVkX2ZlbmNlOwoKCQlpZiAodGFyZ2V0X2JvID09IGJvKQoJCQljb250aW51ZTsKCgkJZHJtX2ludGVsX2dlbV9ib19tYXJrX21tYXBzX2luY29oZXJlbnQoYm8pOwoKCQkvKiBDb250aW51ZSB3YWxraW5nIHRoZSB0cmVlIGRlcHRoLWZpcnN0LiAqLwoJCWRybV9pbnRlbF9nZW1fYm9fcHJvY2Vzc19yZWxvYzIodGFyZ2V0X2JvKTsKCgkJbmVlZF9mZW5jZSA9IChib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvW2ldLmZsYWdzICYKCQkJICAgICAgRFJNX0lOVEVMX1JFTE9DX0ZFTkNFKTsKCgkJLyogQWRkIHRoZSB0YXJnZXQgdG8gdGhlIHZhbGlkYXRlIGxpc3QgKi8KCQlkcm1faW50ZWxfYWRkX3ZhbGlkYXRlX2J1ZmZlcjIodGFyZ2V0X2JvLCBuZWVkX2ZlbmNlKTsKCX0KCglmb3IgKGkgPSAwOyBpIDwgYm9fZ2VtLT5zb2Z0cGluX3RhcmdldF9jb3VudDsgaSsrKSB7CgkJZHJtX2ludGVsX2JvICp0YXJnZXRfYm8gPSBib19nZW0tPnNvZnRwaW5fdGFyZ2V0W2ldOwoKCQlpZiAodGFyZ2V0X2JvID09IGJvKQoJCQljb250aW51ZTsKCgkJZHJtX2ludGVsX2dlbV9ib19tYXJrX21tYXBzX2luY29oZXJlbnQoYm8pOwoJCWRybV9pbnRlbF9nZW1fYm9fcHJvY2Vzc19yZWxvYzIodGFyZ2V0X2JvKTsKCQlkcm1faW50ZWxfYWRkX3ZhbGlkYXRlX2J1ZmZlcjIodGFyZ2V0X2JvLCBmYWxzZSk7Cgl9Cn0KCgpzdGF0aWMgdm9pZApkcm1faW50ZWxfdXBkYXRlX2J1ZmZlcl9vZmZzZXRzKGRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtKQp7CglpbnQgaTsKCglmb3IgKGkgPSAwOyBpIDwgYnVmbWdyX2dlbS0+ZXhlY19jb3VudDsgaSsrKSB7CgkJZHJtX2ludGVsX2JvICpibyA9IGJ1Zm1ncl9nZW0tPmV4ZWNfYm9zW2ldOwoJCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoKCQkvKiBVcGRhdGUgdGhlIGJ1ZmZlciBvZmZzZXQgKi8KCQlpZiAoYnVmbWdyX2dlbS0+ZXhlY19vYmplY3RzW2ldLm9mZnNldCAhPSBiby0+b2Zmc2V0NjQpIHsKCQkJREJHKCJCTyAlZCAoJXMpIG1pZ3JhdGVkOiAweCUwOHggJTA4eCAtPiAweCUwOHggJTA4eFxuIiwKCQkJICAgIGJvX2dlbS0+Z2VtX2hhbmRsZSwgYm9fZ2VtLT5uYW1lLAoJCQkgICAgdXBwZXJfMzJfYml0cyhiby0+b2Zmc2V0NjQpLAoJCQkgICAgbG93ZXJfMzJfYml0cyhiby0+b2Zmc2V0NjQpLAoJCQkgICAgdXBwZXJfMzJfYml0cyhidWZtZ3JfZ2VtLT5leGVjX29iamVjdHNbaV0ub2Zmc2V0KSwKCQkJICAgIGxvd2VyXzMyX2JpdHMoYnVmbWdyX2dlbS0+ZXhlY19vYmplY3RzW2ldLm9mZnNldCkpOwoJCQliby0+b2Zmc2V0NjQgPSBidWZtZ3JfZ2VtLT5leGVjX29iamVjdHNbaV0ub2Zmc2V0OwoJCQliby0+b2Zmc2V0ID0gYnVmbWdyX2dlbS0+ZXhlY19vYmplY3RzW2ldLm9mZnNldDsKCQl9Cgl9Cn0KCnN0YXRpYyB2b2lkCmRybV9pbnRlbF91cGRhdGVfYnVmZmVyX29mZnNldHMyIChkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSkKewoJaW50IGk7CgoJZm9yIChpID0gMDsgaSA8IGJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQ7IGkrKykgewoJCWRybV9pbnRlbF9ibyAqYm8gPSBidWZtZ3JfZ2VtLT5leGVjX2Jvc1tpXTsKCQlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKWJvOwoKCQkvKiBVcGRhdGUgdGhlIGJ1ZmZlciBvZmZzZXQgKi8KCQlpZiAoYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0c1tpXS5vZmZzZXQgIT0gYm8tPm9mZnNldDY0KSB7CgkJCS8qIElmIHdlJ3JlIHNlZWluZyBzb2Z0cGlubmVkIG9iamVjdCBoZXJlIGl0IG1lYW5zIHRoYXQgdGhlIGtlcm5lbAoJCQkgKiBoYXMgcmVsb2NhdGVkIG91ciBvYmplY3QuLi4gSW5kaWNhdGluZyBhIHByb2dyYW1taW5nIGVycm9yCgkJCSAqLwoJCQlhc3NlcnQoIShib19nZW0tPmtmbGFncyAmIEVYRUNfT0JKRUNUX1BJTk5FRCkpOwoJCQlEQkcoIkJPICVkICglcykgbWlncmF0ZWQ6IDB4JTA4eCAlMDh4IC0+IDB4JTA4eCAlMDh4XG4iLAoJCQkgICAgYm9fZ2VtLT5nZW1faGFuZGxlLCBib19nZW0tPm5hbWUsCgkJCSAgICB1cHBlcl8zMl9iaXRzKGJvLT5vZmZzZXQ2NCksCgkJCSAgICBsb3dlcl8zMl9iaXRzKGJvLT5vZmZzZXQ2NCksCgkJCSAgICB1cHBlcl8zMl9iaXRzKGJ1Zm1ncl9nZW0tPmV4ZWMyX29iamVjdHNbaV0ub2Zmc2V0KSwKCQkJICAgIGxvd2VyXzMyX2JpdHMoYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0c1tpXS5vZmZzZXQpKTsKCQkJYm8tPm9mZnNldDY0ID0gYnVmbWdyX2dlbS0+ZXhlYzJfb2JqZWN0c1tpXS5vZmZzZXQ7CgkJCWJvLT5vZmZzZXQgPSBidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzW2ldLm9mZnNldDsKCQl9Cgl9Cn0KCnZvaWQKZHJtX2ludGVsX2dlbV9ib19hdWJfZHVtcF9ibXAoZHJtX2ludGVsX2JvICpibywKCQkJICAgICAgaW50IHgxLCBpbnQgeTEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKCQkJICAgICAgZW51bSBhdWJfZHVtcF9ibXBfZm9ybWF0IGZvcm1hdCwKCQkJICAgICAgaW50IHBpdGNoLCBpbnQgb2Zmc2V0KQp7Cn0KCnN0YXRpYyBpbnQKZHJtX2ludGVsX2dlbV9ib19leGVjKGRybV9pbnRlbF9ibyAqYm8sIGludCB1c2VkLAoJCSAgICAgIGRybV9jbGlwX3JlY3RfdCAqIGNsaXByZWN0cywgaW50IG51bV9jbGlwcmVjdHMsIGludCBEUjQpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7CglzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIgZXhlY2J1ZjsKCWludCByZXQsIGk7CgoJaWYgKHRvX2JvX2dlbShibyktPmhhc19lcnJvcikKCQlyZXR1cm4gLUVOT01FTTsKCglwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoJLyogVXBkYXRlIGluZGljZXMgYW5kIHNldCB1cCB0aGUgdmFsaWRhdGUgbGlzdC4gKi8KCWRybV9pbnRlbF9nZW1fYm9fcHJvY2Vzc19yZWxvYyhibyk7CgoJLyogQWRkIHRoZSBiYXRjaCBidWZmZXIgdG8gdGhlIHZhbGlkYXRpb24gbGlzdC4gIFRoZXJlIGFyZSBubwoJICogcmVsb2NhdGlvbnMgcG9pbnRpbmcgdG8gaXQuCgkgKi8KCWRybV9pbnRlbF9hZGRfdmFsaWRhdGVfYnVmZmVyKGJvKTsKCgltZW1jbGVhcihleGVjYnVmKTsKCWV4ZWNidWYuYnVmZmVyc19wdHIgPSAodWludHB0cl90KSBidWZtZ3JfZ2VtLT5leGVjX29iamVjdHM7CglleGVjYnVmLmJ1ZmZlcl9jb3VudCA9IGJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQ7CglleGVjYnVmLmJhdGNoX3N0YXJ0X29mZnNldCA9IDA7CglleGVjYnVmLmJhdGNoX2xlbiA9IHVzZWQ7CglleGVjYnVmLmNsaXByZWN0c19wdHIgPSAodWludHB0cl90KSBjbGlwcmVjdHM7CglleGVjYnVmLm51bV9jbGlwcmVjdHMgPSBudW1fY2xpcHJlY3RzOwoJZXhlY2J1Zi5EUjEgPSAwOwoJZXhlY2J1Zi5EUjQgPSBEUjQ7CgoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCgkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9FWEVDQlVGRkVSLAoJCSAgICAgICAmZXhlY2J1Zik7CglpZiAocmV0ICE9IDApIHsKCQlyZXQgPSAtZXJybm87CgkJaWYgKGVycm5vID09IEVOT1NQQykgewoJCQlEQkcoIkV4ZWNidWZmZXIgZmFpbHMgdG8gcGluLiAiCgkJCSAgICAiRXN0aW1hdGU6ICV1LiBBY3R1YWw6ICV1LiBBdmFpbGFibGU6ICV1XG4iLAoJCQkgICAgZHJtX2ludGVsX2dlbV9lc3RpbWF0ZV9iYXRjaF9zcGFjZShidWZtZ3JfZ2VtLT5leGVjX2JvcywKCQkJCQkJCSAgICAgICBidWZtZ3JfZ2VtLT4KCQkJCQkJCSAgICAgICBleGVjX2NvdW50KSwKCQkJICAgIGRybV9pbnRlbF9nZW1fY29tcHV0ZV9iYXRjaF9zcGFjZShidWZtZ3JfZ2VtLT5leGVjX2JvcywKCQkJCQkJCSAgICAgIGJ1Zm1ncl9nZW0tPgoJCQkJCQkJICAgICAgZXhlY19jb3VudCksCgkJCSAgICAodW5zaWduZWQgaW50KWJ1Zm1ncl9nZW0tPmd0dF9zaXplKTsKCQl9Cgl9Cglkcm1faW50ZWxfdXBkYXRlX2J1ZmZlcl9vZmZzZXRzKGJ1Zm1ncl9nZW0pOwoKCWlmIChidWZtZ3JfZ2VtLT5idWZtZ3IuZGVidWcpCgkJZHJtX2ludGVsX2dlbV9kdW1wX3ZhbGlkYXRpb25fbGlzdChidWZtZ3JfZ2VtKTsKCglmb3IgKGkgPSAwOyBpIDwgYnVmbWdyX2dlbS0+ZXhlY19jb3VudDsgaSsrKSB7CgkJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gdG9fYm9fZ2VtKGJ1Zm1ncl9nZW0tPmV4ZWNfYm9zW2ldKTsKCgkJYm9fZ2VtLT5pZGxlID0gZmFsc2U7CgoJCS8qIERpc2Nvbm5lY3QgdGhlIGJ1ZmZlciBmcm9tIHRoZSB2YWxpZGF0ZSBsaXN0ICovCgkJYm9fZ2VtLT52YWxpZGF0ZV9pbmRleCA9IC0xOwoJCWJ1Zm1ncl9nZW0tPmV4ZWNfYm9zW2ldID0gTlVMTDsKCX0KCWJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQgPSAwOwoJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQKZG9fZXhlYzIoZHJtX2ludGVsX2JvICpibywgaW50IHVzZWQsIGRybV9pbnRlbF9jb250ZXh0ICpjdHgsCgkgZHJtX2NsaXBfcmVjdF90ICpjbGlwcmVjdHMsIGludCBudW1fY2xpcHJlY3RzLCBpbnQgRFI0LAoJIGludCBpbl9mZW5jZSwgaW50ICpvdXRfZmVuY2UsCgkgdW5zaWduZWQgaW50IGZsYWdzKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKWJvLT5idWZtZ3I7CglzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyIGV4ZWNidWY7CglpbnQgcmV0ID0gMDsKCWludCBpOwoKCWlmICh0b19ib19nZW0oYm8pLT5oYXNfZXJyb3IpCgkJcmV0dXJuIC1FTk9NRU07CgoJc3dpdGNoIChmbGFncyAmIDB4NykgewoJZGVmYXVsdDoKCQlyZXR1cm4gLUVJTlZBTDsKCWNhc2UgSTkxNV9FWEVDX0JMVDoKCQlpZiAoIWJ1Zm1ncl9nZW0tPmhhc19ibHQpCgkJCXJldHVybiAtRUlOVkFMOwoJCWJyZWFrOwoJY2FzZSBJOTE1X0VYRUNfQlNEOgoJCWlmICghYnVmbWdyX2dlbS0+aGFzX2JzZCkKCQkJcmV0dXJuIC1FSU5WQUw7CgkJYnJlYWs7CgljYXNlIEk5MTVfRVhFQ19WRUJPWDoKCQlpZiAoIWJ1Zm1ncl9nZW0tPmhhc192ZWJveCkKCQkJcmV0dXJuIC1FSU5WQUw7CgkJYnJlYWs7CgljYXNlIEk5MTVfRVhFQ19SRU5ERVI6CgljYXNlIEk5MTVfRVhFQ19ERUZBVUxUOgoJCWJyZWFrOwoJfQoKCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CgkvKiBVcGRhdGUgaW5kaWNlcyBhbmQgc2V0IHVwIHRoZSB2YWxpZGF0ZSBsaXN0LiAqLwoJZHJtX2ludGVsX2dlbV9ib19wcm9jZXNzX3JlbG9jMihibyk7CgoJLyogQWRkIHRoZSBiYXRjaCBidWZmZXIgdG8gdGhlIHZhbGlkYXRpb24gbGlzdC4gIFRoZXJlIGFyZSBubyByZWxvY2F0aW9ucwoJICogcG9pbnRpbmcgdG8gaXQuCgkgKi8KCWRybV9pbnRlbF9hZGRfdmFsaWRhdGVfYnVmZmVyMihibywgMCk7CgoJbWVtY2xlYXIoZXhlY2J1Zik7CglleGVjYnVmLmJ1ZmZlcnNfcHRyID0gKHVpbnRwdHJfdClidWZtZ3JfZ2VtLT5leGVjMl9vYmplY3RzOwoJZXhlY2J1Zi5idWZmZXJfY291bnQgPSBidWZtZ3JfZ2VtLT5leGVjX2NvdW50OwoJZXhlY2J1Zi5iYXRjaF9zdGFydF9vZmZzZXQgPSAwOwoJZXhlY2J1Zi5iYXRjaF9sZW4gPSB1c2VkOwoJZXhlY2J1Zi5jbGlwcmVjdHNfcHRyID0gKHVpbnRwdHJfdCljbGlwcmVjdHM7CglleGVjYnVmLm51bV9jbGlwcmVjdHMgPSBudW1fY2xpcHJlY3RzOwoJZXhlY2J1Zi5EUjEgPSAwOwoJZXhlY2J1Zi5EUjQgPSBEUjQ7CglleGVjYnVmLmZsYWdzID0gZmxhZ3M7CglpZiAoY3R4ID09IE5VTEwpCgkJaTkxNV9leGVjYnVmZmVyMl9zZXRfY29udGV4dF9pZChleGVjYnVmLCAwKTsKCWVsc2UKCQlpOTE1X2V4ZWNidWZmZXIyX3NldF9jb250ZXh0X2lkKGV4ZWNidWYsIGN0eC0+Y3R4X2lkKTsKCWV4ZWNidWYucnN2ZDIgPSAwOwoJaWYgKGluX2ZlbmNlICE9IC0xKSB7CgkJZXhlY2J1Zi5yc3ZkMiA9IGluX2ZlbmNlOwoJCWV4ZWNidWYuZmxhZ3MgfD0gSTkxNV9FWEVDX0ZFTkNFX0lOOwoJfQoJaWYgKG91dF9mZW5jZSAhPSBOVUxMKSB7CgkJKm91dF9mZW5jZSA9IC0xOwoJCWV4ZWNidWYuZmxhZ3MgfD0gSTkxNV9FWEVDX0ZFTkNFX09VVDsKCX0KCglpZiAoYnVmbWdyX2dlbS0+bm9fZXhlYykKCQlnb3RvIHNraXBfZXhlY3V0aW9uOwoKCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAoJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUjJfV1IsCgkJICAgICAgICZleGVjYnVmKTsKCWlmIChyZXQgIT0gMCkgewoJCXJldCA9IC1lcnJubzsKCQlpZiAocmV0ID09IC1FTk9TUEMpIHsKCQkJREJHKCJFeGVjYnVmZmVyIGZhaWxzIHRvIHBpbi4gIgoJCQkgICAgIkVzdGltYXRlOiAldS4gQWN0dWFsOiAldS4gQXZhaWxhYmxlOiAldVxuIiwKCQkJICAgIGRybV9pbnRlbF9nZW1fZXN0aW1hdGVfYmF0Y2hfc3BhY2UoYnVmbWdyX2dlbS0+ZXhlY19ib3MsCgkJCQkJCQkgICAgICAgYnVmbWdyX2dlbS0+ZXhlY19jb3VudCksCgkJCSAgICBkcm1faW50ZWxfZ2VtX2NvbXB1dGVfYmF0Y2hfc3BhY2UoYnVmbWdyX2dlbS0+ZXhlY19ib3MsCgkJCQkJCQkgICAgICBidWZtZ3JfZ2VtLT5leGVjX2NvdW50KSwKCQkJICAgICh1bnNpZ25lZCBpbnQpIGJ1Zm1ncl9nZW0tPmd0dF9zaXplKTsKCQl9Cgl9Cglkcm1faW50ZWxfdXBkYXRlX2J1ZmZlcl9vZmZzZXRzMihidWZtZ3JfZ2VtKTsKCglpZiAocmV0ID09IDAgJiYgb3V0X2ZlbmNlICE9IE5VTEwpCgkJKm91dF9mZW5jZSA9IGV4ZWNidWYucnN2ZDIgPj4gMzI7Cgpza2lwX2V4ZWN1dGlvbjoKCWlmIChidWZtZ3JfZ2VtLT5idWZtZ3IuZGVidWcpCgkJZHJtX2ludGVsX2dlbV9kdW1wX3ZhbGlkYXRpb25fbGlzdChidWZtZ3JfZ2VtKTsKCglmb3IgKGkgPSAwOyBpIDwgYnVmbWdyX2dlbS0+ZXhlY19jb3VudDsgaSsrKSB7CgkJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gdG9fYm9fZ2VtKGJ1Zm1ncl9nZW0tPmV4ZWNfYm9zW2ldKTsKCgkJYm9fZ2VtLT5pZGxlID0gZmFsc2U7CgoJCS8qIERpc2Nvbm5lY3QgdGhlIGJ1ZmZlciBmcm9tIHRoZSB2YWxpZGF0ZSBsaXN0ICovCgkJYm9fZ2VtLT52YWxpZGF0ZV9pbmRleCA9IC0xOwoJCWJ1Zm1ncl9nZW0tPmV4ZWNfYm9zW2ldID0gTlVMTDsKCX0KCWJ1Zm1ncl9nZW0tPmV4ZWNfY291bnQgPSAwOwoJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQKZHJtX2ludGVsX2dlbV9ib19leGVjMihkcm1faW50ZWxfYm8gKmJvLCBpbnQgdXNlZCwKCQkgICAgICAgZHJtX2NsaXBfcmVjdF90ICpjbGlwcmVjdHMsIGludCBudW1fY2xpcHJlY3RzLAoJCSAgICAgICBpbnQgRFI0KQp7CglyZXR1cm4gZG9fZXhlYzIoYm8sIHVzZWQsIE5VTEwsIGNsaXByZWN0cywgbnVtX2NsaXByZWN0cywgRFI0LAoJCQktMSwgTlVMTCwgSTkxNV9FWEVDX1JFTkRFUik7Cn0KCnN0YXRpYyBpbnQKZHJtX2ludGVsX2dlbV9ib19tcmJfZXhlYzIoZHJtX2ludGVsX2JvICpibywgaW50IHVzZWQsCgkJCWRybV9jbGlwX3JlY3RfdCAqY2xpcHJlY3RzLCBpbnQgbnVtX2NsaXByZWN0cywgaW50IERSNCwKCQkJdW5zaWduZWQgaW50IGZsYWdzKQp7CglyZXR1cm4gZG9fZXhlYzIoYm8sIHVzZWQsIE5VTEwsIGNsaXByZWN0cywgbnVtX2NsaXByZWN0cywgRFI0LAoJCQktMSwgTlVMTCwgZmxhZ3MpOwp9CgppbnQKZHJtX2ludGVsX2dlbV9ib19jb250ZXh0X2V4ZWMoZHJtX2ludGVsX2JvICpibywgZHJtX2ludGVsX2NvbnRleHQgKmN0eCwKCQkJICAgICAgaW50IHVzZWQsIHVuc2lnbmVkIGludCBmbGFncykKewoJcmV0dXJuIGRvX2V4ZWMyKGJvLCB1c2VkLCBjdHgsIE5VTEwsIDAsIDAsIC0xLCBOVUxMLCBmbGFncyk7Cn0KCmludApkcm1faW50ZWxfZ2VtX2JvX2ZlbmNlX2V4ZWMoZHJtX2ludGVsX2JvICpibywKCQkJICAgIGRybV9pbnRlbF9jb250ZXh0ICpjdHgsCgkJCSAgICBpbnQgdXNlZCwKCQkJICAgIGludCBpbl9mZW5jZSwKCQkJICAgIGludCAqb3V0X2ZlbmNlLAoJCQkgICAgdW5zaWduZWQgaW50IGZsYWdzKQp7CglyZXR1cm4gZG9fZXhlYzIoYm8sIHVzZWQsIGN0eCwgTlVMTCwgMCwgMCwgaW5fZmVuY2UsIG91dF9mZW5jZSwgZmxhZ3MpOwp9CgpzdGF0aWMgaW50CmRybV9pbnRlbF9nZW1fYm9fcGluKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90IGFsaWdubWVudCkKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoJc3RydWN0IGRybV9pOTE1X2dlbV9waW4gcGluOwoJaW50IHJldDsKCgltZW1jbGVhcihwaW4pOwoJcGluLmhhbmRsZSA9IGJvX2dlbS0+Z2VtX2hhbmRsZTsKCXBpbi5hbGlnbm1lbnQgPSBhbGlnbm1lbnQ7CgoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCgkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFTV9QSU4sCgkJICAgICAgICZwaW4pOwoJaWYgKHJldCAhPSAwKQoJCXJldHVybiAtZXJybm87CgoJYm8tPm9mZnNldDY0ID0gcGluLm9mZnNldDsKCWJvLT5vZmZzZXQgPSBwaW4ub2Zmc2V0OwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKZHJtX2ludGVsX2dlbV9ib191bnBpbihkcm1faW50ZWxfYm8gKmJvKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CglzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3VucGluIHVucGluOwoJaW50IHJldDsKCgltZW1jbGVhcih1bnBpbik7Cgl1bnBpbi5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CgoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFTV9VTlBJTiwgJnVucGluKTsKCWlmIChyZXQgIT0gMCkKCQlyZXR1cm4gLWVycm5vOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CmRybV9pbnRlbF9nZW1fYm9fc2V0X3RpbGluZ19pbnRlcm5hbChkcm1faW50ZWxfYm8gKmJvLAoJCQkJICAgICB1aW50MzJfdCB0aWxpbmdfbW9kZSwKCQkJCSAgICAgdWludDMyX3Qgc3RyaWRlKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CglzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3NldF90aWxpbmcgc2V0X3RpbGluZzsKCWludCByZXQ7CgoJaWYgKGJvX2dlbS0+Z2xvYmFsX25hbWUgPT0gMCAmJgoJICAgIHRpbGluZ19tb2RlID09IGJvX2dlbS0+dGlsaW5nX21vZGUgJiYKCSAgICBzdHJpZGUgPT0gYm9fZ2VtLT5zdHJpZGUpCgkJcmV0dXJuIDA7CgoJbWVtc2V0KCZzZXRfdGlsaW5nLCAwLCBzaXplb2Yoc2V0X3RpbGluZykpOwoJZG8gewoJCS8qIHNldF90aWxpbmcgaXMgc2xpZ2h0bHkgYnJva2VuIGFuZCBvdmVyd3JpdGVzIHRoZQoJCSAqIGlucHV0IG9uIHRoZSBlcnJvciBwYXRoLCBzbyB3ZSBoYXZlIHRvIG9wZW4gY29kZQoJCSAqIHJtSW9jdGwuCgkJICovCgkJc2V0X3RpbGluZy5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CgkJc2V0X3RpbGluZy50aWxpbmdfbW9kZSA9IHRpbGluZ19tb2RlOwoJCXNldF90aWxpbmcuc3RyaWRlID0gc3RyaWRlOwoKCQlyZXQgPSBpb2N0bChidWZtZ3JfZ2VtLT5mZCwKCQkJICAgIERSTV9JT0NUTF9JOTE1X0dFTV9TRVRfVElMSU5HLAoJCQkgICAgJnNldF90aWxpbmcpOwoJfSB3aGlsZSAocmV0ID09IC0xICYmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQUdBSU4pKTsKCWlmIChyZXQgPT0gLTEpCgkJcmV0dXJuIC1lcnJubzsKCglib19nZW0tPnRpbGluZ19tb2RlID0gc2V0X3RpbGluZy50aWxpbmdfbW9kZTsKCWJvX2dlbS0+c3dpenpsZV9tb2RlID0gc2V0X3RpbGluZy5zd2l6emxlX21vZGU7Cglib19nZW0tPnN0cmlkZSA9IHNldF90aWxpbmcuc3RyaWRlOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKZHJtX2ludGVsX2dlbV9ib19zZXRfdGlsaW5nKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90ICogdGlsaW5nX21vZGUsCgkJCSAgICB1aW50MzJfdCBzdHJpZGUpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJvLT5idWZtZ3I7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCWludCByZXQ7CgoJLyogVGlsaW5nIHdpdGggdXNlcnB0ciBzdXJmYWNlcyBpcyBub3Qgc3VwcG9ydGVkCgkgKiBvbiBhbGwgaGFyZHdhcmUgc28gcmVmdXNlIGl0IGZvciB0aW1lIGJlaW5nLgoJICovCglpZiAoYm9fZ2VtLT5pc191c2VycHRyKQoJCXJldHVybiAtRUlOVkFMOwoKCS8qIExpbmVhciBidWZmZXJzIGhhdmUgbm8gc3RyaWRlLiBCeSBlbnN1cmluZyB0aGF0IHdlIG9ubHkgZXZlciB1c2UKCSAqIHN0cmlkZSAwIHdpdGggbGluZWFyIGJ1ZmZlcnMsIHdlIHNpbXBsaWZ5IG91ciBjb2RlLgoJICovCglpZiAoKnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX05PTkUpCgkJc3RyaWRlID0gMDsKCglyZXQgPSBkcm1faW50ZWxfZ2VtX2JvX3NldF90aWxpbmdfaW50ZXJuYWwoYm8sICp0aWxpbmdfbW9kZSwgc3RyaWRlKTsKCWlmIChyZXQgPT0gMCkKCQlkcm1faW50ZWxfYm9fZ2VtX3NldF9pbl9hcGVydHVyZV9zaXplKGJ1Zm1ncl9nZW0sIGJvX2dlbSwgMCk7CgoJKnRpbGluZ19tb2RlID0gYm9fZ2VtLT50aWxpbmdfbW9kZTsKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQKZHJtX2ludGVsX2dlbV9ib19nZXRfdGlsaW5nKGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90ICogdGlsaW5nX21vZGUsCgkJCSAgICB1aW50MzJfdCAqIHN3aXp6bGVfbW9kZSkKewoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CgoJKnRpbGluZ19tb2RlID0gYm9fZ2VtLT50aWxpbmdfbW9kZTsKCSpzd2l6emxlX21vZGUgPSBib19nZW0tPnN3aXp6bGVfbW9kZTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CmRybV9pbnRlbF9nZW1fYm9fc2V0X3NvZnRwaW5fb2Zmc2V0KGRybV9pbnRlbF9ibyAqYm8sIHVpbnQ2NF90IG9mZnNldCkKewoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CgoJYm8tPm9mZnNldDY0ID0gb2Zmc2V0OwoJYm8tPm9mZnNldCA9IG9mZnNldDsKCWJvX2dlbS0+a2ZsYWdzIHw9IEVYRUNfT0JKRUNUX1BJTk5FRDsKCglyZXR1cm4gMDsKfQoKZHJtX2ludGVsX2JvICoKZHJtX2ludGVsX2JvX2dlbV9jcmVhdGVfZnJvbV9wcmltZShkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsIGludCBwcmltZV9mZCwgaW50IHNpemUpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJ1Zm1ncjsKCWludCByZXQ7Cgl1aW50MzJfdCBoYW5kbGU7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW07CglzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2dldF90aWxpbmcgZ2V0X3RpbGluZzsKCglwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoJcmV0ID0gZHJtUHJpbWVGRFRvSGFuZGxlKGJ1Zm1ncl9nZW0tPmZkLCBwcmltZV9mZCwgJmhhbmRsZSk7CglpZiAocmV0KSB7CgkJREJHKCJjcmVhdGVfZnJvbV9wcmltZTogZmFpbGVkIHRvIG9idGFpbiBoYW5kbGUgZnJvbSBmZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CgkJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoJCXJldHVybiBOVUxMOwoJfQoKCS8qCgkgKiBTZWUgaWYgdGhlIGtlcm5lbCBoYXMgYWxyZWFkeSByZXR1cm5lZCB0aGlzIGJ1ZmZlciB0byB1cy4gSnVzdCBhcwoJICogZm9yIG5hbWVkIGJ1ZmZlcnMsIHdlIG11c3Qgbm90IGNyZWF0ZSB0d28gYm8ncyBwb2ludGluZyBhdCB0aGUgc2FtZQoJICoga2VybmVsIG9iamVjdAoJICovCglIQVNIX0ZJTkQoaGFuZGxlX2hoLCBidWZtZ3JfZ2VtLT5oYW5kbGVfdGFibGUsCgkJICAmaGFuZGxlLCBzaXplb2YoaGFuZGxlKSwgYm9fZ2VtKTsKCWlmIChib19nZW0pIHsKCQlkcm1faW50ZWxfZ2VtX2JvX3JlZmVyZW5jZSgmYm9fZ2VtLT5ibyk7CgkJZ290byBvdXQ7Cgl9CgoJYm9fZ2VtID0gY2FsbG9jKDEsIHNpemVvZigqYm9fZ2VtKSk7CglpZiAoIWJvX2dlbSkKCQlnb3RvIG91dDsKCglhdG9taWNfc2V0KCZib19nZW0tPnJlZmNvdW50LCAxKTsKCURSTUlOSVRMSVNUSEVBRCgmYm9fZ2VtLT52bWFfbGlzdCk7CgoJLyogRGV0ZXJtaW5lIHNpemUgb2YgYm8uICBUaGUgZmQtdG8taGFuZGxlIGlvY3RsIHJlYWxseSBzaG91bGQKCSAqIHJldHVybiB0aGUgc2l6ZSwgYnV0IGl0IGRvZXNuJ3QuICBJZiB3ZSBoYXZlIGtlcm5lbCAzLjEyIG9yCgkgKiBsYXRlciwgd2UgY2FuIGxzZWVrIG9uIHRoZSBwcmltZSBmZCB0byBnZXQgdGhlIHNpemUuICBPbGRlcgoJICoga2VybmVscyB3aWxsIGp1c3QgZmFpbCwgaW4gd2hpY2ggY2FzZSB3ZSBmYWxsIGJhY2sgdG8gdGhlCgkgKiBwcm92aWRlZCAoZXN0aW1hdGVkIG9yIGd1ZXNzIHNpemUpLiAqLwoJcmV0ID0gbHNlZWsocHJpbWVfZmQsIDAsIFNFRUtfRU5EKTsKCWlmIChyZXQgIT0gLTEpCgkJYm9fZ2VtLT5iby5zaXplID0gcmV0OwoJZWxzZQoJCWJvX2dlbS0+Ym8uc2l6ZSA9IHNpemU7CgoJYm9fZ2VtLT5iby5oYW5kbGUgPSBoYW5kbGU7Cglib19nZW0tPmJvLmJ1Zm1nciA9IGJ1Zm1ncjsKCglib19nZW0tPmdlbV9oYW5kbGUgPSBoYW5kbGU7CglIQVNIX0FERChoYW5kbGVfaGgsIGJ1Zm1ncl9nZW0tPmhhbmRsZV90YWJsZSwKCQkgZ2VtX2hhbmRsZSwgc2l6ZW9mKGJvX2dlbS0+Z2VtX2hhbmRsZSksIGJvX2dlbSk7CgoJYm9fZ2VtLT5uYW1lID0gInByaW1lIjsKCWJvX2dlbS0+dmFsaWRhdGVfaW5kZXggPSAtMTsKCWJvX2dlbS0+cmVsb2NfdHJlZV9mZW5jZXMgPSAwOwoJYm9fZ2VtLT51c2VkX2FzX3JlbG9jX3RhcmdldCA9IGZhbHNlOwoJYm9fZ2VtLT5oYXNfZXJyb3IgPSBmYWxzZTsKCWJvX2dlbS0+cmV1c2FibGUgPSBmYWxzZTsKCgltZW1jbGVhcihnZXRfdGlsaW5nKTsKCWdldF90aWxpbmcuaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOwoJaWYgKGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAoJCSAgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX0dFVF9USUxJTkcsCgkJICAgICAmZ2V0X3RpbGluZykpCgkJZ290byBlcnI7CgoJYm9fZ2VtLT50aWxpbmdfbW9kZSA9IGdldF90aWxpbmcudGlsaW5nX21vZGU7Cglib19nZW0tPnN3aXp6bGVfbW9kZSA9IGdldF90aWxpbmcuc3dpenpsZV9tb2RlOwoJLyogWFhYIHN0cmlkZSBpcyB1bmtub3duICovCglkcm1faW50ZWxfYm9fZ2VtX3NldF9pbl9hcGVydHVyZV9zaXplKGJ1Zm1ncl9nZW0sIGJvX2dlbSwgMCk7CgpvdXQ6CglwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CglyZXR1cm4gJmJvX2dlbS0+Ym87CgplcnI6Cglkcm1faW50ZWxfZ2VtX2JvX2ZyZWUoJmJvX2dlbS0+Ym8pOwoJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoJcmV0dXJuIE5VTEw7Cn0KCmludApkcm1faW50ZWxfYm9fZ2VtX2V4cG9ydF90b19wcmltZShkcm1faW50ZWxfYm8gKmJvLCBpbnQgKnByaW1lX2ZkKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CgoJaWYgKGRybVByaW1lSGFuZGxlVG9GRChidWZtZ3JfZ2VtLT5mZCwgYm9fZ2VtLT5nZW1faGFuZGxlLAoJCQkgICAgICAgRFJNX0NMT0VYRUMsIHByaW1lX2ZkKSAhPSAwKQoJCXJldHVybiAtZXJybm87CgoJYm9fZ2VtLT5yZXVzYWJsZSA9IGZhbHNlOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CmRybV9pbnRlbF9nZW1fYm9fZmxpbmsoZHJtX2ludGVsX2JvICpibywgdWludDMyX3QgKiBuYW1lKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBiby0+YnVmbWdyOwoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CgoJaWYgKCFib19nZW0tPmdsb2JhbF9uYW1lKSB7CgkJc3RydWN0IGRybV9nZW1fZmxpbmsgZmxpbms7CgoJCW1lbWNsZWFyKGZsaW5rKTsKCQlmbGluay5oYW5kbGUgPSBib19nZW0tPmdlbV9oYW5kbGU7CgkJaWYgKGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfR0VNX0ZMSU5LLCAmZmxpbmspKQoJCQlyZXR1cm4gLWVycm5vOwoKCQlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoJCWlmICghYm9fZ2VtLT5nbG9iYWxfbmFtZSkgewoJCQlib19nZW0tPmdsb2JhbF9uYW1lID0gZmxpbmsubmFtZTsKCQkJYm9fZ2VtLT5yZXVzYWJsZSA9IGZhbHNlOwoKCQkJSEFTSF9BREQobmFtZV9oaCwgYnVmbWdyX2dlbS0+bmFtZV90YWJsZSwKCQkJCSBnbG9iYWxfbmFtZSwgc2l6ZW9mKGJvX2dlbS0+Z2xvYmFsX25hbWUpLAoJCQkJIGJvX2dlbSk7CgkJfQoJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKCX0KCgkqbmFtZSA9IGJvX2dlbS0+Z2xvYmFsX25hbWU7CglyZXR1cm4gMDsKfQoKLyoqCiAqIEVuYWJsZXMgdW5saW1pdGVkIGNhY2hpbmcgb2YgYnVmZmVyIG9iamVjdHMgZm9yIHJldXNlLgogKgogKiBUaGlzIGlzIHBvdGVudGlhbGx5IHZlcnkgbWVtb3J5IGV4cGVuc2l2ZSwgYXMgdGhlIGNhY2hlIGF0IGVhY2ggYnVja2V0CiAqIHNpemUgaXMgb25seSBib3VuZGVkIGJ5IGhvdyBtYW55IGJ1ZmZlcnMgb2YgdGhhdCBzaXplIHdlJ3ZlIG1hbmFnZWQgdG8gaGF2ZQogKiBpbiBmbGlnaHQgYXQgb25jZS4KICovCnZvaWQKZHJtX2ludGVsX2J1Zm1ncl9nZW1fZW5hYmxlX3JldXNlKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1ncikKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYnVmbWdyOwoKCWJ1Zm1ncl9nZW0tPmJvX3JldXNlID0gdHJ1ZTsKfQoKLyoqCiAqIERpc2FibGVzIGltcGxpY2l0IHN5bmNocm9uaXNhdGlvbiBiZWZvcmUgZXhlY3V0aW5nIHRoZSBibwogKgogKiBUaGlzIHdpbGwgY2F1c2UgcmVuZGVyaW5nIGNvcnJ1cHRpb24gdW5sZXNzIHlvdSBjb3JyZWN0bHkgbWFuYWdlIGV4cGxpY2l0CiAqIGZlbmNlcyBmb3IgYWxsIHJlbmRlcmluZyBpbnZvbHZpbmcgdGhpcyBidWZmZXIgLSBpbmNsdWRpbmcgdXNlIGJ5IG90aGVycy4KICogRGlzYWJsaW5nIHRoZSBpbXBsaWNpdCBzZXJpYWxpc2F0aW9uIGlzIG9ubHkgcmVxdWlyZWQgaWYgdGhhdCBzZXJpYWxpc2F0aW9uCiAqIGlzIHRvbyBjb2Fyc2UgKGZvciBleGFtcGxlLCB5b3UgaGF2ZSBzcGxpdCB0aGUgYnVmZmVyIGludG8gbWFueQogKiBub24tb3ZlcmxhcHBpbmcgcmVnaW9ucyBhbmQgYXJlIHNoYXJpbmcgdGhlIHdob2xlIGJ1ZmZlciBiZXR3ZWVuIGNvbmN1cnJlbnQKICogaW5kZXBlbmRlbnQgY29tbWFuZCBzdHJlYW1zKS4KICoKICogTm90ZSB0aGUga2VybmVsIG11c3QgYWR2ZXJ0aXNlIHN1cHBvcnQgdmlhIEk5MTVfUEFSQU1fSEFTX0VYRUNfQVNZTkMsCiAqIHdoaWNoIGNhbiBiZSBjaGVja2VkIHVzaW5nIGRybV9pbnRlbF9idWZtZ3JfY2FuX2Rpc2FibGVfaW1wbGljaXRfc3luYywKICogb3Igc3Vic2VxdWVudCBleGVjYnVmcyBpbnZvbHZpbmcgdGhlIGJvIHdpbGwgZ2VuZXJhdGUgRUlOVkFMLgogKi8Kdm9pZApkcm1faW50ZWxfZ2VtX2JvX2Rpc2FibGVfaW1wbGljaXRfc3luYyhkcm1faW50ZWxfYm8gKmJvKQp7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCglib19nZW0tPmtmbGFncyB8PSBFWEVDX09CSkVDVF9BU1lOQzsKfQoKLyoqCiAqIEVuYWJsZXMgaW1wbGljaXQgc3luY2hyb25pc2F0aW9uIGJlZm9yZSBleGVjdXRpbmcgdGhlIGJvCiAqCiAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIHRoZSBrZXJuZWwsIHRvIHdhaXQgdXBvbiBwcmlvciB3cml0ZXMKICogY29tcGxldGluZyBvbiB0aGUgb2JqZWN0IGJlZm9yZSByZW5kZXJpbmcgd2l0aCBpdCwgb3IgdG8gd2FpdCBmb3IgcHJpb3IKICogcmVhZHMgdG8gY29tcGxldGUgYmVmb3JlIHdyaXRpbmcgaW50byB0aGUgb2JqZWN0LgogKiBkcm1faW50ZWxfZ2VtX2JvX2Rpc2FibGVfaW1wbGljaXRfc3luYygpIGNhbiBzdG9wIHRoaXMgYmVoYXZpb3VyLCB0ZWxsaW5nCiAqIHRoZSBrZXJuZWwgbmV2ZXIgdG8gaW5zZXJ0IGEgc3RhbGwgYmVmb3JlIHVzaW5nIHRoZSBvYmplY3QuIFRoZW4gdGhpcwogKiBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN0b3JlIHRoZSBpbXBsaWNpdCBzeW5jIGJlZm9yZSBzdWJzZXF1ZW50CiAqIHJlbmRlcmluZy4KICovCnZvaWQKZHJtX2ludGVsX2dlbV9ib19lbmFibGVfaW1wbGljaXRfc3luYyhkcm1faW50ZWxfYm8gKmJvKQp7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCglib19nZW0tPmtmbGFncyAmPSB+RVhFQ19PQkpFQ1RfQVNZTkM7Cn0KCi8qKgogKiBRdWVyeSB3aGV0aGVyIHRoZSBrZXJuZWwgc3VwcG9ydHMgZGlzYWJsaW5nIG9mIGl0cyBpbXBsaWNpdCBzeW5jaHJvbmlzYXRpb24KICogYmVmb3JlIGV4ZWNidWYuIFNlZSBkcm1faW50ZWxfZ2VtX2JvX2Rpc2FibGVfaW1wbGljaXRfc3luYygpCiAqLwppbnQKZHJtX2ludGVsX2J1Zm1ncl9nZW1fY2FuX2Rpc2FibGVfaW1wbGljaXRfc3luYyhkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopIGJ1Zm1ncjsKCglyZXR1cm4gYnVmbWdyX2dlbS0+aGFzX2V4ZWNfYXN5bmM7Cn0KCi8qKgogKiBFbmFibGUgdXNlIG9mIGZlbmNlZCByZWxvYyB0eXBlLgogKgogKiBOZXcgY29kZSBzaG91bGQgZW5hYmxlIHRoaXMgdG8gYXZvaWQgdW5uZWNlc3NhcnkgZmVuY2UgcmVnaXN0ZXIKICogYWxsb2NhdGlvbi4gIElmIHRoaXMgb3B0aW9uIGlzIG5vdCBlbmFibGVkLCBhbGwgcmVsb2NzIHdpbGwgaGF2ZSBmZW5jZQogKiByZWdpc3RlciBhbGxvY2F0ZWQuCiAqLwp2b2lkCmRybV9pbnRlbF9idWZtZ3JfZ2VtX2VuYWJsZV9mZW5jZWRfcmVsb2NzKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1ncikKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKilidWZtZ3I7CgoJaWYgKGJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19leGVjID09IGRybV9pbnRlbF9nZW1fYm9fZXhlYzIpCgkJYnVmbWdyX2dlbS0+ZmVuY2VkX3JlbG9jcyA9IHRydWU7Cn0KCi8qKgogKiBSZXR1cm4gdGhlIGFkZGl0aW9uYWwgYXBlcnR1cmUgc3BhY2UgcmVxdWlyZWQgYnkgdGhlIHRyZWUgb2YgYnVmZmVyIG9iamVjdHMKICogcm9vdGVkIGF0IGJvLgogKi8Kc3RhdGljIGludApkcm1faW50ZWxfZ2VtX2JvX2dldF9hcGVydHVyZV9zcGFjZShkcm1faW50ZWxfYm8gKmJvKQp7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCWludCBpOwoJaW50IHRvdGFsID0gMDsKCglpZiAoYm8gPT0gTlVMTCB8fCBib19nZW0tPmluY2x1ZGVkX2luX2NoZWNrX2FwZXJ0dXJlKQoJCXJldHVybiAwOwoKCXRvdGFsICs9IGJvLT5zaXplOwoJYm9fZ2VtLT5pbmNsdWRlZF9pbl9jaGVja19hcGVydHVyZSA9IHRydWU7CgoJZm9yIChpID0gMDsgaSA8IGJvX2dlbS0+cmVsb2NfY291bnQ7IGkrKykKCQl0b3RhbCArPQoJCSAgICBkcm1faW50ZWxfZ2VtX2JvX2dldF9hcGVydHVyZV9zcGFjZShib19nZW0tPgoJCQkJCQkJcmVsb2NfdGFyZ2V0X2luZm9baV0uYm8pOwoKCXJldHVybiB0b3RhbDsKfQoKLyoqCiAqIENvdW50IHRoZSBudW1iZXIgb2YgYnVmZmVycyBpbiB0aGlzIGxpc3QgdGhhdCBuZWVkIGEgZmVuY2UgcmVnCiAqCiAqIElmIHRoZSBjb3VudCBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBhdmFpbGFibGUgcmVncywgd2UnbGwgaGF2ZQogKiB0byBhc2sgdGhlIGNhbGxlciB0byByZXN1Ym1pdCBhIGJhdGNoIHdpdGggZmV3ZXIgdGlsZWQgYnVmZmVycy4KICoKICogVGhpcyBmdW5jdGlvbiBvdmVyLWNvdW50cyBpZiB0aGUgc2FtZSBidWZmZXIgaXMgdXNlZCBtdWx0aXBsZSB0aW1lcy4KICovCnN0YXRpYyB1bnNpZ25lZCBpbnQKZHJtX2ludGVsX2dlbV90b3RhbF9mZW5jZXMoZHJtX2ludGVsX2JvICoqIGJvX2FycmF5LCBpbnQgY291bnQpCnsKCWludCBpOwoJdW5zaWduZWQgaW50IHRvdGFsID0gMDsKCglmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewoJCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvX2FycmF5W2ldOwoKCQlpZiAoYm9fZ2VtID09IE5VTEwpCgkJCWNvbnRpbnVlOwoKCQl0b3RhbCArPSBib19nZW0tPnJlbG9jX3RyZWVfZmVuY2VzOwoJfQoJcmV0dXJuIHRvdGFsOwp9CgovKioKICogQ2xlYXIgdGhlIGZsYWcgc2V0IGJ5IGRybV9pbnRlbF9nZW1fYm9fZ2V0X2FwZXJ0dXJlX3NwYWNlKCkgc28gd2UncmUgcmVhZHkKICogZm9yIHRoZSBuZXh0IGRybV9pbnRlbF9idWZtZ3JfY2hlY2tfYXBlcnR1cmVfc3BhY2UoKSBjYWxsLgogKi8Kc3RhdGljIHZvaWQKZHJtX2ludGVsX2dlbV9ib19jbGVhcl9hcGVydHVyZV9zcGFjZV9mbGFnKGRybV9pbnRlbF9ibyAqYm8pCnsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoJaW50IGk7CgoJaWYgKGJvID09IE5VTEwgfHwgIWJvX2dlbS0+aW5jbHVkZWRfaW5fY2hlY2tfYXBlcnR1cmUpCgkJcmV0dXJuOwoKCWJvX2dlbS0+aW5jbHVkZWRfaW5fY2hlY2tfYXBlcnR1cmUgPSBmYWxzZTsKCglmb3IgKGkgPSAwOyBpIDwgYm9fZ2VtLT5yZWxvY19jb3VudDsgaSsrKQoJCWRybV9pbnRlbF9nZW1fYm9fY2xlYXJfYXBlcnR1cmVfc3BhY2VfZmxhZyhib19nZW0tPgoJCQkJCQkJICAgcmVsb2NfdGFyZ2V0X2luZm9baV0uYm8pOwp9CgovKioKICogUmV0dXJuIGEgY29uc2VydmF0aXZlIGVzdGltYXRlIGZvciB0aGUgYW1vdW50IG9mIGFwZXJ0dXJlIHJlcXVpcmVkCiAqIGZvciBhIGNvbGxlY3Rpb24gb2YgYnVmZmVycy4gVGhpcyBtYXkgZG91YmxlLWNvdW50IHNvbWUgYnVmZmVycy4KICovCnN0YXRpYyB1bnNpZ25lZCBpbnQKZHJtX2ludGVsX2dlbV9lc3RpbWF0ZV9iYXRjaF9zcGFjZShkcm1faW50ZWxfYm8gKipib19hcnJheSwgaW50IGNvdW50KQp7CglpbnQgaTsKCXVuc2lnbmVkIGludCB0b3RhbCA9IDA7CgoJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKCQlkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBib19hcnJheVtpXTsKCQlpZiAoYm9fZ2VtICE9IE5VTEwpCgkJCXRvdGFsICs9IGJvX2dlbS0+cmVsb2NfdHJlZV9zaXplOwoJfQoJcmV0dXJuIHRvdGFsOwp9CgovKioKICogUmV0dXJuIHRoZSBhbW91bnQgb2YgYXBlcnR1cmUgbmVlZGVkIGZvciBhIGNvbGxlY3Rpb24gb2YgYnVmZmVycy4KICogVGhpcyBhdm9pZHMgZG91YmxlIGNvdW50aW5nIGFueSBidWZmZXJzLCBhdCB0aGUgY29zdCBvZiBsb29raW5nCiAqIGF0IGV2ZXJ5IGJ1ZmZlciBpbiB0aGUgc2V0LgogKi8Kc3RhdGljIHVuc2lnbmVkIGludApkcm1faW50ZWxfZ2VtX2NvbXB1dGVfYmF0Y2hfc3BhY2UoZHJtX2ludGVsX2JvICoqYm9fYXJyYXksIGludCBjb3VudCkKewoJaW50IGk7Cgl1bnNpZ25lZCBpbnQgdG90YWwgPSAwOwoKCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CgkJdG90YWwgKz0gZHJtX2ludGVsX2dlbV9ib19nZXRfYXBlcnR1cmVfc3BhY2UoYm9fYXJyYXlbaV0pOwoJCS8qIEZvciB0aGUgZmlyc3QgYnVmZmVyIG9iamVjdCBpbiB0aGUgYXJyYXksIHdlIGdldCBhbgoJCSAqIGFjY3VyYXRlIGNvdW50IGJhY2sgZm9yIGl0cyByZWxvY190cmVlIHNpemUgKHNpbmNlIG5vdGhpbmcKCQkgKiBoYWQgYmVlbiBmbGFnZ2VkIGFzIGJlaW5nIGNvdW50ZWQgeWV0KS4gIFdlIGNhbiBzYXZlIHRoYXQKCQkgKiB2YWx1ZSBvdXQgYXMgYSBtb3JlIGNvbnNlcnZhdGl2ZSByZWxvY190cmVlX3NpemUgdGhhdAoJCSAqIGF2b2lkcyBkb3VibGUtY291bnRpbmcgdGFyZ2V0IGJ1ZmZlcnMuICBTaW5jZSB0aGUgZmlyc3QKCQkgKiBidWZmZXIgaGFwcGVucyB0byB1c3VhbGx5IGJlIHRoZSBiYXRjaCBidWZmZXIgaW4gb3VyCgkJICogY2FsbGVycywgdGhpcyBjYW4gcHVsbCB1cyBiYWNrIGZyb20gZG9pbmcgdGhlIHRyZWUKCQkgKiB3YWxrIG9uIGV2ZXJ5IG5ldyBiYXRjaCBlbWl0LgoJCSAqLwoJCWlmIChpID09IDApIHsKCQkJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0KCQkJICAgIChkcm1faW50ZWxfYm9fZ2VtICopIGJvX2FycmF5W2ldOwoJCQlib19nZW0tPnJlbG9jX3RyZWVfc2l6ZSA9IHRvdGFsOwoJCX0KCX0KCglmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKCQlkcm1faW50ZWxfZ2VtX2JvX2NsZWFyX2FwZXJ0dXJlX3NwYWNlX2ZsYWcoYm9fYXJyYXlbaV0pOwoJcmV0dXJuIHRvdGFsOwp9CgovKioKICogUmV0dXJuIC0xIGlmIHRoZSBiYXRjaGJ1ZmZlciBzaG91bGQgYmUgZmx1c2hlZCBiZWZvcmUgYXR0ZW1wdGluZyB0bwogKiBlbWl0IHJlbmRlcmluZyByZWZlcmVuY2luZyB0aGUgYnVmZmVycyBwb2ludGVkIHRvIGJ5IGJvX2FycmF5LgogKgogKiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgaWYgd2UgdHJ5IHRvIGVtaXQgYSBiYXRjaGJ1ZmZlciB3aXRoIHJlbG9jYXRpb25zCiAqIHRvIGEgdHJlZSBvZiBidWZmZXJzIHRoYXQgd29uJ3Qgc2ltdWx0YW5lb3VzbHkgZml0IGluIHRoZSBhcGVydHVyZSwKICogdGhlIHJlbmRlcmluZyB3aWxsIHJldHVybiBhbiBlcnJvciBhdCBhIHBvaW50IHdoZXJlIHRoZSBzb2Z0d2FyZSBpcyBub3QKICogcHJlcGFyZWQgdG8gcmVjb3ZlciBmcm9tIGl0LgogKgogKiBIb3dldmVyLCB3ZSBhbHNvIHdhbnQgdG8gZW1pdCB0aGUgYmF0Y2hidWZmZXIgc2lnbmlmaWNhbnRseSBiZWZvcmUgd2UgcmVhY2gKICogdGhlIGxpbWl0LCBhcyBhIHNlcmllcyBvZiBiYXRjaGJ1ZmZlcnMgZWFjaCBvZiB3aGljaCByZWZlcmVuY2VzIGJ1ZmZlcnMKICogY292ZXJpbmcgYWxtb3N0IGFsbCBvZiB0aGUgYXBlcnR1cmUgbWVhbnMgdGhhdCBhdCBlYWNoIGVtaXQgd2UgZW5kIHVwCiAqIHdhaXRpbmcgdG8gZXZpY3QgYSBidWZmZXIgZnJvbSB0aGUgbGFzdCByZW5kZXJpbmcsIGFuZCB3ZSBnZXQgc3luY2hyb25vdXMKICogcGVyZm9ybWFuY2UuICBCeSBlbWl0dGluZyBzbWFsbGVyIGJhdGNoYnVmZmVycywgd2UgZWF0IHNvbWUgQ1BVIG92ZXJoZWFkIHRvCiAqIGdldCBiZXR0ZXIgcGFyYWxsZWxpc20uCiAqLwpzdGF0aWMgaW50CmRybV9pbnRlbF9nZW1fY2hlY2tfYXBlcnR1cmVfc3BhY2UoZHJtX2ludGVsX2JvICoqYm9fYXJyYXksIGludCBjb3VudCkKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPQoJICAgIChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKSBib19hcnJheVswXS0+YnVmbWdyOwoJdW5zaWduZWQgaW50IHRvdGFsID0gMDsKCXVuc2lnbmVkIGludCB0aHJlc2hvbGQgPSBidWZtZ3JfZ2VtLT5ndHRfc2l6ZSAqIDMgLyA0OwoJaW50IHRvdGFsX2ZlbmNlczsKCgkvKiBDaGVjayBmb3IgZmVuY2UgcmVnIGNvbnN0cmFpbnRzIGlmIG5lY2Vzc2FyeSAqLwoJaWYgKGJ1Zm1ncl9nZW0tPmF2YWlsYWJsZV9mZW5jZXMpIHsKCQl0b3RhbF9mZW5jZXMgPSBkcm1faW50ZWxfZ2VtX3RvdGFsX2ZlbmNlcyhib19hcnJheSwgY291bnQpOwoJCWlmICh0b3RhbF9mZW5jZXMgPiBidWZtZ3JfZ2VtLT5hdmFpbGFibGVfZmVuY2VzKQoJCQlyZXR1cm4gLUVOT1NQQzsKCX0KCgl0b3RhbCA9IGRybV9pbnRlbF9nZW1fZXN0aW1hdGVfYmF0Y2hfc3BhY2UoYm9fYXJyYXksIGNvdW50KTsKCglpZiAodG90YWwgPiB0aHJlc2hvbGQpCgkJdG90YWwgPSBkcm1faW50ZWxfZ2VtX2NvbXB1dGVfYmF0Y2hfc3BhY2UoYm9fYXJyYXksIGNvdW50KTsKCglpZiAodG90YWwgPiB0aHJlc2hvbGQpIHsKCQlEQkcoImNoZWNrX3NwYWNlOiBvdmVyZmxvd2VkIGF2YWlsYWJsZSBhcGVydHVyZSwgIgoJCSAgICAiJWRrYiB2cyAlZGtiXG4iLAoJCSAgICB0b3RhbCAvIDEwMjQsIChpbnQpYnVmbWdyX2dlbS0+Z3R0X3NpemUgLyAxMDI0KTsKCQlyZXR1cm4gLUVOT1NQQzsKCX0gZWxzZSB7CgkJREJHKCJkcm1fY2hlY2tfc3BhY2U6IHRvdGFsICVka2IgdnMgYnVmZ3IgJWRrYlxuIiwgdG90YWwgLyAxMDI0LAoJCSAgICAoaW50KWJ1Zm1ncl9nZW0tPmd0dF9zaXplIC8gMTAyNCk7CgkJcmV0dXJuIDA7Cgl9Cn0KCi8qCiAqIERpc2FibGUgYnVmZmVyIHJldXNlIGZvciBvYmplY3RzIHdoaWNoIGFyZSBzaGFyZWQgd2l0aCB0aGUga2VybmVsCiAqIGFzIHNjYW5vdXQgYnVmZmVycwogKi8Kc3RhdGljIGludApkcm1faW50ZWxfZ2VtX2JvX2Rpc2FibGVfcmV1c2UoZHJtX2ludGVsX2JvICpibykKewoJZHJtX2ludGVsX2JvX2dlbSAqYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgYm87CgoJYm9fZ2VtLT5yZXVzYWJsZSA9IGZhbHNlOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKZHJtX2ludGVsX2dlbV9ib19pc19yZXVzYWJsZShkcm1faW50ZWxfYm8gKmJvKQp7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCglyZXR1cm4gYm9fZ2VtLT5yZXVzYWJsZTsKfQoKc3RhdGljIGludApfZHJtX2ludGVsX2dlbV9ib19yZWZlcmVuY2VzKGRybV9pbnRlbF9ibyAqYm8sIGRybV9pbnRlbF9ibyAqdGFyZ2V0X2JvKQp7Cglkcm1faW50ZWxfYm9fZ2VtICpib19nZW0gPSAoZHJtX2ludGVsX2JvX2dlbSAqKSBibzsKCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCBib19nZW0tPnJlbG9jX2NvdW50OyBpKyspIHsKCQlpZiAoYm9fZ2VtLT5yZWxvY190YXJnZXRfaW5mb1tpXS5ibyA9PSB0YXJnZXRfYm8pCgkJCXJldHVybiAxOwoJCWlmIChibyA9PSBib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvW2ldLmJvKQoJCQljb250aW51ZTsKCQlpZiAoX2RybV9pbnRlbF9nZW1fYm9fcmVmZXJlbmNlcyhib19nZW0tPnJlbG9jX3RhcmdldF9pbmZvW2ldLmJvLAoJCQkJCQl0YXJnZXRfYm8pKQoJCQlyZXR1cm4gMTsKCX0KCglmb3IgKGkgPSAwOyBpPCBib19nZW0tPnNvZnRwaW5fdGFyZ2V0X2NvdW50OyBpKyspIHsKCQlpZiAoYm9fZ2VtLT5zb2Z0cGluX3RhcmdldFtpXSA9PSB0YXJnZXRfYm8pCgkJCXJldHVybiAxOwoJCWlmIChfZHJtX2ludGVsX2dlbV9ib19yZWZlcmVuY2VzKGJvX2dlbS0+c29mdHBpbl90YXJnZXRbaV0sIHRhcmdldF9ibykpCgkJCXJldHVybiAxOwoJfQoKCXJldHVybiAwOwp9CgovKiogUmV0dXJuIHRydWUgaWYgdGFyZ2V0X2JvIGlzIHJlZmVyZW5jZWQgYnkgYm8ncyByZWxvY2F0aW9uIHRyZWUuICovCnN0YXRpYyBpbnQKZHJtX2ludGVsX2dlbV9ib19yZWZlcmVuY2VzKGRybV9pbnRlbF9ibyAqYm8sIGRybV9pbnRlbF9ibyAqdGFyZ2V0X2JvKQp7Cglkcm1faW50ZWxfYm9fZ2VtICp0YXJnZXRfYm9fZ2VtID0gKGRybV9pbnRlbF9ib19nZW0gKikgdGFyZ2V0X2JvOwoKCWlmIChibyA9PSBOVUxMIHx8IHRhcmdldF9ibyA9PSBOVUxMKQoJCXJldHVybiAwOwoJaWYgKHRhcmdldF9ib19nZW0tPnVzZWRfYXNfcmVsb2NfdGFyZ2V0KQoJCXJldHVybiBfZHJtX2ludGVsX2dlbV9ib19yZWZlcmVuY2VzKGJvLCB0YXJnZXRfYm8pOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCmFkZF9idWNrZXQoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0sIGludCBzaXplKQp7Cgl1bnNpZ25lZCBpbnQgaSA9IGJ1Zm1ncl9nZW0tPm51bV9idWNrZXRzOwoKCWFzc2VydChpIDwgQVJSQVlfU0laRShidWZtZ3JfZ2VtLT5jYWNoZV9idWNrZXQpKTsKCglEUk1JTklUTElTVEhFQUQoJmJ1Zm1ncl9nZW0tPmNhY2hlX2J1Y2tldFtpXS5oZWFkKTsKCWJ1Zm1ncl9nZW0tPmNhY2hlX2J1Y2tldFtpXS5zaXplID0gc2l6ZTsKCWJ1Zm1ncl9nZW0tPm51bV9idWNrZXRzKys7Cn0KCnN0YXRpYyB2b2lkCmluaXRfY2FjaGVfYnVja2V0cyhkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSkKewoJdW5zaWduZWQgbG9uZyBzaXplLCBjYWNoZV9tYXhfc2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQ7CgoJLyogT0ssIHNvIHBvd2VyIG9mIHR3byBidWNrZXRzIHdhcyB0b28gd2FzdGVmdWwgb2YgbWVtb3J5LgoJICogR2l2ZSAzIG90aGVyIHNpemVzIGJldHdlZW4gZWFjaCBwb3dlciBvZiB0d28sIHRvIGhvcGVmdWxseQoJICogY292ZXIgdGhpbmdzIGFjY3VyYXRlbHkgZW5vdWdoLiAgKFRoZSBhbHRlcm5hdGl2ZSBpcwoJICogcHJvYmFibHkgdG8ganVzdCBnbyBmb3IgZXhhY3QgbWF0Y2hpbmcgb2Ygc2l6ZXMsIGFuZCBhc3N1bWUKCSAqIHRoYXQgZm9yIHRoaW5ncyBsaWtlIGNvbXBvc2l0ZWQgd2luZG93IHJlc2l6ZSB0aGUgdGlsZWQKCSAqIHdpZHRoL2hlaWdodCBhbGlnbm1lbnQgYW5kIHJvdW5kaW5nIG9mIHNpemVzIHRvIHBhZ2VzIHdpbGwKCSAqIGdldCB1cyB1c2VmdWwgY2FjaGUgaGl0IHJhdGVzIGFueXdheSkKCSAqLwoJYWRkX2J1Y2tldChidWZtZ3JfZ2VtLCA0MDk2KTsKCWFkZF9idWNrZXQoYnVmbWdyX2dlbSwgNDA5NiAqIDIpOwoJYWRkX2J1Y2tldChidWZtZ3JfZ2VtLCA0MDk2ICogMyk7CgoJLyogSW5pdGlhbGl6ZSB0aGUgbGlua2VkIGxpc3RzIGZvciBCTyByZXVzZSBjYWNoZS4gKi8KCWZvciAoc2l6ZSA9IDQgKiA0MDk2OyBzaXplIDw9IGNhY2hlX21heF9zaXplOyBzaXplICo9IDIpIHsKCQlhZGRfYnVja2V0KGJ1Zm1ncl9nZW0sIHNpemUpOwoKCQlhZGRfYnVja2V0KGJ1Zm1ncl9nZW0sIHNpemUgKyBzaXplICogMSAvIDQpOwoJCWFkZF9idWNrZXQoYnVmbWdyX2dlbSwgc2l6ZSArIHNpemUgKiAyIC8gNCk7CgkJYWRkX2J1Y2tldChidWZtZ3JfZ2VtLCBzaXplICsgc2l6ZSAqIDMgLyA0KTsKCX0KfQoKdm9pZApkcm1faW50ZWxfYnVmbWdyX2dlbV9zZXRfdm1hX2NhY2hlX3NpemUoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLCBpbnQgbGltaXQpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopYnVmbWdyOwoKCWJ1Zm1ncl9nZW0tPnZtYV9tYXggPSBsaW1pdDsKCglkcm1faW50ZWxfZ2VtX2JvX3B1cmdlX3ZtYV9jYWNoZShidWZtZ3JfZ2VtKTsKfQoKc3RhdGljIGludApwYXJzZV9kZXZpZF9vdmVycmlkZShjb25zdCBjaGFyICpkZXZpZF9vdmVycmlkZSkKewoJc3RhdGljIGNvbnN0IHN0cnVjdCB7CgkJY29uc3QgY2hhciAqbmFtZTsKCQlpbnQgcGNpX2lkOwoJfSBuYW1lX21hcFtdID0gewoJCXsgImJydyIsIFBDSV9DSElQX0k5NjVfR00gfSwKCQl7ICJnNHgiLCBQQ0lfQ0hJUF9HTTQ1X0dNIH0sCgkJeyAiaWxrIiwgUENJX0NISVBfSUxEX0cgfSwKCQl7ICJzbmIiLCBQQ0lfQ0hJUF9TQU5EWUJSSURHRV9NX0dUMl9QTFVTIH0sCgkJeyAiaXZiIiwgUENJX0NISVBfSVZZQlJJREdFX1NfR1QyIH0sCgkJeyAiaHN3IiwgUENJX0NISVBfSEFTV0VMTF9DUldfRV9HVDMgfSwKCQl7ICJieXQiLCBQQ0lfQ0hJUF9WQUxMRVlWSUVXXzMgfSwKCQl7ICJiZHciLCAweDE2MjAgfCBCRFdfVUxYIH0sCgkJeyAic2tsIiwgUENJX0NISVBfU0tZTEFLRV9EVF9HVDIgfSwKCQl7ICJrYmwiLCBQQ0lfQ0hJUF9LQUJZTEFLRV9EVF9HVDIgfSwKCX07Cgl1bnNpZ25lZCBpbnQgaTsKCglmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShuYW1lX21hcCk7IGkrKykgewoJCWlmICghc3RyY21wKG5hbWVfbWFwW2ldLm5hbWUsIGRldmlkX292ZXJyaWRlKSkKCQkJcmV0dXJuIG5hbWVfbWFwW2ldLnBjaV9pZDsKCX0KCglyZXR1cm4gc3RydG9kKGRldmlkX292ZXJyaWRlLCBOVUxMKTsKfQoKLyoqCiAqIEdldCB0aGUgUENJIElEIGZvciB0aGUgZGV2aWNlLiAgVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzZXR0aW5nIHRoZQogKiBJTlRFTF9ERVZJRF9PVkVSUklERSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgZGVzaXJlZCBJRC4KICovCnN0YXRpYyBpbnQKZ2V0X3BjaV9kZXZpY2VfaWQoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0pCnsKCWNoYXIgKmRldmlkX292ZXJyaWRlOwoJaW50IGRldmlkID0gMDsKCWludCByZXQ7Cglkcm1faTkxNV9nZXRwYXJhbV90IGdwOwoKCWlmIChnZXRldWlkKCkgPT0gZ2V0dWlkKCkpIHsKCQlkZXZpZF9vdmVycmlkZSA9IGdldGVudigiSU5URUxfREVWSURfT1ZFUlJJREUiKTsKCQlpZiAoZGV2aWRfb3ZlcnJpZGUpIHsKCQkJYnVmbWdyX2dlbS0+bm9fZXhlYyA9IHRydWU7CgkJCXJldHVybiBwYXJzZV9kZXZpZF9vdmVycmlkZShkZXZpZF9vdmVycmlkZSk7CgkJfQoJfQoKCW1lbWNsZWFyKGdwKTsKCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9DSElQU0VUX0lEOwoJZ3AudmFsdWUgPSAmZGV2aWQ7CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CglpZiAocmV0KSB7CgkJZnByaW50ZihzdGRlcnIsICJnZXQgY2hpcCBpZCBmYWlsZWQ6ICVkIFslZF1cbiIsIHJldCwgZXJybm8pOwoJCWZwcmludGYoc3RkZXJyLCAicGFyYW06ICVkLCB2YWw6ICVkXG4iLCBncC5wYXJhbSwgKmdwLnZhbHVlKTsKCX0KCXJldHVybiBkZXZpZDsKfQoKaW50CmRybV9pbnRlbF9idWZtZ3JfZ2VtX2dldF9kZXZpZChkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopYnVmbWdyOwoKCXJldHVybiBidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlOwp9CgovKioKICogU2V0cyB0aGUgQVVCIGZpbGVuYW1lLgogKgogKiBUaGlzIGZ1bmN0aW9uIGhhcyB0byBiZSBjYWxsZWQgYmVmb3JlIGRybV9pbnRlbF9idWZtZ3JfZ2VtX3NldF9hdWJfZHVtcCgpCiAqIGZvciBpdCB0byBoYXZlIGFueSBlZmZlY3QuCiAqLwp2b2lkCmRybV9pbnRlbF9idWZtZ3JfZ2VtX3NldF9hdWJfZmlsZW5hbWUoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLAoJCQkJICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCnsKfQoKLyoqCiAqIFNldHMgdXAgQVVCIGR1bXBpbmcuCiAqCiAqIFRoaXMgaXMgYSB0cmFjZSBmaWxlIGZvcm1hdCB0aGF0IGNhbiBiZSB1c2VkIHdpdGggdGhlIHNpbXVsYXRvci4KICogUGFja2V0cyBhcmUgZW1pdHRlZCBpbiBhIGZvcm1hdCBzb21ld2hhdCBsaWtlIEdQVSBjb21tYW5kIHBhY2tldHMuCiAqIFlvdSBjYW4gc2V0IHVwIGEgR1RUIGFuZCB1cGxvYWQgeW91ciBvYmplY3RzIGludG8gdGhlIHJlZmVyZW5jZWQKICogc3BhY2UsIHRoZW4gc2VuZCBvZmYgYmF0Y2hidWZmZXJzIGFuZCBnZXQgQk1QcyBvdXQgdGhlIG90aGVyIGVuZC4KICovCnZvaWQKZHJtX2ludGVsX2J1Zm1ncl9nZW1fc2V0X2F1Yl9kdW1wKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwgaW50IGVuYWJsZSkKewoJZnByaW50ZihzdGRlcnIsICJsaWJkcm0gYXViIGR1bXBpbmcgaXMgZGVwcmVjYXRlZC5cblxuIgoJCSJVc2UgaW50ZWxfYXViZHVtcCBmcm9tIGludGVsLWdwdS10b29scyBpbnN0ZWFkLiAgSW5zdGFsbCBpbnRlbC1ncHUtdG9vbHMsXG4iCgkJInRoZW4gcnVuIChmb3IgZXhhbXBsZSlcblxuIgoJCSJcdCQgaW50ZWxfYXViZHVtcCAtLW91dHB1dD10cmFjZS5hdWIgZ2x4Z2VhcnMgLWdlb21ldHJ5IDUwMHg1MDBcblxuIgoJCSJTZWUgdGhlIGludGVsX2F1YmR1bXAgbWFuIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy5cbiIpOwp9Cgpkcm1faW50ZWxfY29udGV4dCAqCmRybV9pbnRlbF9nZW1fY29udGV4dF9jcmVhdGUoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKWJ1Zm1ncjsKCXN0cnVjdCBkcm1faTkxNV9nZW1fY29udGV4dF9jcmVhdGUgY3JlYXRlOwoJZHJtX2ludGVsX2NvbnRleHQgKmNvbnRleHQgPSBOVUxMOwoJaW50IHJldDsKCgljb250ZXh0ID0gY2FsbG9jKDEsIHNpemVvZigqY29udGV4dCkpOwoJaWYgKCFjb250ZXh0KQoJCXJldHVybiBOVUxMOwoKCW1lbWNsZWFyKGNyZWF0ZSk7CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VNX0NPTlRFWFRfQ1JFQVRFLCAmY3JlYXRlKTsKCWlmIChyZXQgIT0gMCkgewoJCURCRygiRFJNX0lPQ1RMX0k5MTVfR0VNX0NPTlRFWFRfQ1JFQVRFIGZhaWxlZDogJXNcbiIsCgkJICAgIHN0cmVycm9yKGVycm5vKSk7CgkJZnJlZShjb250ZXh0KTsKCQlyZXR1cm4gTlVMTDsKCX0KCgljb250ZXh0LT5jdHhfaWQgPSBjcmVhdGUuY3R4X2lkOwoJY29udGV4dC0+YnVmbWdyID0gYnVmbWdyOwoKCXJldHVybiBjb250ZXh0Owp9CgppbnQKZHJtX2ludGVsX2dlbV9jb250ZXh0X2dldF9pZChkcm1faW50ZWxfY29udGV4dCAqY3R4LCB1aW50MzJfdCAqY3R4X2lkKQp7CglpZiAoY3R4ID09IE5VTEwpCgkJcmV0dXJuIC1FSU5WQUw7CgoJKmN0eF9pZCA9IGN0eC0+Y3R4X2lkOwoKCXJldHVybiAwOwp9Cgp2b2lkCmRybV9pbnRlbF9nZW1fY29udGV4dF9kZXN0cm95KGRybV9pbnRlbF9jb250ZXh0ICpjdHgpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtOwoJc3RydWN0IGRybV9pOTE1X2dlbV9jb250ZXh0X2Rlc3Ryb3kgZGVzdHJveTsKCWludCByZXQ7CgoJaWYgKGN0eCA9PSBOVUxMKQoJCXJldHVybjsKCgltZW1jbGVhcihkZXN0cm95KTsKCglidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopY3R4LT5idWZtZ3I7CglkZXN0cm95LmN0eF9pZCA9IGN0eC0+Y3R4X2lkOwoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFTV9DT05URVhUX0RFU1RST1ksCgkJICAgICAgICZkZXN0cm95KTsKCWlmIChyZXQgIT0gMCkKCQlmcHJpbnRmKHN0ZGVyciwgIkRSTV9JT0NUTF9JOTE1X0dFTV9DT05URVhUX0RFU1RST1kgZmFpbGVkOiAlc1xuIiwKCQkJc3RyZXJyb3IoZXJybm8pKTsKCglmcmVlKGN0eCk7Cn0KCmludApkcm1faW50ZWxfZ2V0X3Jlc2V0X3N0YXRzKGRybV9pbnRlbF9jb250ZXh0ICpjdHgsCgkJCSAgdWludDMyX3QgKnJlc2V0X2NvdW50LAoJCQkgIHVpbnQzMl90ICphY3RpdmUsCgkJCSAgdWludDMyX3QgKnBlbmRpbmcpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtOwoJc3RydWN0IGRybV9pOTE1X3Jlc2V0X3N0YXRzIHN0YXRzOwoJaW50IHJldDsKCglpZiAoY3R4ID09IE5VTEwpCgkJcmV0dXJuIC1FSU5WQUw7CgoJbWVtY2xlYXIoc3RhdHMpOwoKCWJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKiljdHgtPmJ1Zm1ncjsKCXN0YXRzLmN0eF9pZCA9IGN0eC0+Y3R4X2lkOwoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCgkJICAgICAgIERSTV9JT0NUTF9JOTE1X0dFVF9SRVNFVF9TVEFUUywKCQkgICAgICAgJnN0YXRzKTsKCWlmIChyZXQgPT0gMCkgewoJCWlmIChyZXNldF9jb3VudCAhPSBOVUxMKQoJCQkqcmVzZXRfY291bnQgPSBzdGF0cy5yZXNldF9jb3VudDsKCgkJaWYgKGFjdGl2ZSAhPSBOVUxMKQoJCQkqYWN0aXZlID0gc3RhdHMuYmF0Y2hfYWN0aXZlOwoKCQlpZiAocGVuZGluZyAhPSBOVUxMKQoJCQkqcGVuZGluZyA9IHN0YXRzLmJhdGNoX3BlbmRpbmc7Cgl9CgoJcmV0dXJuIHJldDsKfQoKaW50CmRybV9pbnRlbF9yZWdfcmVhZChkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCgkJICAgdWludDMyX3Qgb2Zmc2V0LAoJCSAgIHVpbnQ2NF90ICpyZXN1bHQpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtID0gKGRybV9pbnRlbF9idWZtZ3JfZ2VtICopYnVmbWdyOwoJc3RydWN0IGRybV9pOTE1X3JlZ19yZWFkIHJlZ19yZWFkOwoJaW50IHJldDsKCgltZW1jbGVhcihyZWdfcmVhZCk7CglyZWdfcmVhZC5vZmZzZXQgPSBvZmZzZXQ7CgoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X1JFR19SRUFELCAmcmVnX3JlYWQpOwoKCSpyZXN1bHQgPSByZWdfcmVhZC52YWw7CglyZXR1cm4gcmV0Owp9CgppbnQKZHJtX2ludGVsX2dldF9zdWJzbGljZV90b3RhbChpbnQgZmQsIHVuc2lnbmVkIGludCAqc3Vic2xpY2VfdG90YWwpCnsKCWRybV9pOTE1X2dldHBhcmFtX3QgZ3A7CglpbnQgcmV0OwoKCW1lbWNsZWFyKGdwKTsKCWdwLnZhbHVlID0gKGludCopc3Vic2xpY2VfdG90YWw7CglncC5wYXJhbSA9IEk5MTVfUEFSQU1fU1VCU0xJQ0VfVE9UQUw7CglyZXQgPSBkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CglpZiAocmV0KQoJCXJldHVybiAtZXJybm87CgoJcmV0dXJuIDA7Cn0KCmludApkcm1faW50ZWxfZ2V0X2V1X3RvdGFsKGludCBmZCwgdW5zaWduZWQgaW50ICpldV90b3RhbCkKewoJZHJtX2k5MTVfZ2V0cGFyYW1fdCBncDsKCWludCByZXQ7CgoJbWVtY2xlYXIoZ3ApOwoJZ3AudmFsdWUgPSAoaW50KilldV90b3RhbDsKCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9FVV9UT1RBTDsKCXJldCA9IGRybUlvY3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSwgJmdwKTsKCWlmIChyZXQpCgkJcmV0dXJuIC1lcnJubzsKCglyZXR1cm4gMDsKfQoKaW50CmRybV9pbnRlbF9nZXRfcG9vbGVkX2V1KGludCBmZCkKewoJZHJtX2k5MTVfZ2V0cGFyYW1fdCBncDsKCWludCByZXQgPSAtMTsKCgltZW1jbGVhcihncCk7CglncC5wYXJhbSA9IEk5MTVfUEFSQU1fSEFTX1BPT0xFRF9FVTsKCWdwLnZhbHVlID0gJnJldDsKCWlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCkpCgkJcmV0dXJuIC1lcnJubzsKCglyZXR1cm4gcmV0Owp9CgppbnQKZHJtX2ludGVsX2dldF9taW5fZXVfaW5fcG9vbChpbnQgZmQpCnsKCWRybV9pOTE1X2dldHBhcmFtX3QgZ3A7CglpbnQgcmV0ID0gLTE7CgoJbWVtY2xlYXIoZ3ApOwoJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX01JTl9FVV9JTl9QT09MOwoJZ3AudmFsdWUgPSAmcmV0OwoJaWYgKGRybUlvY3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSwgJmdwKSkKCQlyZXR1cm4gLWVycm5vOwoKCXJldHVybiByZXQ7Cn0KCi8qKgogKiBBbm5vdGF0ZSB0aGUgZ2l2ZW4gYm8gZm9yIHVzZSBpbiBhdWIgZHVtcGluZy4KICoKICogXHBhcmFtIGFubm90YXRpb25zIGlzIGFuIGFycmF5IG9mIGRybV9pbnRlbF9hdWJfYW5ub3RhdGlvbiBvYmplY3RzCiAqIGRlc2NyaWJpbmcgdGhlIHR5cGUgb2YgZGF0YSBpbiB2YXJpb3VzIHNlY3Rpb25zIG9mIHRoZSBiby4gIEVhY2gKICogZWxlbWVudCBvZiB0aGUgYXJyYXkgc3BlY2lmaWVzIHRoZSB0eXBlIGFuZCBzdWJ0eXBlIG9mIGEgc2VjdGlvbiBvZgogKiB0aGUgYm8sIGFuZCB0aGUgcGFzdC10aGUtZW5kIG9mZnNldCBvZiB0aGF0IHNlY3Rpb24uICBUaGUgZWxlbWVudHMKICogb2YgXGMgYW5ub3RhdGlvbnMgbXVzdCBiZSBzb3J0ZWQgc28gdGhhdCBlbmRpbmdfb2Zmc2V0IGlzCiAqIGluY3JlYXNpbmcuCiAqCiAqIFxwYXJhbSBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBcYyBhbm5vdGF0aW9ucyBhcnJheS4KICogSWYgXGMgY291bnQgaXMgemVybywgdGhlbiBcYyBhbm5vdGF0aW9ucyB3aWxsIG5vdCBiZSBkZXJlZmVyZW5jZWQuCiAqCiAqIEFubm90YXRpb25zIGFyZSBjb3BpZWQgaW50byBhIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUsIHNvIGNhbGxlciBtYXkKICogcmUtdXNlIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSBcYyBhbm5vdGF0aW9ucyBhZnRlciB0aGUgY2FsbAogKiByZXR1cm5zLgogKgogKiBBbm5vdGF0aW9ucyBhcmUgc3RvcmVkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGJvOyB0byByZXNldCB0byB0aGUKICogZGVmYXVsdCBzdGF0ZSAobm8gYW5ub3RhdGlvbnMpLCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBhIFxjIGNvdW50CiAqIG9mIHplcm8uCiAqLwp2b2lkCmRybV9pbnRlbF9idWZtZ3JfZ2VtX3NldF9hdWJfYW5ub3RhdGlvbnMoZHJtX2ludGVsX2JvICpibywKCQkJCQkgZHJtX2ludGVsX2F1Yl9hbm5vdGF0aW9uICphbm5vdGF0aW9ucywKCQkJCQkgdW5zaWduZWQgY291bnQpCnsKfQoKc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBidWZtZ3JfbGlzdF9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CnN0YXRpYyBkcm1NTUxpc3RIZWFkIGJ1Zm1ncl9saXN0ID0geyAmYnVmbWdyX2xpc3QsICZidWZtZ3JfbGlzdCB9OwoKc3RhdGljIGRybV9pbnRlbF9idWZtZ3JfZ2VtICoKZHJtX2ludGVsX2J1Zm1ncl9nZW1fZmluZChpbnQgZmQpCnsKCWRybV9pbnRlbF9idWZtZ3JfZ2VtICpidWZtZ3JfZ2VtOwoKCURSTUxJU1RGT1JFQUNIRU5UUlkoYnVmbWdyX2dlbSwgJmJ1Zm1ncl9saXN0LCBtYW5hZ2VycykgewoJCWlmIChidWZtZ3JfZ2VtLT5mZCA9PSBmZCkgewoJCQlhdG9taWNfaW5jKCZidWZtZ3JfZ2VtLT5yZWZjb3VudCk7CgkJCXJldHVybiBidWZtZ3JfZ2VtOwoJCX0KCX0KCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIHZvaWQKZHJtX2ludGVsX2J1Zm1ncl9nZW1fdW5yZWYoZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbSA9IChkcm1faW50ZWxfYnVmbWdyX2dlbSAqKWJ1Zm1ncjsKCglpZiAoYXRvbWljX2FkZF91bmxlc3MoJmJ1Zm1ncl9nZW0tPnJlZmNvdW50LCAtMSwgMSkpIHsKCQlwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9saXN0X211dGV4KTsKCgkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJ1Zm1ncl9nZW0tPnJlZmNvdW50KSkgewoJCQlEUk1MSVNUREVMKCZidWZtZ3JfZ2VtLT5tYW5hZ2Vycyk7CgkJCWRybV9pbnRlbF9idWZtZ3JfZ2VtX2Rlc3Ryb3koYnVmbWdyKTsKCQl9CgoJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfbGlzdF9tdXRleCk7Cgl9Cn0KCnZvaWQgKmRybV9pbnRlbF9nZW1fYm9fbWFwX19ndHQoZHJtX2ludGVsX2JvICpibykKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoKCWlmIChib19nZW0tPmd0dF92aXJ0dWFsKQoJCXJldHVybiBib19nZW0tPmd0dF92aXJ0dWFsOwoKCWlmIChib19nZW0tPmlzX3VzZXJwdHIpCgkJcmV0dXJuIE5VTEw7CgoJcHRocmVhZF9tdXRleF9sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKCWlmIChib19nZW0tPmd0dF92aXJ0dWFsID09IE5VTEwpIHsKCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXBfZ3R0IG1tYXBfYXJnOwoJCXZvaWQgKnB0cjsKCgkJREJHKCJib19tYXBfZ3R0OiBtbWFwICVkICglcyksIG1hcF9jb3VudD0lZFxuIiwKCQkgICAgYm9fZ2VtLT5nZW1faGFuZGxlLCBib19nZW0tPm5hbWUsIGJvX2dlbS0+bWFwX2NvdW50KTsKCgkJaWYgKGJvX2dlbS0+bWFwX2NvdW50KysgPT0gMCkKCQkJZHJtX2ludGVsX2dlbV9ib19vcGVuX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOwoKCQltZW1jbGVhcihtbWFwX2FyZyk7CgkJbW1hcF9hcmcuaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOwoKCQkvKiBHZXQgdGhlIGZha2Ugb2Zmc2V0IGJhY2suLi4gKi8KCQlwdHIgPSBNQVBfRkFJTEVEOwoJCWlmIChkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwKCQkJICAgICBEUk1fSU9DVExfSTkxNV9HRU1fTU1BUF9HVFQsCgkJCSAgICAgJm1tYXBfYXJnKSA9PSAwKSB7CgkJCS8qIGFuZCBtbWFwIGl0ICovCgkJCXB0ciA9IGRybV9tbWFwKDAsIGJvLT5zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAoJCQkJICAgICAgIE1BUF9TSEFSRUQsIGJ1Zm1ncl9nZW0tPmZkLAoJCQkJICAgICAgIG1tYXBfYXJnLm9mZnNldCk7CgkJfQoJCWlmIChwdHIgPT0gTUFQX0ZBSUxFRCkgewoJCQlpZiAoLS1ib19nZW0tPm1hcF9jb3VudCA9PSAwKQoJCQkJZHJtX2ludGVsX2dlbV9ib19jbG9zZV92bWEoYnVmbWdyX2dlbSwgYm9fZ2VtKTsKCQkJcHRyID0gTlVMTDsKCQl9CgoJCWJvX2dlbS0+Z3R0X3ZpcnR1YWwgPSBwdHI7Cgl9CglwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CgoJcmV0dXJuIGJvX2dlbS0+Z3R0X3ZpcnR1YWw7Cn0KCnZvaWQgKmRybV9pbnRlbF9nZW1fYm9fbWFwX19jcHUoZHJtX2ludGVsX2JvICpibykKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoKCWlmIChib19nZW0tPm1lbV92aXJ0dWFsKQoJCXJldHVybiBib19nZW0tPm1lbV92aXJ0dWFsOwoKCWlmIChib19nZW0tPmlzX3VzZXJwdHIpIHsKCQkvKiBSZXR1cm4gdGhlIHNhbWUgdXNlciBwdHIgKi8KCQlyZXR1cm4gYm9fZ2VtLT51c2VyX3ZpcnR1YWw7Cgl9CgoJcHRocmVhZF9tdXRleF9sb2NrKCZidWZtZ3JfZ2VtLT5sb2NrKTsKCWlmICghYm9fZ2VtLT5tZW1fdmlydHVhbCkgewoJCXN0cnVjdCBkcm1faTkxNV9nZW1fbW1hcCBtbWFwX2FyZzsKCgkJaWYgKGJvX2dlbS0+bWFwX2NvdW50KysgPT0gMCkKCQkJZHJtX2ludGVsX2dlbV9ib19vcGVuX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOwoKCQlEQkcoImJvX21hcDogJWQgKCVzKSwgbWFwX2NvdW50PSVkXG4iLAoJCSAgICBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwgYm9fZ2VtLT5tYXBfY291bnQpOwoKCQltZW1jbGVhcihtbWFwX2FyZyk7CgkJbW1hcF9hcmcuaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOwoJCW1tYXBfYXJnLnNpemUgPSBiby0+c2l6ZTsKCQlpZiAoZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCgkJCSAgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX01NQVAsCgkJCSAgICAgJm1tYXBfYXJnKSkgewoJCQlEQkcoIiVzOiVkOiBFcnJvciBtYXBwaW5nIGJ1ZmZlciAlZCAoJXMpOiAlcyAuXG4iLAoJCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBib19nZW0tPmdlbV9oYW5kbGUsCgkJCSAgICBib19nZW0tPm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CgkJCWlmICgtLWJvX2dlbS0+bWFwX2NvdW50ID09IDApCgkJCQlkcm1faW50ZWxfZ2VtX2JvX2Nsb3NlX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOwoJCX0gZWxzZSB7CgkJCVZHKFZBTEdSSU5EX01BTExPQ0xJS0VfQkxPQ0sobW1hcF9hcmcuYWRkcl9wdHIsIG1tYXBfYXJnLnNpemUsIDAsIDEpKTsKCQkJYm9fZ2VtLT5tZW1fdmlydHVhbCA9ICh2b2lkICopKHVpbnRwdHJfdCkgbW1hcF9hcmcuYWRkcl9wdHI7CgkJfQoJfQoJcHRocmVhZF9tdXRleF91bmxvY2soJmJ1Zm1ncl9nZW0tPmxvY2spOwoKCXJldHVybiBib19nZW0tPm1lbV92aXJ0dWFsOwp9Cgp2b2lkICpkcm1faW50ZWxfZ2VtX2JvX21hcF9fd2MoZHJtX2ludGVsX2JvICpibykKewoJZHJtX2ludGVsX2J1Zm1ncl9nZW0gKmJ1Zm1ncl9nZW0gPSAoZHJtX2ludGVsX2J1Zm1ncl9nZW0gKikgYm8tPmJ1Zm1ncjsKCWRybV9pbnRlbF9ib19nZW0gKmJvX2dlbSA9IChkcm1faW50ZWxfYm9fZ2VtICopIGJvOwoKCWlmIChib19nZW0tPndjX3ZpcnR1YWwpCgkJcmV0dXJuIGJvX2dlbS0+d2NfdmlydHVhbDsKCglpZiAoYm9fZ2VtLT5pc191c2VycHRyKQoJCXJldHVybiBOVUxMOwoKCXB0aHJlYWRfbXV0ZXhfbG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CglpZiAoIWJvX2dlbS0+d2NfdmlydHVhbCkgewoJCXN0cnVjdCBkcm1faTkxNV9nZW1fbW1hcCBtbWFwX2FyZzsKCgkJaWYgKGJvX2dlbS0+bWFwX2NvdW50KysgPT0gMCkKCQkJZHJtX2ludGVsX2dlbV9ib19vcGVuX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOwoKCQlEQkcoImJvX21hcDogJWQgKCVzKSwgbWFwX2NvdW50PSVkXG4iLAoJCSAgICBib19nZW0tPmdlbV9oYW5kbGUsIGJvX2dlbS0+bmFtZSwgYm9fZ2VtLT5tYXBfY291bnQpOwoKCQltZW1jbGVhcihtbWFwX2FyZyk7CgkJbW1hcF9hcmcuaGFuZGxlID0gYm9fZ2VtLT5nZW1faGFuZGxlOwoJCW1tYXBfYXJnLnNpemUgPSBiby0+c2l6ZTsKCQltbWFwX2FyZy5mbGFncyA9IEk5MTVfTU1BUF9XQzsKCQlpZiAoZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsCgkJCSAgICAgRFJNX0lPQ1RMX0k5MTVfR0VNX01NQVAsCgkJCSAgICAgJm1tYXBfYXJnKSkgewoJCQlEQkcoIiVzOiVkOiBFcnJvciBtYXBwaW5nIGJ1ZmZlciAlZCAoJXMpOiAlcyAuXG4iLAoJCQkgICAgX19GSUxFX18sIF9fTElORV9fLCBib19nZW0tPmdlbV9oYW5kbGUsCgkJCSAgICBib19nZW0tPm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CgkJCWlmICgtLWJvX2dlbS0+bWFwX2NvdW50ID09IDApCgkJCQlkcm1faW50ZWxfZ2VtX2JvX2Nsb3NlX3ZtYShidWZtZ3JfZ2VtLCBib19nZW0pOwoJCX0gZWxzZSB7CgkJCVZHKFZBTEdSSU5EX01BTExPQ0xJS0VfQkxPQ0sobW1hcF9hcmcuYWRkcl9wdHIsIG1tYXBfYXJnLnNpemUsIDAsIDEpKTsKCQkJYm9fZ2VtLT53Y192aXJ0dWFsID0gKHZvaWQgKikodWludHB0cl90KSBtbWFwX2FyZy5hZGRyX3B0cjsKCQl9Cgl9CglwdGhyZWFkX211dGV4X3VubG9jaygmYnVmbWdyX2dlbS0+bG9jayk7CgoJcmV0dXJuIGJvX2dlbS0+d2NfdmlydHVhbDsKfQoKLyoqCiAqIEluaXRpYWxpemVzIHRoZSBHRU0gYnVmZmVyIG1hbmFnZXIsIHdoaWNoIHVzZXMgdGhlIGtlcm5lbCB0byBhbGxvY2F0ZSwgbWFwLAogKiBhbmQgbWFuYWdlIG1hcCBidWZmZXIgb2JqZWN0aW9ucy4KICoKICogXHBhcmFtIGZkIEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgb3BlbmVkIERSTSBkZXZpY2UuCiAqLwpkcm1faW50ZWxfYnVmbWdyICoKZHJtX2ludGVsX2J1Zm1ncl9nZW1faW5pdChpbnQgZmQsIGludCBiYXRjaF9zaXplKQp7Cglkcm1faW50ZWxfYnVmbWdyX2dlbSAqYnVmbWdyX2dlbTsKCXN0cnVjdCBkcm1faTkxNV9nZW1fZ2V0X2FwZXJ0dXJlIGFwZXJ0dXJlOwoJZHJtX2k5MTVfZ2V0cGFyYW1fdCBncDsKCWludCByZXQsIHRtcDsKCWJvb2wgZXhlYzIgPSBmYWxzZTsKCglwdGhyZWFkX211dGV4X2xvY2soJmJ1Zm1ncl9saXN0X211dGV4KTsKCglidWZtZ3JfZ2VtID0gZHJtX2ludGVsX2J1Zm1ncl9nZW1fZmluZChmZCk7CglpZiAoYnVmbWdyX2dlbSkKCQlnb3RvIGV4aXQ7CgoJYnVmbWdyX2dlbSA9IGNhbGxvYygxLCBzaXplb2YoKmJ1Zm1ncl9nZW0pKTsKCWlmIChidWZtZ3JfZ2VtID09IE5VTEwpCgkJZ290byBleGl0OwoKCWJ1Zm1ncl9nZW0tPmZkID0gZmQ7CglhdG9taWNfc2V0KCZidWZtZ3JfZ2VtLT5yZWZjb3VudCwgMSk7CgoJaWYgKHB0aHJlYWRfbXV0ZXhfaW5pdCgmYnVmbWdyX2dlbS0+bG9jaywgTlVMTCkgIT0gMCkgewoJCWZyZWUoYnVmbWdyX2dlbSk7CgkJYnVmbWdyX2dlbSA9IE5VTEw7CgkJZ290byBleGl0OwoJfQoKCW1lbWNsZWFyKGFwZXJ0dXJlKTsKCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLAoJCSAgICAgICBEUk1fSU9DVExfSTkxNV9HRU1fR0VUX0FQRVJUVVJFLAoJCSAgICAgICAmYXBlcnR1cmUpOwoKCWlmIChyZXQgPT0gMCkKCQlidWZtZ3JfZ2VtLT5ndHRfc2l6ZSA9IGFwZXJ0dXJlLmFwZXJfYXZhaWxhYmxlX3NpemU7CgllbHNlIHsKCQlmcHJpbnRmKHN0ZGVyciwgIkRSTV9JT0NUTF9JOTE1X0dFTV9BUEVSVFVSRSBmYWlsZWQ6ICVzXG4iLAoJCQlzdHJlcnJvcihlcnJubykpOwoJCWJ1Zm1ncl9nZW0tPmd0dF9zaXplID0gMTI4ICogMTAyNCAqIDEwMjQ7CgkJZnByaW50ZihzdGRlcnIsICJBc3N1bWluZyAlZGtCIGF2YWlsYWJsZSBhcGVydHVyZSBzaXplLlxuIgoJCQkiTWF5IGxlYWQgdG8gcmVkdWNlZCBwZXJmb3JtYW5jZSBvciBpbmNvcnJlY3QgIgoJCQkicmVuZGVyaW5nLlxuIiwKCQkJKGludClidWZtZ3JfZ2VtLT5ndHRfc2l6ZSAvIDEwMjQpOwoJfQoKCWJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UgPSBnZXRfcGNpX2RldmljZV9pZChidWZtZ3JfZ2VtKTsKCglpZiAoSVNfR0VOMihidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlKSkKCQlidWZtZ3JfZ2VtLT5nZW4gPSAyOwoJZWxzZSBpZiAoSVNfR0VOMyhidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlKSkKCQlidWZtZ3JfZ2VtLT5nZW4gPSAzOwoJZWxzZSBpZiAoSVNfR0VONChidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlKSkKCQlidWZtZ3JfZ2VtLT5nZW4gPSA0OwoJZWxzZSBpZiAoSVNfR0VONShidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlKSkKCQlidWZtZ3JfZ2VtLT5nZW4gPSA1OwoJZWxzZSBpZiAoSVNfR0VONihidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlKSkKCQlidWZtZ3JfZ2VtLT5nZW4gPSA2OwoJZWxzZSBpZiAoSVNfR0VONyhidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlKSkKCQlidWZtZ3JfZ2VtLT5nZW4gPSA3OwoJZWxzZSBpZiAoSVNfR0VOOChidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlKSkKCQlidWZtZ3JfZ2VtLT5nZW4gPSA4OwoJZWxzZSBpZiAoSVNfR0VOOShidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlKSkKCQlidWZtZ3JfZ2VtLT5nZW4gPSA5OwoJZWxzZSBpZiAoSVNfR0VOMTAoYnVmbWdyX2dlbS0+cGNpX2RldmljZSkpCgkJYnVmbWdyX2dlbS0+Z2VuID0gMTA7CgllbHNlIHsKCQlmcmVlKGJ1Zm1ncl9nZW0pOwoJCWJ1Zm1ncl9nZW0gPSBOVUxMOwoJCWdvdG8gZXhpdDsKCX0KCglpZiAoSVNfR0VOMyhidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlKSAmJgoJICAgIGJ1Zm1ncl9nZW0tPmd0dF9zaXplID4gMjU2KjEwMjQqMTAyNCkgewoJCS8qIFRoZSB1bm1hcHBhYmxlIHBhcnQgb2YgZ3R0IG9uIGdlbiAzIChpLmUuIGFib3ZlIDI1Nk1CKSBjYW4ndAoJCSAqIGJlIHVzZWQgZm9yIHRpbGVkIGJsaXRzLiBUbyBzaW1wbGlmeSB0aGUgYWNjb3VudGluZywganVzdAoJCSAqIHN1YnRyYWN0IHRoZSB1bm1hcHBhYmxlIHBhcnQgKGZpeGVkIHRvIDI1Nk1CIG9uIGFsbCBrbm93bgoJCSAqIGdlbjMgZGV2aWNlcykgaWYgdGhlIGtlcm5lbCBhZHZlcnRpc2VzIGl0LiAqLwoJCWJ1Zm1ncl9nZW0tPmd0dF9zaXplIC09IDI1NioxMDI0KjEwMjQ7Cgl9CgoJbWVtY2xlYXIoZ3ApOwoJZ3AudmFsdWUgPSAmdG1wOwoKCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9IQVNfRVhFQ0JVRjI7CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CglpZiAoIXJldCkKCQlleGVjMiA9IHRydWU7CgoJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0hBU19CU0Q7CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CglidWZtZ3JfZ2VtLT5oYXNfYnNkID0gcmV0ID09IDA7CgoJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0hBU19CTFQ7CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CglidWZtZ3JfZ2VtLT5oYXNfYmx0ID0gcmV0ID09IDA7CgoJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0hBU19SRUxBWEVEX0ZFTkNJTkc7CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CglidWZtZ3JfZ2VtLT5oYXNfcmVsYXhlZF9mZW5jaW5nID0gcmV0ID09IDA7CgoJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0hBU19FWEVDX0FTWU5DOwoJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNLCAmZ3ApOwoJYnVmbWdyX2dlbS0+aGFzX2V4ZWNfYXN5bmMgPSByZXQgPT0gMDsKCglidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fYWxsb2NfdXNlcnB0ciA9IGNoZWNrX2JvX2FsbG9jX3VzZXJwdHI7CgoJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0hBU19XQUlUX1RJTUVPVVQ7CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CglidWZtZ3JfZ2VtLT5oYXNfd2FpdF90aW1lb3V0ID0gcmV0ID09IDA7CgoJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0hBU19MTEM7CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CglpZiAocmV0ICE9IDApIHsKCQkvKiBLZXJuZWwgZG9lcyBub3Qgc3VwcG9ydHMgSEFTX0xMQyBxdWVyeSwgZmFsbGJhY2sgdG8gR1BVCgkJICogZ2VuZXJhdGlvbiBkZXRlY3Rpb24gYW5kIGFzc3VtZSB0aGF0IHdlIGhhdmUgTExDIG9uIEdFTjYvNwoJCSAqLwoJCWJ1Zm1ncl9nZW0tPmhhc19sbGMgPSAoSVNfR0VONihidWZtZ3JfZ2VtLT5wY2lfZGV2aWNlKSB8CgkJCQlJU19HRU43KGJ1Zm1ncl9nZW0tPnBjaV9kZXZpY2UpKTsKCX0gZWxzZQoJCWJ1Zm1ncl9nZW0tPmhhc19sbGMgPSAqZ3AudmFsdWU7CgoJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0hBU19WRUJPWDsKCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSwgJmdwKTsKCWJ1Zm1ncl9nZW0tPmhhc192ZWJveCA9IChyZXQgPT0gMCkgJiAoKmdwLnZhbHVlID4gMCk7CgoJZ3AucGFyYW0gPSBJOTE1X1BBUkFNX0hBU19FWEVDX1NPRlRQSU47CglyZXQgPSBkcm1Jb2N0bChidWZtZ3JfZ2VtLT5mZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCk7CglpZiAocmV0ID09IDAgJiYgKmdwLnZhbHVlID4gMCkKCQlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fc2V0X3NvZnRwaW5fb2Zmc2V0ID0gZHJtX2ludGVsX2dlbV9ib19zZXRfc29mdHBpbl9vZmZzZXQ7CgoJaWYgKGJ1Zm1ncl9nZW0tPmdlbiA8IDQpIHsKCQlncC5wYXJhbSA9IEk5MTVfUEFSQU1fTlVNX0ZFTkNFU19BVkFJTDsKCQlncC52YWx1ZSA9ICZidWZtZ3JfZ2VtLT5hdmFpbGFibGVfZmVuY2VzOwoJCXJldCA9IGRybUlvY3RsKGJ1Zm1ncl9nZW0tPmZkLCBEUk1fSU9DVExfSTkxNV9HRVRQQVJBTSwgJmdwKTsKCQlpZiAocmV0KSB7CgkJCWZwcmludGYoc3RkZXJyLCAiZ2V0IGZlbmNlcyBmYWlsZWQ6ICVkIFslZF1cbiIsIHJldCwKCQkJCWVycm5vKTsKCQkJZnByaW50ZihzdGRlcnIsICJwYXJhbTogJWQsIHZhbDogJWRcbiIsIGdwLnBhcmFtLAoJCQkJKmdwLnZhbHVlKTsKCQkJYnVmbWdyX2dlbS0+YXZhaWxhYmxlX2ZlbmNlcyA9IDA7CgkJfSBlbHNlIHsKCQkJLyogWFhYIFRoZSBrZXJuZWwgcmVwb3J0cyB0aGUgdG90YWwgbnVtYmVyIG9mIGZlbmNlcywKCQkJICogaW5jbHVkaW5nIGFueSB0aGF0IG1heSBiZSBwaW5uZWQuCgkJCSAqCgkJCSAqIFdlIHByZXN1bWUgdGhhdCB0aGVyZSB3aWxsIGJlIGF0IGxlYXN0IG9uZSBwaW5uZWQKCQkJICogZmVuY2UgZm9yIHRoZSBzY2Fub3V0IGJ1ZmZlciwgYnV0IHRoZXJlIG1heSBiZSBtb3JlCgkJCSAqIHRoYW4gb25lIHNjYW5vdXQgYW5kIHRoZSB1c2VyIG1heSBiZSBtYW51YWxseQoJCQkgKiBwaW5uaW5nIGJ1ZmZlcnMuIExldCdzIG1vdmUgdG8gZXhlY2J1ZmZlcjIgYW5kCgkJCSAqIHRoZXJlYnkgZm9yZ2V0IHRoZSBpbnNhbml0eSBvZiB1c2luZyBmZW5jZXMuLi4KCQkJICovCgkJCWJ1Zm1ncl9nZW0tPmF2YWlsYWJsZV9mZW5jZXMgLT0gMjsKCQkJaWYgKGJ1Zm1ncl9nZW0tPmF2YWlsYWJsZV9mZW5jZXMgPCAwKQoJCQkJYnVmbWdyX2dlbS0+YXZhaWxhYmxlX2ZlbmNlcyA9IDA7CgkJfQoJfQoKCWlmIChidWZtZ3JfZ2VtLT5nZW4gPj0gOCkgewoJCWdwLnBhcmFtID0gSTkxNV9QQVJBTV9IQVNfQUxJQVNJTkdfUFBHVFQ7CgkJcmV0ID0gZHJtSW9jdGwoYnVmbWdyX2dlbS0+ZmQsIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNLCAmZ3ApOwoJCWlmIChyZXQgPT0gMCAmJiAqZ3AudmFsdWUgPT0gMykKCQkJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX3VzZV80OGJfYWRkcmVzc19yYW5nZSA9IGRybV9pbnRlbF9nZW1fYm9fdXNlXzQ4Yl9hZGRyZXNzX3JhbmdlOwoJfQoKCS8qIExldCdzIGdvIHdpdGggb25lIHJlbG9jYXRpb24gcGVyIGV2ZXJ5IDIgZHdvcmRzIChidXQgcm91bmQgZG93biBhIGJpdAoJICogc2luY2UgYSBwb3dlciBvZiB0d28gd2lsbCBtZWFuIGFuIGV4dHJhIHBhZ2UgYWxsb2NhdGlvbiBmb3IgdGhlIHJlbG9jCgkgKiBidWZmZXIpLgoJICoKCSAqIEV2ZXJ5IDQgd2FzIHRvbyBmZXcgZm9yIHRoZSBibGVuZGVyIGJlbmNobWFyay4KCSAqLwoJYnVmbWdyX2dlbS0+bWF4X3JlbG9jcyA9IGJhdGNoX3NpemUgLyBzaXplb2YodWludDMyX3QpIC8gMiAtIDI7CgoJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2FsbG9jID0gZHJtX2ludGVsX2dlbV9ib19hbGxvYzsKCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19hbGxvY19mb3JfcmVuZGVyID0KCSAgICBkcm1faW50ZWxfZ2VtX2JvX2FsbG9jX2Zvcl9yZW5kZXI7CglidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fYWxsb2NfdGlsZWQgPSBkcm1faW50ZWxfZ2VtX2JvX2FsbG9jX3RpbGVkOwoJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX3JlZmVyZW5jZSA9IGRybV9pbnRlbF9nZW1fYm9fcmVmZXJlbmNlOwoJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX3VucmVmZXJlbmNlID0gZHJtX2ludGVsX2dlbV9ib191bnJlZmVyZW5jZTsKCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19tYXAgPSBkcm1faW50ZWxfZ2VtX2JvX21hcDsKCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib191bm1hcCA9IGRybV9pbnRlbF9nZW1fYm9fdW5tYXA7CglidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fc3ViZGF0YSA9IGRybV9pbnRlbF9nZW1fYm9fc3ViZGF0YTsKCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19nZXRfc3ViZGF0YSA9IGRybV9pbnRlbF9nZW1fYm9fZ2V0X3N1YmRhdGE7CglidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fd2FpdF9yZW5kZXJpbmcgPSBkcm1faW50ZWxfZ2VtX2JvX3dhaXRfcmVuZGVyaW5nOwoJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2VtaXRfcmVsb2MgPSBkcm1faW50ZWxfZ2VtX2JvX2VtaXRfcmVsb2M7CglidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fZW1pdF9yZWxvY19mZW5jZSA9IGRybV9pbnRlbF9nZW1fYm9fZW1pdF9yZWxvY19mZW5jZTsKCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19waW4gPSBkcm1faW50ZWxfZ2VtX2JvX3BpbjsKCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib191bnBpbiA9IGRybV9pbnRlbF9nZW1fYm9fdW5waW47CglidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fZ2V0X3RpbGluZyA9IGRybV9pbnRlbF9nZW1fYm9fZ2V0X3RpbGluZzsKCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19zZXRfdGlsaW5nID0gZHJtX2ludGVsX2dlbV9ib19zZXRfdGlsaW5nOwoJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2ZsaW5rID0gZHJtX2ludGVsX2dlbV9ib19mbGluazsKCS8qIFVzZSB0aGUgbmV3IG9uZSBpZiBhdmFpbGFibGUgKi8KCWlmIChleGVjMikgewoJCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19leGVjID0gZHJtX2ludGVsX2dlbV9ib19leGVjMjsKCQlidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fbXJiX2V4ZWMgPSBkcm1faW50ZWxfZ2VtX2JvX21yYl9leGVjMjsKCX0gZWxzZQoJCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5ib19leGVjID0gZHJtX2ludGVsX2dlbV9ib19leGVjOwoJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2J1c3kgPSBkcm1faW50ZWxfZ2VtX2JvX2J1c3k7CglidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fbWFkdmlzZSA9IGRybV9pbnRlbF9nZW1fYm9fbWFkdmlzZTsKCWJ1Zm1ncl9nZW0tPmJ1Zm1nci5kZXN0cm95ID0gZHJtX2ludGVsX2J1Zm1ncl9nZW1fdW5yZWY7CglidWZtZ3JfZ2VtLT5idWZtZ3IuZGVidWcgPSAwOwoJYnVmbWdyX2dlbS0+YnVmbWdyLmNoZWNrX2FwZXJ0dXJlX3NwYWNlID0KCSAgICBkcm1faW50ZWxfZ2VtX2NoZWNrX2FwZXJ0dXJlX3NwYWNlOwoJYnVmbWdyX2dlbS0+YnVmbWdyLmJvX2Rpc2FibGVfcmV1c2UgPSBkcm1faW50ZWxfZ2VtX2JvX2Rpc2FibGVfcmV1c2U7CglidWZtZ3JfZ2VtLT5idWZtZ3IuYm9faXNfcmV1c2FibGUgPSBkcm1faW50ZWxfZ2VtX2JvX2lzX3JldXNhYmxlOwoJYnVmbWdyX2dlbS0+YnVmbWdyLmdldF9waXBlX2Zyb21fY3J0Y19pZCA9CgkgICAgZHJtX2ludGVsX2dlbV9nZXRfcGlwZV9mcm9tX2NydGNfaWQ7CglidWZtZ3JfZ2VtLT5idWZtZ3IuYm9fcmVmZXJlbmNlcyA9IGRybV9pbnRlbF9nZW1fYm9fcmVmZXJlbmNlczsKCglpbml0X2NhY2hlX2J1Y2tldHMoYnVmbWdyX2dlbSk7CgoJRFJNSU5JVExJU1RIRUFEKCZidWZtZ3JfZ2VtLT52bWFfY2FjaGUpOwoJYnVmbWdyX2dlbS0+dm1hX21heCA9IC0xOyAvKiB1bmxpbWl0ZWQgYnkgZGVmYXVsdCAqLwoKCURSTUxJU1RBREQoJmJ1Zm1ncl9nZW0tPm1hbmFnZXJzLCAmYnVmbWdyX2xpc3QpOwoKZXhpdDoKCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZidWZtZ3JfbGlzdF9tdXRleCk7CgoJcmV0dXJuIGJ1Zm1ncl9nZW0gIT0gTlVMTCA/ICZidWZtZ3JfZ2VtLT5idWZtZ3IgOiBOVUxMOwp9Cg==