LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgovKgogKiB2YWNtLmMKICoKICogU05NUHYzIFZpZXctYmFzZWQgQWNjZXNzIENvbnRyb2wgTW9kZWwKICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CgojaWYgSEFWRV9TVERMSUJfSAojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgojaWYgSEFWRV9TVFJJTkdfSAojaW5jbHVkZSA8c3RyaW5nLmg+CiNlbHNlCiNpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgojaWYgSEFWRV9VTklTVERfSAojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaWYgVElNRV9XSVRIX1NZU19USU1FCiMgaWZkZWYgV0lOMzIKIyAgaW5jbHVkZSA8c3lzL3RpbWViLmg+CiMgZWxzZQojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVuZGlmCiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgoKI2lmIEhBVkVfV0lOU09DS19ICiNpbmNsdWRlIDx3aW5zb2NrLmg+CiNlbmRpZgoKI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgoKI2lmIEhBVkVfRE1BTExPQ19ICiNpbmNsdWRlIDxkbWFsbG9jLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL3R5cGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9vdXRwdXRfYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9jb25maWdfYXBpLmg+CgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wX2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS92YWNtLmg+CgpzdGF0aWMgc3RydWN0IHZhY21fdmlld0VudHJ5ICp2aWV3TGlzdCA9IE5VTEwsICp2aWV3U2NhblB0ciA9IE5VTEw7CnN0YXRpYyBzdHJ1Y3QgdmFjbV9hY2Nlc3NFbnRyeSAqYWNjZXNzTGlzdCA9IE5VTEwsICphY2Nlc3NTY2FuUHRyID0gTlVMTDsKc3RhdGljIHN0cnVjdCB2YWNtX2dyb3VwRW50cnkgKmdyb3VwTGlzdCA9IE5VTEwsICpncm91cFNjYW5QdHIgPSBOVUxMOwoKLyoKICogTWFjcm8gdG8gZXh0ZW5kIHZpZXcgbWFza3Mgd2l0aCAxIGJpdHMgd2hlbiBzaG9ydGVyIHRoYW4gc3VidHJlZSBsZW5ndGhzCiAqIFJFRjogdmFjbVZpZXdUcmVlRmFtaWx5TWFzayBbUkZDMzQxNV0sIHNubXBOb3RpZnlGaWx0ZXJNYXNrIFtSRkMzNDEzXQogKi8KCiNkZWZpbmUgVklFV19NQVNLKHZpZXdQdHIsIGlkeCwgbWFzaykgXAogICAgKChpZHggPj0gdmlld1B0ci0+dmlld01hc2tMZW4pID8gbWFzayA6ICh2aWV3UHRyLT52aWV3TWFza1tpZHhdICYgbWFzaykpCgovKioKICogSW5pdGlsaXplcyB0aGUgVkFDTSBjb2RlLgogKiBTcGVjaWZpY2FsbHk6CiAqICAtIGFkZHMgYSBzZXQgb2YgZW51bXMgbWFwcGluZyB2aWV3IG51bWJlcnMgdG8gaHVtYW4gcmVhZGFibGUgbmFtZXMKICovCnZvaWQKaW5pdF92YWNtKHZvaWQpCnsKICAgIC8qIHZpZXdzIGZvciBhY2Nlc3MgdmlhIGdldC9zZXQvc2VuZC1ub3RpZmljYXRpb25zICovCiAgICBzZV9hZGRfcGFpcl90b19zbGlzdChWQUNNX1ZJRVdfRU5VTV9OQU1FLCBzdHJkdXAoInJlYWQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIFZBQ01fVklFV19SRUFEKTsKICAgIHNlX2FkZF9wYWlyX3RvX3NsaXN0KFZBQ01fVklFV19FTlVNX05BTUUsIHN0cmR1cCgid3JpdGUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIFZBQ01fVklFV19XUklURSk7CiAgICBzZV9hZGRfcGFpcl90b19zbGlzdChWQUNNX1ZJRVdfRU5VTV9OQU1FLCBzdHJkdXAoIm5vdGlmeSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgVkFDTV9WSUVXX05PVElGWSk7CgogICAgLyogdmlld3MgZm9yIHBlcm1pc3Npb25zIHdoZW4gcmVjZWl2aW5nIG5vdGlmaWNhdGlvbnMgKi8KICAgIHNlX2FkZF9wYWlyX3RvX3NsaXN0KFZBQ01fVklFV19FTlVNX05BTUUsIHN0cmR1cCgibG9nIiksCiAgICAgICAgICAgICAgICAgICAgICAgICBWQUNNX1ZJRVdfTE9HKTsKICAgIHNlX2FkZF9wYWlyX3RvX3NsaXN0KFZBQ01fVklFV19FTlVNX05BTUUsIHN0cmR1cCgiZXhlY3V0ZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgVkFDTV9WSUVXX0VYRUNVVEUpOwogICAgc2VfYWRkX3BhaXJfdG9fc2xpc3QoVkFDTV9WSUVXX0VOVU1fTkFNRSwgc3RyZHVwKCJuZXQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIFZBQ01fVklFV19ORVQpOwp9Cgp2b2lkCnZhY21fc2F2ZShjb25zdCBjaGFyICp0b2tlbiwgY29uc3QgY2hhciAqdHlwZSkKewogICAgc3RydWN0IHZhY21fdmlld0VudHJ5ICp2cHRyOwogICAgc3RydWN0IHZhY21fYWNjZXNzRW50cnkgKmFwdHI7CiAgICBzdHJ1Y3QgdmFjbV9ncm91cEVudHJ5ICpncHRyOwogICAgaW50IGk7CgogICAgZm9yICh2cHRyID0gdmlld0xpc3Q7IHZwdHIgIT0gTlVMTDsgdnB0ciA9IHZwdHItPm5leHQpIHsKICAgICAgICBpZiAodnB0ci0+dmlld1N0b3JhZ2VUeXBlID09IFNUX05PTlZPTEFUSUxFKQogICAgICAgICAgICB2YWNtX3NhdmVfdmlldyh2cHRyLCB0b2tlbiwgdHlwZSk7CiAgICB9CgogICAgZm9yIChhcHRyID0gYWNjZXNzTGlzdDsgYXB0ciAhPSBOVUxMOyBhcHRyID0gYXB0ci0+bmV4dCkgewogICAgICAgIGlmIChhcHRyLT5zdG9yYWdlVHlwZSA9PSBTVF9OT05WT0xBVElMRSkgewogICAgICAgICAgICAvKiBTdG9yZSB0aGUgc3RhbmRhcmQgdmlld3MgKGlmIHNldCkgKi8KICAgICAgICAgICAgaWYgKCBhcHRyLT52aWV3c1tWQUNNX1ZJRVdfUkVBRCAgXVswXSB8fAogICAgICAgICAgICAgICAgIGFwdHItPnZpZXdzW1ZBQ01fVklFV19XUklURSBdWzBdIHx8CiAgICAgICAgICAgICAgICAgYXB0ci0+dmlld3NbVkFDTV9WSUVXX05PVElGWV1bMF0gKQogICAgICAgICAgICAgICAgdmFjbV9zYXZlX2FjY2VzcyhhcHRyLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIC8qIFN0b3JlIGFueSBvdGhlciAodmFsaWQpIGFjY2VzcyB2aWV3cyAqLwogICAgICAgICAgICBmb3IgKCBpPVZBQ01fVklFV19OT1RJRlkrMTsgaTxWQUNNX01BWF9WSUVXUzsgaSsrICkgewogICAgICAgICAgICAgICAgaWYgKCBhcHRyLT52aWV3c1tpXVswXSApCiAgICAgICAgICAgICAgICAgICAgdmFjbV9zYXZlX2F1dGhfYWNjZXNzKGFwdHIsIHRva2VuLCB0eXBlLCBpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKGdwdHIgPSBncm91cExpc3Q7IGdwdHIgIT0gTlVMTDsgZ3B0ciA9IGdwdHItPm5leHQpIHsKICAgICAgICBpZiAoZ3B0ci0+c3RvcmFnZVR5cGUgPT0gU1RfTk9OVk9MQVRJTEUpCiAgICAgICAgICAgIHZhY21fc2F2ZV9ncm91cChncHRyLCB0b2tlbiwgdHlwZSk7CiAgICB9Cn0KCi8qCiAqIHZhY21fc2F2ZV92aWV3KCk6IHNhdmVzIGEgdmlldyBlbnRyeSB0byB0aGUgcGVyc2lzdGVudCBjYWNoZSAKICovCnZvaWQKdmFjbV9zYXZlX3ZpZXcoc3RydWN0IHZhY21fdmlld0VudHJ5ICp2aWV3LCBjb25zdCBjaGFyICp0b2tlbiwKICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSkKewogICAgY2hhciAgICAgICAgICAgIGxpbmVbNDA5Nl07CiAgICBjaGFyICAgICAgICAgICAqY3B0cjsKCiAgICBtZW1zZXQobGluZSwgMCwgc2l6ZW9mKGxpbmUpKTsKICAgIHNucHJpbnRmKGxpbmUsIHNpemVvZihsaW5lKSwgIiVzJXMgJWQgJWQgJWQgIiwgdG9rZW4sICJWaWV3IiwKICAgICAgICAgICAgdmlldy0+dmlld1N0YXR1cywgdmlldy0+dmlld1N0b3JhZ2VUeXBlLCB2aWV3LT52aWV3VHlwZSk7CiAgICBsaW5lWyBzaXplb2YobGluZSktMSBdID0gMDsKICAgIGNwdHIgPSAmbGluZVtzdHJsZW4obGluZSldOyAvKiB0aGUgTlVMTCAqLwoKICAgIGNwdHIgPQogICAgICAgIHJlYWRfY29uZmlnX3NhdmVfb2N0ZXRfc3RyaW5nKGNwdHIsICh1X2NoYXIgKikgdmlldy0+dmlld05hbWUgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXctPnZpZXdOYW1lWzBdKTsKICAgICpjcHRyKysgPSAnICc7CiAgICBjcHRyID0KICAgICAgICByZWFkX2NvbmZpZ19zYXZlX29iamlkKGNwdHIsIHZpZXctPnZpZXdTdWJ0cmVlKzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3LT52aWV3U3VidHJlZUxlbi0xKTsKICAgICpjcHRyKysgPSAnICc7CiAgICBjcHRyID0gcmVhZF9jb25maWdfc2F2ZV9vY3RldF9zdHJpbmcoY3B0ciwgKHVfY2hhciAqKSB2aWV3LT52aWV3TWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3LT52aWV3TWFza0xlbik7CgogICAgcmVhZF9jb25maWdfc3RvcmUodHlwZSwgbGluZSk7Cn0KCnZvaWQKdmFjbV9wYXJzZV9jb25maWdfdmlldyhjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSkKewogICAgc3RydWN0IHZhY21fdmlld0VudHJ5IHZpZXc7CiAgICBzdHJ1Y3QgdmFjbV92aWV3RW50cnkgKnZwdHI7CiAgICBjaGFyICAgICAgICAgICAqdmlld05hbWUgPSAoY2hhciAqKSAmdmlldy52aWV3TmFtZTsKICAgIG9pZCAgICAgICAgICAgICp2aWV3U3VidHJlZSA9IChvaWQgKikgJiB2aWV3LnZpZXdTdWJ0cmVlOwogICAgdV9jaGFyICAgICAgICAgKnZpZXdNYXNrOwogICAgc2l6ZV90ICAgICAgICAgIGxlbjsKCiAgICB2aWV3LnZpZXdTdGF0dXMgPSBhdG9pKGxpbmUpOwogICAgbGluZSA9IHNraXBfdG9rZW4obGluZSk7CiAgICB2aWV3LnZpZXdTdG9yYWdlVHlwZSA9IGF0b2kobGluZSk7CiAgICBsaW5lID0gc2tpcF90b2tlbihsaW5lKTsKICAgIHZpZXcudmlld1R5cGUgPSBhdG9pKGxpbmUpOwogICAgbGluZSA9IHNraXBfdG9rZW4obGluZSk7CiAgICBsZW4gPSBzaXplb2Yodmlldy52aWV3TmFtZSk7CiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX29jdGV0X3N0cmluZyhsaW5lLCAodV9jaGFyICoqKSAmIHZpZXdOYW1lLCAmbGVuKTsKICAgIHZpZXcudmlld1N1YnRyZWVMZW4gPSBNQVhfT0lEX0xFTjsKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfb2JqaWQobGluZSwgKG9pZCAqKikgJiB2aWV3U3VidHJlZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2aWV3LnZpZXdTdWJ0cmVlTGVuKTsKCiAgICB2cHRyID0KICAgICAgICB2YWNtX2NyZWF0ZVZpZXdFbnRyeSh2aWV3LnZpZXdOYW1lLCB2aWV3LnZpZXdTdWJ0cmVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcudmlld1N1YnRyZWVMZW4pOwogICAgaWYgKCF2cHRyKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZwdHItPnZpZXdTdGF0dXMgPSB2aWV3LnZpZXdTdGF0dXM7CiAgICB2cHRyLT52aWV3U3RvcmFnZVR5cGUgPSB2aWV3LnZpZXdTdG9yYWdlVHlwZTsKICAgIHZwdHItPnZpZXdUeXBlID0gdmlldy52aWV3VHlwZTsKICAgIHZpZXdNYXNrID0gdnB0ci0+dmlld01hc2s7CiAgICB2cHRyLT52aWV3TWFza0xlbiA9IHNpemVvZih2cHRyLT52aWV3TWFzayk7CiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX29jdGV0X3N0cmluZyhsaW5lLCAmdmlld01hc2ssICZ2cHRyLT52aWV3TWFza0xlbik7Cn0KCi8qCiAqIHZhY21fc2F2ZV9hY2Nlc3MoKTogc2F2ZXMgYW4gYWNjZXNzIGVudHJ5IHRvIHRoZSBwZXJzaXN0ZW50IGNhY2hlIAogKi8Kdm9pZAp2YWNtX3NhdmVfYWNjZXNzKHN0cnVjdCB2YWNtX2FjY2Vzc0VudHJ5ICphY2Nlc3NfZW50cnksIGNvbnN0IGNoYXIgKnRva2VuLAogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUpCnsKICAgIGNoYXIgICAgICAgICAgICBsaW5lWzQwOTZdOwogICAgY2hhciAgICAgICAgICAgKmNwdHI7CgogICAgbWVtc2V0KGxpbmUsIDAsIHNpemVvZihsaW5lKSk7CiAgICBzbnByaW50ZihsaW5lLCBzaXplb2YobGluZSksICIlcyVzICVkICVkICVkICVkICVkICIsCiAgICAgICAgICAgIHRva2VuLCAiQWNjZXNzIiwgYWNjZXNzX2VudHJ5LT5zdGF0dXMsCiAgICAgICAgICAgIGFjY2Vzc19lbnRyeS0+c3RvcmFnZVR5cGUsIGFjY2Vzc19lbnRyeS0+c2VjdXJpdHlNb2RlbCwKICAgICAgICAgICAgYWNjZXNzX2VudHJ5LT5zZWN1cml0eUxldmVsLCBhY2Nlc3NfZW50cnktPmNvbnRleHRNYXRjaCk7CiAgICBsaW5lWyBzaXplb2YobGluZSktMSBdID0gMDsKICAgIGNwdHIgPSAmbGluZVtzdHJsZW4obGluZSldOyAvKiB0aGUgTlVMTCAqLwogICAgY3B0ciA9CiAgICAgICAgcmVhZF9jb25maWdfc2F2ZV9vY3RldF9zdHJpbmcoY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopIGFjY2Vzc19lbnRyeS0+Z3JvdXBOYW1lICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NfZW50cnktPmdyb3VwTmFtZVswXSArIDEpOwogICAgKmNwdHIrKyA9ICcgJzsKICAgIGNwdHIgPQogICAgICAgIHJlYWRfY29uZmlnX3NhdmVfb2N0ZXRfc3RyaW5nKGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSBhY2Nlc3NfZW50cnktPmNvbnRleHRQcmVmaXggKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc19lbnRyeS0+Y29udGV4dFByZWZpeFswXSArIDEpOwoKICAgICpjcHRyKysgPSAnICc7CiAgICBjcHRyID0gcmVhZF9jb25maWdfc2F2ZV9vY3RldF9zdHJpbmcoY3B0ciwgKHVfY2hhciAqKSBhY2Nlc3NfZW50cnktPnZpZXdzW1ZBQ01fVklFV19SRUFEXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oYWNjZXNzX2VudHJ5LT52aWV3c1tWQUNNX1ZJRVdfUkVBRF0pICsgMSk7CiAgICAqY3B0cisrID0gJyAnOwogICAgY3B0ciA9CiAgICAgICAgcmVhZF9jb25maWdfc2F2ZV9vY3RldF9zdHJpbmcoY3B0ciwgKHVfY2hhciAqKSBhY2Nlc3NfZW50cnktPnZpZXdzW1ZBQ01fVklFV19XUklURV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGFjY2Vzc19lbnRyeS0+dmlld3NbVkFDTV9WSUVXX1dSSVRFXSkgKyAxKTsKICAgICpjcHRyKysgPSAnICc7CiAgICBjcHRyID0KICAgICAgICByZWFkX2NvbmZpZ19zYXZlX29jdGV0X3N0cmluZyhjcHRyLCAodV9jaGFyICopIGFjY2Vzc19lbnRyeS0+dmlld3NbVkFDTV9WSUVXX05PVElGWV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGFjY2Vzc19lbnRyeS0+dmlld3NbVkFDTV9WSUVXX05PVElGWV0pICsgMSk7CgogICAgcmVhZF9jb25maWdfc3RvcmUodHlwZSwgbGluZSk7Cn0KCnZvaWQKdmFjbV9zYXZlX2F1dGhfYWNjZXNzKHN0cnVjdCB2YWNtX2FjY2Vzc0VudHJ5ICphY2Nlc3NfZW50cnksCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b2tlbiwgY29uc3QgY2hhciAqdHlwZSwgaW50IGF1dGh0eXBlKQp7CiAgICBjaGFyICAgICAgICAgICAgbGluZVs0MDk2XTsKICAgIGNoYXIgICAgICAgICAgICpjcHRyOwoKICAgIG1lbXNldChsaW5lLCAwLCBzaXplb2YobGluZSkpOwogICAgc25wcmludGYobGluZSwgc2l6ZW9mKGxpbmUpLCAiJXMlcyAlZCAlZCAlZCAlZCAlZCAiLAogICAgICAgICAgICB0b2tlbiwgIkF1dGhBY2Nlc3MiLCBhY2Nlc3NfZW50cnktPnN0YXR1cywKICAgICAgICAgICAgYWNjZXNzX2VudHJ5LT5zdG9yYWdlVHlwZSwgYWNjZXNzX2VudHJ5LT5zZWN1cml0eU1vZGVsLAogICAgICAgICAgICBhY2Nlc3NfZW50cnktPnNlY3VyaXR5TGV2ZWwsIGFjY2Vzc19lbnRyeS0+Y29udGV4dE1hdGNoKTsKICAgIGxpbmVbIHNpemVvZihsaW5lKS0xIF0gPSAwOwogICAgY3B0ciA9ICZsaW5lW3N0cmxlbihsaW5lKV07IC8qIHRoZSBOVUxMICovCiAgICBjcHRyID0KICAgICAgICByZWFkX2NvbmZpZ19zYXZlX29jdGV0X3N0cmluZyhjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKikgYWNjZXNzX2VudHJ5LT5ncm91cE5hbWUgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc19lbnRyeS0+Z3JvdXBOYW1lWzBdICsgMSk7CiAgICAqY3B0cisrID0gJyAnOwogICAgY3B0ciA9CiAgICAgICAgcmVhZF9jb25maWdfc2F2ZV9vY3RldF9zdHJpbmcoY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopIGFjY2Vzc19lbnRyeS0+Y29udGV4dFByZWZpeCArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzX2VudHJ5LT5jb250ZXh0UHJlZml4WzBdICsgMSk7CgogICAgc25wcmludGYoY3B0ciwgc2l6ZW9mKGxpbmUpLShjcHRyLWxpbmUpLCAiICVkICIsIGF1dGh0eXBlKTsKICAgIHdoaWxlICggKmNwdHIgKQogICAgICAgIGNwdHIrKzsKCiAgICAqY3B0cisrID0gJyAnOwogICAgY3B0ciA9IHJlYWRfY29uZmlnX3NhdmVfb2N0ZXRfc3RyaW5nKGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopYWNjZXNzX2VudHJ5LT52aWV3c1thdXRodHlwZV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oYWNjZXNzX2VudHJ5LT52aWV3c1thdXRodHlwZV0pICsgMSk7CgogICAgcmVhZF9jb25maWdfc3RvcmUodHlwZSwgbGluZSk7Cn0KCmNoYXIgKgpfdmFjbV9wYXJzZV9jb25maWdfYWNjZXNzX2NvbW1vbihzdHJ1Y3QgdmFjbV9hY2Nlc3NFbnRyeSAqKmFwdHIsIGNoYXIgKmxpbmUpCnsKICAgIHN0cnVjdCB2YWNtX2FjY2Vzc0VudHJ5IGFjY2VzczsKICAgIGNoYXIgICAgICAgICAgICpjUHJlZml4ID0gKGNoYXIgKikgJmFjY2Vzcy5jb250ZXh0UHJlZml4OwogICAgY2hhciAgICAgICAgICAgKmdOYW1lICAgPSAoY2hhciAqKSAmYWNjZXNzLmdyb3VwTmFtZTsKICAgIHNpemVfdCAgICAgICAgICBsZW47CgogICAgYWNjZXNzLnN0YXR1cyA9IGF0b2kobGluZSk7CiAgICBsaW5lID0gc2tpcF90b2tlbihsaW5lKTsKICAgIGFjY2Vzcy5zdG9yYWdlVHlwZSA9IGF0b2kobGluZSk7CiAgICBsaW5lID0gc2tpcF90b2tlbihsaW5lKTsKICAgIGFjY2Vzcy5zZWN1cml0eU1vZGVsID0gYXRvaShsaW5lKTsKICAgIGxpbmUgPSBza2lwX3Rva2VuKGxpbmUpOwogICAgYWNjZXNzLnNlY3VyaXR5TGV2ZWwgPSBhdG9pKGxpbmUpOwogICAgbGluZSA9IHNraXBfdG9rZW4obGluZSk7CiAgICBhY2Nlc3MuY29udGV4dE1hdGNoID0gYXRvaShsaW5lKTsKICAgIGxpbmUgPSBza2lwX3Rva2VuKGxpbmUpOwogICAgbGVuICA9IHNpemVvZihhY2Nlc3MuZ3JvdXBOYW1lKTsKICAgIGxpbmUgPSByZWFkX2NvbmZpZ19yZWFkX29jdGV0X3N0cmluZyhsaW5lLCAodV9jaGFyICoqKSAmZ05hbWUsICAgJmxlbik7CiAgICBsZW4gID0gc2l6ZW9mKGFjY2Vzcy5jb250ZXh0UHJlZml4KTsKICAgIGxpbmUgPSByZWFkX2NvbmZpZ19yZWFkX29jdGV0X3N0cmluZyhsaW5lLCAodV9jaGFyICoqKSAmY1ByZWZpeCwgJmxlbik7CgogICAgKmFwdHIgPSB2YWNtX2dldEFjY2Vzc0VudHJ5KGFjY2Vzcy5ncm91cE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3MuY29udGV4dFByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzcy5zZWN1cml0eU1vZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzLnNlY3VyaXR5TGV2ZWwpOwogICAgaWYgKCEqYXB0cikKICAgICAgICAqYXB0ciA9IHZhY21fY3JlYXRlQWNjZXNzRW50cnkoYWNjZXNzLmdyb3VwTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzcy5jb250ZXh0UHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzLnNlY3VyaXR5TW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3Muc2VjdXJpdHlMZXZlbCk7CiAgICBpZiAoISphcHRyKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgICgqYXB0ciktPnN0YXR1cyA9IGFjY2Vzcy5zdGF0dXM7CiAgICAoKmFwdHIpLT5zdG9yYWdlVHlwZSAgID0gYWNjZXNzLnN0b3JhZ2VUeXBlOwogICAgKCphcHRyKS0+c2VjdXJpdHlNb2RlbCA9IGFjY2Vzcy5zZWN1cml0eU1vZGVsOwogICAgKCphcHRyKS0+c2VjdXJpdHlMZXZlbCA9IGFjY2Vzcy5zZWN1cml0eUxldmVsOwogICAgKCphcHRyKS0+Y29udGV4dE1hdGNoICA9IGFjY2Vzcy5jb250ZXh0TWF0Y2g7CiAgICByZXR1cm4gbGluZTsKfQoKdm9pZAp2YWNtX3BhcnNlX2NvbmZpZ19hY2Nlc3MoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpCnsKICAgIHN0cnVjdCB2YWNtX2FjY2Vzc0VudHJ5ICphcHRyOwogICAgY2hhciAgICAgICAgICAgKnJlYWRWaWV3LCAqd3JpdGVWaWV3LCAqbm90aWZ5VmlldzsKICAgIHNpemVfdCAgICAgICAgICBsZW47CgogICAgbGluZSA9IF92YWNtX3BhcnNlX2NvbmZpZ19hY2Nlc3NfY29tbW9uKCZhcHRyLCBsaW5lKTsKICAgIGlmICghbGluZSkKICAgICAgICByZXR1cm47CgogICAgcmVhZFZpZXcgPSAoY2hhciAqKSBhcHRyLT52aWV3c1tWQUNNX1ZJRVdfUkVBRF07CiAgICBsZW4gPSBzaXplb2YoYXB0ci0+dmlld3NbVkFDTV9WSUVXX1JFQURdKTsKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfb2N0ZXRfc3RyaW5nKGxpbmUsICh1X2NoYXIgKiopICYgcmVhZFZpZXcsICZsZW4pOwogICAgd3JpdGVWaWV3ID0gKGNoYXIgKikgYXB0ci0+dmlld3NbVkFDTV9WSUVXX1dSSVRFXTsKICAgIGxlbiA9IHNpemVvZihhcHRyLT52aWV3c1tWQUNNX1ZJRVdfV1JJVEVdKTsKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfb2N0ZXRfc3RyaW5nKGxpbmUsICh1X2NoYXIgKiopICYgd3JpdGVWaWV3LCAmbGVuKTsKICAgIG5vdGlmeVZpZXcgPSAoY2hhciAqKSBhcHRyLT52aWV3c1tWQUNNX1ZJRVdfTk9USUZZXTsKICAgIGxlbiA9IHNpemVvZihhcHRyLT52aWV3c1tWQUNNX1ZJRVdfTk9USUZZXSk7CiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX29jdGV0X3N0cmluZyhsaW5lLCAodV9jaGFyICoqKSAmIG5vdGlmeVZpZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbik7Cn0KCnZvaWQKdmFjbV9wYXJzZV9jb25maWdfYXV0aF9hY2Nlc3MoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpCnsKICAgIHN0cnVjdCB2YWNtX2FjY2Vzc0VudHJ5ICphcHRyOwogICAgaW50ICAgICAgICAgICAgIGF1dGh0eXBlOwogICAgY2hhciAgICAgICAgICAgKnZpZXc7CiAgICBzaXplX3QgICAgICAgICAgbGVuOwoKICAgIGxpbmUgPSBfdmFjbV9wYXJzZV9jb25maWdfYWNjZXNzX2NvbW1vbigmYXB0ciwgbGluZSk7CiAgICBpZiAoIWxpbmUpCiAgICAgICAgcmV0dXJuOwoKICAgIGF1dGh0eXBlID0gYXRvaShsaW5lKTsKICAgIGxpbmUgPSBza2lwX3Rva2VuKGxpbmUpOwoKICAgIHZpZXcgPSAoY2hhciAqKSBhcHRyLT52aWV3c1thdXRodHlwZV07CiAgICBsZW4gID0gc2l6ZW9mKGFwdHItPnZpZXdzW2F1dGh0eXBlXSk7CiAgICBsaW5lID0gcmVhZF9jb25maWdfcmVhZF9vY3RldF9zdHJpbmcobGluZSwgKHVfY2hhciAqKikgJiB2aWV3LCAmbGVuKTsKfQoKLyoKICogdmFjbV9zYXZlX2dyb3VwKCk6IHNhdmVzIGEgZ3JvdXAgZW50cnkgdG8gdGhlIHBlcnNpc3RlbnQgY2FjaGUgCiAqLwp2b2lkCnZhY21fc2F2ZV9ncm91cChzdHJ1Y3QgdmFjbV9ncm91cEVudHJ5ICpncm91cF9lbnRyeSwgY29uc3QgY2hhciAqdG9rZW4sCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlKQp7CiAgICBjaGFyICAgICAgICAgICAgbGluZVs0MDk2XTsKICAgIGNoYXIgICAgICAgICAgICpjcHRyOwoKICAgIG1lbXNldChsaW5lLCAwLCBzaXplb2YobGluZSkpOwogICAgc25wcmludGYobGluZSwgc2l6ZW9mKGxpbmUpLCAiJXMlcyAlZCAlZCAlZCAiLAogICAgICAgICAgICB0b2tlbiwgIkdyb3VwIiwgZ3JvdXBfZW50cnktPnN0YXR1cywKICAgICAgICAgICAgZ3JvdXBfZW50cnktPnN0b3JhZ2VUeXBlLCBncm91cF9lbnRyeS0+c2VjdXJpdHlNb2RlbCk7CiAgICBsaW5lWyBzaXplb2YobGluZSktMSBdID0gMDsKICAgIGNwdHIgPSAmbGluZVtzdHJsZW4obGluZSldOyAvKiB0aGUgTlVMTCAqLwoKICAgIGNwdHIgPQogICAgICAgIHJlYWRfY29uZmlnX3NhdmVfb2N0ZXRfc3RyaW5nKGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSBncm91cF9lbnRyeS0+c2VjdXJpdHlOYW1lICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9lbnRyeS0+c2VjdXJpdHlOYW1lWzBdICsgMSk7CiAgICAqY3B0cisrID0gJyAnOwogICAgY3B0ciA9IHJlYWRfY29uZmlnX3NhdmVfb2N0ZXRfc3RyaW5nKGNwdHIsICh1X2NoYXIgKikgZ3JvdXBfZW50cnktPmdyb3VwTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oZ3JvdXBfZW50cnktPmdyb3VwTmFtZSkgKyAxKTsKCiAgICByZWFkX2NvbmZpZ19zdG9yZSh0eXBlLCBsaW5lKTsKfQoKdm9pZAp2YWNtX3BhcnNlX2NvbmZpZ19ncm91cChjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSkKewogICAgc3RydWN0IHZhY21fZ3JvdXBFbnRyeSBncm91cDsKICAgIHN0cnVjdCB2YWNtX2dyb3VwRW50cnkgKmdwdHI7CiAgICBjaGFyICAgICAgICAgICAqc2VjdXJpdHlOYW1lID0gKGNoYXIgKikgJmdyb3VwLnNlY3VyaXR5TmFtZTsKICAgIGNoYXIgICAgICAgICAgICpncm91cE5hbWU7CiAgICBzaXplX3QgICAgICAgICAgbGVuOwoKICAgIGdyb3VwLnN0YXR1cyA9IGF0b2kobGluZSk7CiAgICBsaW5lID0gc2tpcF90b2tlbihsaW5lKTsKICAgIGdyb3VwLnN0b3JhZ2VUeXBlID0gYXRvaShsaW5lKTsKICAgIGxpbmUgPSBza2lwX3Rva2VuKGxpbmUpOwogICAgZ3JvdXAuc2VjdXJpdHlNb2RlbCA9IGF0b2kobGluZSk7CiAgICBsaW5lID0gc2tpcF90b2tlbihsaW5lKTsKICAgIGxlbiA9IHNpemVvZihncm91cC5zZWN1cml0eU5hbWUpOwogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9vY3RldF9zdHJpbmcobGluZSwgKHVfY2hhciAqKikgJiBzZWN1cml0eU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbik7CgogICAgZ3B0ciA9IHZhY21fY3JlYXRlR3JvdXBFbnRyeShncm91cC5zZWN1cml0eU1vZGVsLCBncm91cC5zZWN1cml0eU5hbWUpOwogICAgaWYgKCFncHRyKQogICAgICAgIHJldHVybjsKCiAgICBncHRyLT5zdGF0dXMgPSBncm91cC5zdGF0dXM7CiAgICBncHRyLT5zdG9yYWdlVHlwZSA9IGdyb3VwLnN0b3JhZ2VUeXBlOwogICAgZ3JvdXBOYW1lID0gKGNoYXIgKikgZ3B0ci0+Z3JvdXBOYW1lOwogICAgbGVuID0gc2l6ZW9mKGdyb3VwLmdyb3VwTmFtZSk7CiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX29jdGV0X3N0cmluZyhsaW5lLCAodV9jaGFyICoqKSAmIGdyb3VwTmFtZSwgJmxlbik7Cn0KCnN0cnVjdCB2YWNtX3ZpZXdFbnRyeSAqCm5ldHNubXBfdmlld19nZXQoc3RydWN0IHZhY21fdmlld0VudHJ5ICpoZWFkLCBjb25zdCBjaGFyICp2aWV3TmFtZSwKICAgICAgICAgICAgICAgICAgb2lkICogdmlld1N1YnRyZWUsIHNpemVfdCB2aWV3U3VidHJlZUxlbiwgaW50IG1vZGUpCnsKICAgIHN0cnVjdCB2YWNtX3ZpZXdFbnRyeSAqdnAsICp2cHJldCA9IE5VTEw7CiAgICBjaGFyICAgICAgICAgICAgdmlld1tWQUNNU1RSSU5HTEVOXTsKICAgIGludCAgICAgICAgICAgICBmb3VuZCwgZ2xlbjsKICAgIGludCBjb3VudD0wOwoKICAgIGdsZW4gPSAoaW50KSBzdHJsZW4odmlld05hbWUpOwogICAgaWYgKGdsZW4gPCAwIHx8IGdsZW4gPiBWQUNNX01BWF9TVFJJTkcpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB2aWV3WzBdID0gZ2xlbjsKICAgIHN0cmNweSh2aWV3ICsgMSwgdmlld05hbWUpOwogICAgZm9yICh2cCA9IGhlYWQ7IHZwOyB2cCA9IHZwLT5uZXh0KSB7CiAgICAgICAgaWYgKCFtZW1jbXAodmlldywgdnAtPnZpZXdOYW1lLCBnbGVuICsgMSkKICAgICAgICAgICAgJiYgdmlld1N1YnRyZWVMZW4gPj0gKHZwLT52aWV3U3VidHJlZUxlbiAtIDEpKSB7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBtYXNrID0gMHg4MCwgbWFza3BvcyA9IDA7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBvaWRwb3M7CiAgICAgICAgICAgIGZvdW5kID0gMTsKCiAgICAgICAgICAgIGZvciAob2lkcG9zID0gMDsKICAgICAgICAgICAgICAgICBmb3VuZCAmJiBvaWRwb3MgPCAoaW50KSB2cC0+dmlld1N1YnRyZWVMZW4gLSAxOwogICAgICAgICAgICAgICAgIG9pZHBvcysrKSB7CiAgICAgICAgICAgICAgICBpZiAobW9kZT09VkFDTV9NT0RFX0lHTk9SRV9NQVNLIHx8IChWSUVXX01BU0sodnAsIG1hc2twb3MsIG1hc2spICE9IDApKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdTdWJ0cmVlW29pZHBvc10gIT0KICAgICAgICAgICAgICAgICAgICAgICAgdnAtPnZpZXdTdWJ0cmVlW29pZHBvcyArIDFdKQogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobWFzayA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgbWFzayA9IDB4ODA7CiAgICAgICAgICAgICAgICAgICAgbWFza3BvcysrOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgbWFzayA+Pj0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGZvdW5kKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogbWF0Y2ggc3VjY2Vzc2Z1bCwga2VlcCB0aGlzIG5vZGUgaWYgaXRzIGxvbmdlciB0aGFuCiAgICAgICAgICAgICAgICAgKiB0aGUgcHJldmlvdXMgb3IgKGVxdWFsIGFuZCBsZXhpY29ncmFwaGljYWxseSBncmVhdGVyCiAgICAgICAgICAgICAgICAgKiB0aGFuIHRoZSBwcmV2aW91cykuIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT0gVkFDTV9NT0RFX0NIRUNLX1NVQlRSRUUpIHsKICAgICAgICAgICAgICAgICAgICB2cHJldCA9IHZwOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2cHJldCA9PSBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHZwLT52aWV3U3VidHJlZUxlbiA+IHZwcmV0LT52aWV3U3VidHJlZUxlbgogICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAodnAtPnZpZXdTdWJ0cmVlTGVuID09IHZwcmV0LT52aWV3U3VidHJlZUxlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgc25tcF9vaWRfY29tcGFyZSh2cC0+dmlld1N1YnRyZWUgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cC0+dmlld1N1YnRyZWVMZW4gLSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHJldC0+dmlld1N1YnRyZWUgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHJldC0+dmlld1N1YnRyZWVMZW4gLSAxKSA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkgewogICAgICAgICAgICAgICAgICAgIHZwcmV0ID0gdnA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBERUJVR01TR1RMKCgidmFjbTpnZXRWaWV3IiwgIiwgJXNcbiIsICh2cHJldCkgPyAiZm91bmQiIDogIm5vbmUiKSk7CiAgICBpZiAobW9kZSA9PSBWQUNNX01PREVfQ0hFQ0tfU1VCVFJFRSAmJiBjb3VudCA+IDEpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIHJldHVybiB2cHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipvLW8qKioqKioKICogdmFjbV9jaGVja1N1YnRyZWUKICoKICogQ2hlY2sgdG8gc2VlIGlmIGV2ZXJ5dGhpbmcgd2l0aGluIGEgc3VidHJlZSBpcyBpbiB2aWV3LCBub3QgaW4gdmlldywKICogb3IgcG9zc2libHkgYm90aC4KICoKICogUGFyYW1ldGVyczoKICogICAqdmlld05hbWUgICAgICAgICAgIC0gTmFtZSBvZiB2aWV3IHRvIGNoZWNrCiAqICAgKnZpZXdTdWJ0cmVlICAgICAgICAtIE9JRCBvZiBzdWJ0cmVlCiAqICAgIHZpZXdTdWJ0cmVlTGVuICAgICAtIGxlbmd0aCBvZiBzdWJ0cmVlIE9JRAogKiAgICAgIAogKiBSZXR1cm5zOgogKiAgIFZBQ01fU1VDQ0VTUyAgICAgICAgICBUaGUgT0lEIGlzIGluY2x1ZGVkIGluIHRoZSB2aWV3LgogKiAgIFZBQ01fTk9USU5WSUVXICAgICAgICBJZiBubyBlbnRyeSBpbiB0aGUgdmlldyBsaXN0IGluY2x1ZGVzIHRoZQogKiAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlZCBPSUQsIG9yIHRoZSBPSUQgaXMgZXhwbGljaXRseSBleGNsdWRlZAogKiAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSB2aWV3LiAKICogICBWQUNNX1NVQlRSRUVfVU5LTk9XTiAgVGhlIGVudGlyZSBzdWJ0cmVlIGhhcyBib3RoIGFsbG93ZWQgYW5kIGRpc2FsbG93ZWQKICogICAgICAgICAgICAgICAgICAgICAgICAgcG9ydGlvbnMuCiAqLwppbnQKbmV0c25tcF92aWV3X3N1YnRyZWVfY2hlY2soc3RydWN0IHZhY21fdmlld0VudHJ5ICpoZWFkLCBjb25zdCBjaGFyICp2aWV3TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICogdmlld1N1YnRyZWUsIHNpemVfdCB2aWV3U3VidHJlZUxlbikKewogICAgc3RydWN0IHZhY21fdmlld0VudHJ5ICp2cCwgKnZwU2hvcnRlciA9IE5VTEwsICp2cExvbmdlciA9IE5VTEw7CiAgICBjaGFyICAgICAgICAgICAgdmlld1tWQUNNU1RSSU5HTEVOXTsKICAgIGludCAgICAgICAgICAgICBmb3VuZCwgZ2xlbjsKCiAgICBnbGVuID0gKGludCkgc3RybGVuKHZpZXdOYW1lKTsKICAgIGlmIChnbGVuIDwgMCB8fCBnbGVuID4gVkFDTV9NQVhfU1RSSU5HKQogICAgICAgIHJldHVybiBWQUNNX05PVElOVklFVzsKICAgIHZpZXdbMF0gPSBnbGVuOwogICAgc3RyY3B5KHZpZXcgKyAxLCB2aWV3TmFtZSk7CiAgICBERUJVR01TR1RMKCgiOTp2YWNtOmNoZWNrU3VidHJlZSIsICJ2aWV3ICVzXG4iLCB2aWV3TmFtZSkpOwogICAgZm9yICh2cCA9IGhlYWQ7IHZwOyB2cCA9IHZwLT5uZXh0KSB7CiAgICAgICAgaWYgKCFtZW1jbXAodmlldywgdnAtPnZpZXdOYW1lLCBnbGVuICsgMSkpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogSWYgdGhlIHN1YnRyZWUgZGVmaW5lZCBpbiB0aGUgdmlldyBpcyBzaG9ydGVyIHRoYW4gb3IgZXF1YWwKICAgICAgICAgICAgICogdG8gdGhlIHN1YnRyZWUgd2UgYXJlIGNvbXBhcmluZywgdGhlbiBpdCBtaWdodCBlbnZlbG9wIHRoZQogICAgICAgICAgICAgKiBzdWJ0cmVlIHdlIGFyZSBjb21wYXJpbmcgYWdhaW5zdC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmICh2aWV3U3VidHJlZUxlbiA+PSAodnAtPnZpZXdTdWJ0cmVlTGVuIC0gMSkpIHsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBtYXNrID0gMHg4MCwgbWFza3BvcyA9IDA7CiAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgb2lkcG9zOwogICAgICAgICAgICAgICAgZm91bmQgPSAxOwoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBjaGVjayB0aGUgbWFzawogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmb3IgKG9pZHBvcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgIGZvdW5kICYmIG9pZHBvcyA8IChpbnQpIHZwLT52aWV3U3VidHJlZUxlbiAtIDE7CiAgICAgICAgICAgICAgICAgICAgIG9pZHBvcysrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKFZJRVdfTUFTSyh2cCwgbWFza3BvcywgbWFzaykgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlld1N1YnRyZWVbb2lkcG9zXSAhPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdnAtPnZpZXdTdWJ0cmVlW29pZHBvcyArIDFdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAobWFzayA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSAweDgwOwogICAgICAgICAgICAgICAgICAgICAgICBtYXNrcG9zKys7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPj49IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7CiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiBtYXRjaCBzdWNjZXNzZnVsLCBrZWVwIHRoaXMgbm9kZSBpZiBpdCdzIGxvbmdlciB0aGFuCiAgICAgICAgICAgICAgICAgICAgICogdGhlIHByZXZpb3VzIG9yIChlcXVhbCBhbmQgbGV4aWNvZ3JhcGhpY2FsbHkgZ3JlYXRlcgogICAgICAgICAgICAgICAgICAgICAqIHRoYW4gdGhlIHByZXZpb3VzKS4gCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIjk6dmFjbTpjaGVja1N1YnRyZWUiLCAiICVzIG1hdGNoZWQ/XG4iLCB2cC0+dmlld05hbWUpKTsKICAgIAogICAgICAgICAgICAgICAgICAgIGlmICh2cFNob3J0ZXIgPT0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICB8fCB2cC0+dmlld1N1YnRyZWVMZW4gPiB2cFNob3J0ZXItPnZpZXdTdWJ0cmVlTGVuCiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICh2cC0+dmlld1N1YnRyZWVMZW4gPT0gdnBTaG9ydGVyLT52aWV3U3VidHJlZUxlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzbm1wX29pZF9jb21wYXJlKHZwLT52aWV3U3VidHJlZSArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnAtPnZpZXdTdWJ0cmVlTGVuIC0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cFNob3J0ZXItPnZpZXdTdWJ0cmVlICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cFNob3J0ZXItPnZpZXdTdWJ0cmVlTGVuIC0gMSkgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZwU2hvcnRlciA9IHZwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBJZiB0aGUgc3VidHJlZSBkZWZpbmVkIGluIHRoZSB2aWV3IGlzIGxvbmdlciB0aGFuIHRoZQogICAgICAgICAgICAgKiBzdWJ0cmVlIHdlIGFyZSBjb21wYXJpbmcsIHRoZW4gaXQgbWlnaHQgYW1iaWd1YXRlIG91cgogICAgICAgICAgICAgKiByZXNwb25zZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIG1hc2sgPSAweDgwLCBtYXNrcG9zID0gMDsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBvaWRwb3M7CiAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGNoZWNrIHRoZSBtYXNrIHVwIHRvIHRoZSBsZW5ndGggb2YgdGhlIHByb3ZpZGVkIHN1YnRyZWUKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZm9yIChvaWRwb3MgPSAwOwogICAgICAgICAgICAgICAgICAgICBmb3VuZCAmJiBvaWRwb3MgPCAoaW50KSB2aWV3U3VidHJlZUxlbjsKICAgICAgICAgICAgICAgICAgICAgb2lkcG9zKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAoVklFV19NQVNLKHZwLCBtYXNrcG9zLCBtYXNrKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWV3U3VidHJlZVtvaWRwb3NdICE9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cC0+dmlld1N1YnRyZWVbb2lkcG9zICsgMV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChtYXNrID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFzayA9IDB4ODA7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2twb3MrKzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgbWFzayA+Pj0gMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHsKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIG1hdGNoIHN1Y2Nlc3NmdWwuICBJZiB3ZSBhbHJlYWR5IGZvdW5kIGEgbWF0Y2gKICAgICAgICAgICAgICAgICAgICAgKiB3aXRoIGEgZGlmZmVyZW50IHZpZXcgdHlwZSwgdGhlbiBwYXJ0cyBvZiB0aGUgc3VidHJlZSAKICAgICAgICAgICAgICAgICAgICAgKiBhcmUgaW5jbHVkZWQgYW5kIG90aGVycyBhcmUgZXhjbHVkZWQsIHNvIHJldHVybiBVTktOT1dOLgogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCI5OnZhY206Y2hlY2tTdWJ0cmVlIiwgIiAlcyBtYXRjaGVkP1xuIiwgdnAtPnZpZXdOYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZwTG9uZ2VyICE9IE5VTEwKICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHZwTG9uZ2VyLT52aWV3VHlwZSAhPSB2cC0+dmlld1R5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ2YWNtOmNoZWNrU3VidHJlZSIsICIsICVzXG4iLCAidW5rbm93biIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZBQ01fU1VCVFJFRV9VTktOT1dOOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2cExvbmdlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZwTG9uZ2VyID0gdnA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgREVCVUdNU0dUTCgoIjk6dmFjbTpjaGVja1N1YnRyZWUiLCAiICVzIG1hdGNoZWRcbiIsIHZpZXdOYW1lKSk7CgogICAgLyoKICAgICAqIElmIHdlIGZvdW5kIGEgbWF0Y2hpbmcgdmlldyBzdWJ0cmVlIHdpdGggYSBsb25nZXIgT0lEIHRoYW4gdGhlIHByb3ZpZGVkCiAgICAgKiBPSUQsIGNoZWNrIHRvIHNlZSBpZiBpdHMgdHlwZSBpcyBjb25zaXN0ZW50IHdpdGggYW55IG1hdGNoaW5nIHZpZXcKICAgICAqIHN1YnRyZWUgd2UgbWF5IGhhdmUgZm91bmQgd2l0aCBhIHNob3J0ZXIgT0lEIHRoYW4gdGhlIHByb3ZpZGVkIE9JRC4KICAgICAqCiAgICAgKiBUaGUgdmlldyB0eXBlIG9mIHRoZSBsb25nZXIgT0lEIGlzIGluY29uc2lzdGVudCB3aXRoIHRoZSBzaG9ydGVyIE9JRCBpbgogICAgICogZWl0aGVyIG9mIHRoZXNlIHR3byBjYXNlczoKICAgICAqICAxKSBObyBtYXRjaGluZyBzaG9ydGVyIE9JRCB3YXMgZm91bmQgYW5kIHRoZSB2aWV3IHR5cGUgb2YgdGhlIGxvbmdlcgogICAgICogICAgIE9JRCBpcyBJTkNMVURFLgogICAgICogIDIpIEEgbWF0Y2hpbmcgc2hvcnRlciBJRCB3YXMgZm91bmQgYW5kIGl0cyB2aWV3IHR5cGUgZG9lc24ndCBtYXRjaAogICAgICogICAgIHRoZSB2aWV3IHR5cGUgb2YgdGhlIGxvbmdlciBPSUQuCiAgICAgKi8KICAgIGlmICh2cExvbmdlciAhPSBOVUxMKSB7CiAgICAgICAgaWYgKCghdnBTaG9ydGVyICYmIHZwTG9uZ2VyLT52aWV3VHlwZSAhPSBTTk1QX1ZJRVdfRVhDTFVERUQpCiAgICAgICAgICAgIHx8ICh2cFNob3J0ZXIgJiYgdnBMb25nZXItPnZpZXdUeXBlICE9IHZwU2hvcnRlci0+dmlld1R5cGUpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ2YWNtOmNoZWNrU3VidHJlZSIsICIsICVzXG4iLCAidW5rbm93biIpKTsKICAgICAgICAgICAgcmV0dXJuIFZBQ01fU1VCVFJFRV9VTktOT1dOOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAodnBTaG9ydGVyICYmIHZwU2hvcnRlci0+dmlld1R5cGUgIT0gU05NUF9WSUVXX0VYQ0xVREVEKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInZhY206Y2hlY2tTdWJ0cmVlIiwgIiwgJXNcbiIsICJpbmNsdWRlZCIpKTsKICAgICAgICByZXR1cm4gVkFDTV9TVUNDRVNTOwogICAgfQoKICAgIERFQlVHTVNHVEwoKCJ2YWNtOmNoZWNrU3VidHJlZSIsICIsICVzXG4iLCAiZXhjbHVkZWQiKSk7CiAgICByZXR1cm4gVkFDTV9OT1RJTlZJRVc7Cn0KCnZvaWQKdmFjbV9zY2FuVmlld0luaXQodm9pZCkKewogICAgdmlld1NjYW5QdHIgPSB2aWV3TGlzdDsKfQoKc3RydWN0IHZhY21fdmlld0VudHJ5ICoKdmFjbV9zY2FuVmlld05leHQodm9pZCkKewogICAgc3RydWN0IHZhY21fdmlld0VudHJ5ICpyZXR1cm52YWwgPSB2aWV3U2NhblB0cjsKICAgIGlmICh2aWV3U2NhblB0cikKICAgICAgICB2aWV3U2NhblB0ciA9IHZpZXdTY2FuUHRyLT5uZXh0OwogICAgcmV0dXJuIHJldHVybnZhbDsKfQoKc3RydWN0IHZhY21fdmlld0VudHJ5ICoKbmV0c25tcF92aWV3X2NyZWF0ZShzdHJ1Y3QgdmFjbV92aWV3RW50cnkgKipoZWFkLCBjb25zdCBjaGFyICp2aWV3TmFtZSwKICAgICAgICAgICAgICAgICAgICAgb2lkICogdmlld1N1YnRyZWUsIHNpemVfdCB2aWV3U3VidHJlZUxlbikKewogICAgc3RydWN0IHZhY21fdmlld0VudHJ5ICp2cCwgKmxwLCAqb3AgPSBOVUxMOwogICAgaW50ICAgICAgICAgICAgIGNtcCwgY21wMiwgZ2xlbjsKCiAgICBnbGVuID0gKGludCkgc3RybGVuKHZpZXdOYW1lKTsKICAgIGlmIChnbGVuIDwgMCB8fCBnbGVuID4gVkFDTV9NQVhfU1RSSU5HKQogICAgICAgIHJldHVybiBOVUxMOwogICAgdnAgPSAoc3RydWN0IHZhY21fdmlld0VudHJ5ICopIGNhbGxvYygxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHZhY21fdmlld0VudHJ5KSk7CiAgICBpZiAodnAgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIHZwLT5yZXNlcnZlZCA9CiAgICAgICAgKHN0cnVjdCB2YWNtX3ZpZXdFbnRyeSAqKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB2YWNtX3ZpZXdFbnRyeSkpOwogICAgaWYgKHZwLT5yZXNlcnZlZCA9PSBOVUxMKSB7CiAgICAgICAgZnJlZSh2cCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgdnAtPnZpZXdOYW1lWzBdID0gZ2xlbjsKICAgIHN0cmNweSh2cC0+dmlld05hbWUgKyAxLCB2aWV3TmFtZSk7CiAgICB2cC0+dmlld1N1YnRyZWVbMF0gPSB2aWV3U3VidHJlZUxlbjsKICAgIG1lbWNweSh2cC0+dmlld1N1YnRyZWUgKyAxLCB2aWV3U3VidHJlZSwgdmlld1N1YnRyZWVMZW4gKiBzaXplb2Yob2lkKSk7CiAgICB2cC0+dmlld1N1YnRyZWVMZW4gPSB2aWV3U3VidHJlZUxlbiArIDE7CgogICAgbHAgPSAqaGVhZDsKICAgIHdoaWxlIChscCkgewogICAgICAgIGNtcCA9IG1lbWNtcChscC0+dmlld05hbWUsIHZwLT52aWV3TmFtZSwgZ2xlbiArIDEpOwogICAgICAgIGNtcDIgPSBzbm1wX29pZF9jb21wYXJlKGxwLT52aWV3U3VidHJlZSwgbHAtPnZpZXdTdWJ0cmVlTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwLT52aWV3U3VidHJlZSwgdnAtPnZpZXdTdWJ0cmVlTGVuKTsKICAgICAgICBpZiAoY21wID09IDAgJiYgY21wMiA+IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGlmIChjbXAgPiAwKQogICAgICAgICAgICBicmVhazsKICAgICAgICBvcCA9IGxwOwogICAgICAgIGxwID0gbHAtPm5leHQ7CiAgICB9CiAgICB2cC0+bmV4dCA9IGxwOwogICAgaWYgKG9wKQogICAgICAgIG9wLT5uZXh0ID0gdnA7CiAgICBlbHNlCiAgICAgICAgKmhlYWQgPSB2cDsKICAgIHJldHVybiB2cDsKfQoKdm9pZApuZXRzbm1wX3ZpZXdfZGVzdHJveShzdHJ1Y3QgdmFjbV92aWV3RW50cnkgKipoZWFkLCBjb25zdCBjaGFyICp2aWV3TmFtZSwKICAgICAgICAgICAgICAgICAgICAgIG9pZCAqIHZpZXdTdWJ0cmVlLCBzaXplX3Qgdmlld1N1YnRyZWVMZW4pCnsKICAgIHN0cnVjdCB2YWNtX3ZpZXdFbnRyeSAqdnAsICpsYXN0dnAgPSBOVUxMOwoKICAgIGlmICgoKmhlYWQpICYmICFzdHJjbXAoKCpoZWFkKS0+dmlld05hbWUgKyAxLCB2aWV3TmFtZSkKICAgICAgICAmJiAoKmhlYWQpLT52aWV3U3VidHJlZUxlbiA9PSB2aWV3U3VidHJlZUxlbgogICAgICAgICYmICFtZW1jbXAoKGNoYXIgKikgKCpoZWFkKS0+dmlld1N1YnRyZWUsIChjaGFyICopIHZpZXdTdWJ0cmVlLAogICAgICAgICAgICAgICAgICAgdmlld1N1YnRyZWVMZW4gKiBzaXplb2Yob2lkKSkpIHsKICAgICAgICB2cCA9ICgqaGVhZCk7CiAgICAgICAgKCpoZWFkKSA9ICgqaGVhZCktPm5leHQ7CiAgICB9IGVsc2UgewogICAgICAgIGZvciAodnAgPSAoKmhlYWQpOyB2cDsgdnAgPSB2cC0+bmV4dCkgewogICAgICAgICAgICBpZiAoIXN0cmNtcCh2cC0+dmlld05hbWUgKyAxLCB2aWV3TmFtZSkKICAgICAgICAgICAgICAgICYmIHZwLT52aWV3U3VidHJlZUxlbiA9PSB2aWV3U3VidHJlZUxlbgogICAgICAgICAgICAgICAgJiYgIW1lbWNtcCgoY2hhciAqKSB2cC0+dmlld1N1YnRyZWUsIChjaGFyICopIHZpZXdTdWJ0cmVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3U3VidHJlZUxlbiAqIHNpemVvZihvaWQpKSkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBsYXN0dnAgPSB2cDsKICAgICAgICB9CiAgICAgICAgaWYgKCF2cCB8fCAhbGFzdHZwKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgbGFzdHZwLT5uZXh0ID0gdnAtPm5leHQ7CiAgICB9CiAgICBpZiAodnAtPnJlc2VydmVkKQogICAgICAgIGZyZWUodnAtPnJlc2VydmVkKTsKICAgIGZyZWUodnApOwogICAgcmV0dXJuOwp9Cgp2b2lkCm5ldHNubXBfdmlld19jbGVhcihzdHJ1Y3QgdmFjbV92aWV3RW50cnkgKipoZWFkKQp7CiAgICBzdHJ1Y3QgdmFjbV92aWV3RW50cnkgKnZwOwogICAgd2hpbGUgKCh2cCA9ICgqaGVhZCkpKSB7CiAgICAgICAgKCpoZWFkKSA9IHZwLT5uZXh0OwogICAgICAgIGlmICh2cC0+cmVzZXJ2ZWQpCiAgICAgICAgICAgIGZyZWUodnAtPnJlc2VydmVkKTsKICAgICAgICBmcmVlKHZwKTsKICAgIH0KfQoKc3RydWN0IHZhY21fZ3JvdXBFbnRyeSAqCnZhY21fZ2V0R3JvdXBFbnRyeShpbnQgc2VjdXJpdHlNb2RlbCwgY29uc3QgY2hhciAqc2VjdXJpdHlOYW1lKQp7CiAgICBzdHJ1Y3QgdmFjbV9ncm91cEVudHJ5ICp2cDsKICAgIGNoYXIgICAgICAgICAgICBzZWNuYW1lW1ZBQ01TVFJJTkdMRU5dOwogICAgaW50ICAgICAgICAgICAgIGdsZW47CgogICAgZ2xlbiA9IChpbnQpIHN0cmxlbihzZWN1cml0eU5hbWUpOwogICAgaWYgKGdsZW4gPCAwIHx8IGdsZW4gPiBWQUNNX01BWF9TVFJJTkcpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBzZWNuYW1lWzBdID0gZ2xlbjsKICAgIHN0cmNweShzZWNuYW1lICsgMSwgc2VjdXJpdHlOYW1lKTsKCiAgICBmb3IgKHZwID0gZ3JvdXBMaXN0OyB2cDsgdnAgPSB2cC0+bmV4dCkgewogICAgICAgIGlmICgoc2VjdXJpdHlNb2RlbCA9PSB2cC0+c2VjdXJpdHlNb2RlbAogICAgICAgICAgICAgfHwgdnAtPnNlY3VyaXR5TW9kZWwgPT0gU05NUF9TRUNfTU9ERUxfQU5ZKQogICAgICAgICAgICAmJiAhbWVtY21wKHZwLT5zZWN1cml0eU5hbWUsIHNlY25hbWUsIGdsZW4gKyAxKSkKICAgICAgICAgICAgcmV0dXJuIHZwOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCnZvaWQKdmFjbV9zY2FuR3JvdXBJbml0KHZvaWQpCnsKICAgIGdyb3VwU2NhblB0ciA9IGdyb3VwTGlzdDsKfQoKc3RydWN0IHZhY21fZ3JvdXBFbnRyeSAqCnZhY21fc2Nhbkdyb3VwTmV4dCh2b2lkKQp7CiAgICBzdHJ1Y3QgdmFjbV9ncm91cEVudHJ5ICpyZXR1cm52YWwgPSBncm91cFNjYW5QdHI7CiAgICBpZiAoZ3JvdXBTY2FuUHRyKQogICAgICAgIGdyb3VwU2NhblB0ciA9IGdyb3VwU2NhblB0ci0+bmV4dDsKICAgIHJldHVybiByZXR1cm52YWw7Cn0KCnN0cnVjdCB2YWNtX2dyb3VwRW50cnkgKgp2YWNtX2NyZWF0ZUdyb3VwRW50cnkoaW50IHNlY3VyaXR5TW9kZWwsIGNvbnN0IGNoYXIgKnNlY3VyaXR5TmFtZSkKewogICAgc3RydWN0IHZhY21fZ3JvdXBFbnRyeSAqZ3AsICpsZywgKm9nOwogICAgaW50ICAgICAgICAgICAgIGNtcCwgZ2xlbjsKCiAgICBnbGVuID0gKGludCkgc3RybGVuKHNlY3VyaXR5TmFtZSk7CiAgICBpZiAoZ2xlbiA8IDAgfHwgZ2xlbiA+IFZBQ01fTUFYX1NUUklORykKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGdwID0gKHN0cnVjdCB2YWNtX2dyb3VwRW50cnkgKikgY2FsbG9jKDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHZhY21fZ3JvdXBFbnRyeSkpOwogICAgaWYgKGdwID09IE5VTEwpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBncC0+cmVzZXJ2ZWQgPQogICAgICAgIChzdHJ1Y3QgdmFjbV9ncm91cEVudHJ5ICopIGNhbGxvYygxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHZhY21fZ3JvdXBFbnRyeSkpOwogICAgaWYgKGdwLT5yZXNlcnZlZCA9PSBOVUxMKSB7CiAgICAgICAgZnJlZShncCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgZ3AtPnNlY3VyaXR5TW9kZWwgPSBzZWN1cml0eU1vZGVsOwogICAgZ3AtPnNlY3VyaXR5TmFtZVswXSA9IGdsZW47CiAgICBzdHJjcHkoZ3AtPnNlY3VyaXR5TmFtZSArIDEsIHNlY3VyaXR5TmFtZSk7CgogICAgbGcgPSBncm91cExpc3Q7CiAgICBvZyA9IE5VTEw7CiAgICB3aGlsZSAobGcpIHsKICAgICAgICBpZiAobGctPnNlY3VyaXR5TW9kZWwgPiBzZWN1cml0eU1vZGVsKQogICAgICAgICAgICBicmVhazsKICAgICAgICBpZiAobGctPnNlY3VyaXR5TW9kZWwgPT0gc2VjdXJpdHlNb2RlbCAmJgogICAgICAgICAgICAoY21wID0KICAgICAgICAgICAgIG1lbWNtcChsZy0+c2VjdXJpdHlOYW1lLCBncC0+c2VjdXJpdHlOYW1lLCBnbGVuICsgMSkpID4gMCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLyoKICAgICAgICAgKiBpZiAobGctPnNlY3VyaXR5TW9kZWwgPT0gc2VjdXJpdHlNb2RlbCAmJiBjbXAgPT0gMCkgYWJvcnQoKTsgCiAgICAgICAgICovCiAgICAgICAgb2cgPSBsZzsKICAgICAgICBsZyA9IGxnLT5uZXh0OwogICAgfQogICAgZ3AtPm5leHQgPSBsZzsKICAgIGlmIChvZyA9PSBOVUxMKQogICAgICAgIGdyb3VwTGlzdCA9IGdwOwogICAgZWxzZQogICAgICAgIG9nLT5uZXh0ID0gZ3A7CiAgICByZXR1cm4gZ3A7Cn0KCnZvaWQKdmFjbV9kZXN0cm95R3JvdXBFbnRyeShpbnQgc2VjdXJpdHlNb2RlbCwgY29uc3QgY2hhciAqc2VjdXJpdHlOYW1lKQp7CiAgICBzdHJ1Y3QgdmFjbV9ncm91cEVudHJ5ICp2cCwgKmxhc3R2cCA9IE5VTEw7CgogICAgaWYgKGdyb3VwTGlzdCAmJiBncm91cExpc3QtPnNlY3VyaXR5TW9kZWwgPT0gc2VjdXJpdHlNb2RlbAogICAgICAgICYmICFzdHJjbXAoZ3JvdXBMaXN0LT5zZWN1cml0eU5hbWUgKyAxLCBzZWN1cml0eU5hbWUpKSB7CiAgICAgICAgdnAgPSBncm91cExpc3Q7CiAgICAgICAgZ3JvdXBMaXN0ID0gZ3JvdXBMaXN0LT5uZXh0OwogICAgfSBlbHNlIHsKICAgICAgICBmb3IgKHZwID0gZ3JvdXBMaXN0OyB2cDsgdnAgPSB2cC0+bmV4dCkgewogICAgICAgICAgICBpZiAodnAtPnNlY3VyaXR5TW9kZWwgPT0gc2VjdXJpdHlNb2RlbAogICAgICAgICAgICAgICAgJiYgIXN0cmNtcCh2cC0+c2VjdXJpdHlOYW1lICsgMSwgc2VjdXJpdHlOYW1lKSkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBsYXN0dnAgPSB2cDsKICAgICAgICB9CiAgICAgICAgaWYgKCF2cCB8fCAhbGFzdHZwKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgbGFzdHZwLT5uZXh0ID0gdnAtPm5leHQ7CiAgICB9CiAgICBpZiAodnAtPnJlc2VydmVkKQogICAgICAgIGZyZWUodnAtPnJlc2VydmVkKTsKICAgIGZyZWUodnApOwogICAgcmV0dXJuOwp9Cgp2b2lkCnZhY21fZGVzdHJveUFsbEdyb3VwRW50cmllcyh2b2lkKQp7CiAgICBzdHJ1Y3QgdmFjbV9ncm91cEVudHJ5ICpncDsKICAgIHdoaWxlICgoZ3AgPSBncm91cExpc3QpKSB7CiAgICAgICAgZ3JvdXBMaXN0ID0gZ3AtPm5leHQ7CiAgICAgICAgaWYgKGdwLT5yZXNlcnZlZCkKICAgICAgICAgICAgZnJlZShncC0+cmVzZXJ2ZWQpOwogICAgICAgIGZyZWUoZ3ApOwogICAgfQp9CgpzdHJ1Y3QgdmFjbV9hY2Nlc3NFbnRyeSAqCl92YWNtX2Nob29zZV9iZXN0KCBzdHJ1Y3QgdmFjbV9hY2Nlc3NFbnRyeSAqY3VycmVudCwKICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2YWNtX2FjY2Vzc0VudHJ5ICpjYW5kaWRhdGUpCnsKICAgIC8qCiAgICAgKiBSRkMgMzQxNTogdmFjbUFjY2Vzc1RhYmxlOgogICAgICogICAgMikgaWYgdGhpcyBzZXQgaGFzIFttb3JlIHRoYW5dIG9uZSBtZW1iZXIsIC4uLgogICAgICogICAgICAgaXQgY29tZXMgZG93biB0byBkZWNpZGluZyBob3cgdG8gd2VpZ2h0IHRoZQogICAgICogICAgICAgcHJlZmVyZW5jZXMgYmV0d2VlbiBDb250ZXh0UHJlZml4ZXMsCiAgICAgKiAgICAgICBTZWN1cml0eU1vZGVscywgYW5kIFNlY3VyaXR5TGV2ZWxzCiAgICAgKi8KICAgIGlmICgoICFjdXJyZW50ICkgfHwKICAgICAgICAvKiBhKSBpZiB0aGUgc3Vic2V0IG9mIGVudHJpZXMgd2l0aCBzZWN1cml0eU1vZGVsCiAgICAgICAgICogICAgbWF0Y2hpbmcgdGhlIHNlY3VyaXR5TW9kZWwgaW4gdGhlIG1lc3NhZ2UgaXMKICAgICAgICAgKiAgICBub3QgZW1wdHksIHRoZW4gZGlzY2FyZCB0aGUgcmVzdAogICAgICAgICAqLwogICAgICAgICggIGN1cnJlbnQtPnNlY3VyaXR5TW9kZWwgPT0gU05NUF9TRUNfTU9ERUxfQU5ZICYmCiAgICAgICAgIGNhbmRpZGF0ZS0+c2VjdXJpdHlNb2RlbCAhPSBTTk1QX1NFQ19NT0RFTF9BTlkgKSB8fAogICAgICAgIC8qIGIpIGlmIHRoZSBzdWJzZXQgb2YgZW50cmllcyB3aXRoIHZhY21BY2Nlc3NDb250ZXh0UHJlZml4CiAgICAgICAgICogICAgbWF0Y2hpbmcgdGhlIGNvbnRleHROYW1lIGluIHRoZSBtZXNzYWdlIGlzCiAgICAgICAgICogICAgbm90IGVtcHR5LCB0aGVuIGRpc2NhcmQgdGhlIHJlc3QKICAgICAgICAgKi8KICAgICAgICAoICBjdXJyZW50LT5jb250ZXh0TWF0Y2ggID09IENPTlRFWFRfTUFUQ0hfUFJFRklYICYmCiAgICAgICAgIGNhbmRpZGF0ZS0+Y29udGV4dE1hdGNoICA9PSBDT05URVhUX01BVENIX0VYQUNUICkgfHwKICAgICAgICAvKiBjKSBkaXNjYXJkIGFsbCBlbnRyaWVzIHdpdGggQ29udGV4dFByZWZpeGVzIHNob3J0ZXIKICAgICAgICAgKiAgICB0aGFuIHRoZSBsb25nZXN0IG9uZSByZW1haW5pbmcgaW4gdGhlIHNldAogICAgICAgICAqLwogICAgICAgICggIGN1cnJlbnQtPmNvbnRleHRNYXRjaCAgPT0gQ09OVEVYVF9NQVRDSF9QUkVGSVggJiYKICAgICAgICAgICBjdXJyZW50LT5jb250ZXh0UHJlZml4WzBdIDwgY2FuZGlkYXRlLT5jb250ZXh0UHJlZml4WzBdICkgfHwKICAgICAgICAvKiBkKSBzZWxlY3QgdGhlIGVudHJ5IHdpdGggdGhlIGhpZ2hlc3Qgc2VjdXJpdHlMZXZlbAogICAgICAgICAqLwogICAgICAgICggIGN1cnJlbnQtPnNlY3VyaXR5TGV2ZWwgPCBjYW5kaWRhdGUtPnNlY3VyaXR5TGV2ZWwgKSkgewoKICAgICAgICByZXR1cm4gY2FuZGlkYXRlOwogICAgfQoKICAgIHJldHVybiBjdXJyZW50Owp9CgpzdHJ1Y3QgdmFjbV9hY2Nlc3NFbnRyeSAqCnZhY21fZ2V0QWNjZXNzRW50cnkoY29uc3QgY2hhciAqZ3JvdXBOYW1lLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnRleHRQcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgaW50IHNlY3VyaXR5TW9kZWwsIGludCBzZWN1cml0eUxldmVsKQp7CiAgICBzdHJ1Y3QgdmFjbV9hY2Nlc3NFbnRyeSAqdnAsICpiZXN0PU5VTEw7CiAgICBjaGFyICAgICAgICAgICAgZ3JvdXBbVkFDTVNUUklOR0xFTl07CiAgICBjaGFyICAgICAgICAgICAgY29udGV4dFtWQUNNU1RSSU5HTEVOXTsKICAgIGludCAgICAgICAgICAgICBnbGVuLCBjbGVuOwoKICAgIGdsZW4gPSAoaW50KSBzdHJsZW4oZ3JvdXBOYW1lKTsKICAgIGlmIChnbGVuIDwgMCB8fCBnbGVuID4gVkFDTV9NQVhfU1RSSU5HKQogICAgICAgIHJldHVybiBOVUxMOwogICAgY2xlbiA9IChpbnQpIHN0cmxlbihjb250ZXh0UHJlZml4KTsKICAgIGlmIChjbGVuIDwgMCB8fCBjbGVuID4gVkFDTV9NQVhfU1RSSU5HKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGdyb3VwWzBdID0gZ2xlbjsKICAgIHN0cmNweShncm91cCArIDEsIGdyb3VwTmFtZSk7CiAgICBjb250ZXh0WzBdID0gY2xlbjsKICAgIHN0cmNweShjb250ZXh0ICsgMSwgY29udGV4dFByZWZpeCk7CiAgICBmb3IgKHZwID0gYWNjZXNzTGlzdDsgdnA7IHZwID0gdnAtPm5leHQpIHsKICAgICAgICBpZiAoKHNlY3VyaXR5TW9kZWwgPT0gdnAtPnNlY3VyaXR5TW9kZWwKICAgICAgICAgICAgIHx8IHZwLT5zZWN1cml0eU1vZGVsID09IFNOTVBfU0VDX01PREVMX0FOWSkKICAgICAgICAgICAgJiYgc2VjdXJpdHlMZXZlbCA+PSB2cC0+c2VjdXJpdHlMZXZlbAogICAgICAgICAgICAmJiAhbWVtY21wKHZwLT5ncm91cE5hbWUsIGdyb3VwLCBnbGVuICsgMSkKICAgICAgICAgICAgJiYKICAgICAgICAgICAgKCh2cC0+Y29udGV4dE1hdGNoID09IENPTlRFWFRfTUFUQ0hfRVhBQ1QKICAgICAgICAgICAgICAmJiBjbGVuID09IHZwLT5jb250ZXh0UHJlZml4WzBdCiAgICAgICAgICAgICAgJiYgKG1lbWNtcCh2cC0+Y29udGV4dFByZWZpeCwgY29udGV4dCwgY2xlbiArIDEpID09IDApKQogICAgICAgICAgICAgfHwgKHZwLT5jb250ZXh0TWF0Y2ggPT0gQ09OVEVYVF9NQVRDSF9QUkVGSVgKICAgICAgICAgICAgICAgICAmJiBjbGVuID49IHZwLT5jb250ZXh0UHJlZml4WzBdCiAgICAgICAgICAgICAgICAgJiYgKG1lbWNtcCh2cC0+Y29udGV4dFByZWZpeCArIDEsIGNvbnRleHQgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdnAtPmNvbnRleHRQcmVmaXhbMF0pID09IDApKSkpCiAgICAgICAgICAgIGJlc3QgPSBfdmFjbV9jaG9vc2VfYmVzdCggYmVzdCwgdnAgKTsKICAgIH0KICAgIHJldHVybiBiZXN0Owp9Cgp2b2lkCnZhY21fc2NhbkFjY2Vzc0luaXQodm9pZCkKewogICAgYWNjZXNzU2NhblB0ciA9IGFjY2Vzc0xpc3Q7Cn0KCnN0cnVjdCB2YWNtX2FjY2Vzc0VudHJ5ICoKdmFjbV9zY2FuQWNjZXNzTmV4dCh2b2lkKQp7CiAgICBzdHJ1Y3QgdmFjbV9hY2Nlc3NFbnRyeSAqcmV0dXJudmFsID0gYWNjZXNzU2NhblB0cjsKICAgIGlmIChhY2Nlc3NTY2FuUHRyKQogICAgICAgIGFjY2Vzc1NjYW5QdHIgPSBhY2Nlc3NTY2FuUHRyLT5uZXh0OwogICAgcmV0dXJuIHJldHVybnZhbDsKfQoKc3RydWN0IHZhY21fYWNjZXNzRW50cnkgKgp2YWNtX2NyZWF0ZUFjY2Vzc0VudHJ5KGNvbnN0IGNoYXIgKmdyb3VwTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb250ZXh0UHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgIGludCBzZWN1cml0eU1vZGVsLCBpbnQgc2VjdXJpdHlMZXZlbCkKewogICAgc3RydWN0IHZhY21fYWNjZXNzRW50cnkgKnZwLCAqbHAsICpvcCA9IE5VTEw7CiAgICBpbnQgICAgICAgICAgICAgY21wLCBnbGVuLCBjbGVuOwoKICAgIGdsZW4gPSAoaW50KSBzdHJsZW4oZ3JvdXBOYW1lKTsKICAgIGlmIChnbGVuIDwgMCB8fCBnbGVuID4gVkFDTV9NQVhfU1RSSU5HKQogICAgICAgIHJldHVybiBOVUxMOwogICAgY2xlbiA9IChpbnQpIHN0cmxlbihjb250ZXh0UHJlZml4KTsKICAgIGlmIChjbGVuIDwgMCB8fCBjbGVuID4gVkFDTV9NQVhfU1RSSU5HKQogICAgICAgIHJldHVybiBOVUxMOwogICAgdnAgPSAoc3RydWN0IHZhY21fYWNjZXNzRW50cnkgKikgY2FsbG9jKDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWNtX2FjY2Vzc0VudHJ5KSk7CiAgICBpZiAodnAgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIHZwLT5yZXNlcnZlZCA9CiAgICAgICAgKHN0cnVjdCB2YWNtX2FjY2Vzc0VudHJ5ICopIGNhbGxvYygxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhY21fYWNjZXNzRW50cnkpKTsKICAgIGlmICh2cC0+cmVzZXJ2ZWQgPT0gTlVMTCkgewogICAgICAgIGZyZWUodnApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIHZwLT5zZWN1cml0eU1vZGVsID0gc2VjdXJpdHlNb2RlbDsKICAgIHZwLT5zZWN1cml0eUxldmVsID0gc2VjdXJpdHlMZXZlbDsKICAgIHZwLT5ncm91cE5hbWVbMF0gPSBnbGVuOwogICAgc3RyY3B5KHZwLT5ncm91cE5hbWUgKyAxLCBncm91cE5hbWUpOwogICAgdnAtPmNvbnRleHRQcmVmaXhbMF0gPSBjbGVuOwogICAgc3RyY3B5KHZwLT5jb250ZXh0UHJlZml4ICsgMSwgY29udGV4dFByZWZpeCk7CgogICAgbHAgPSBhY2Nlc3NMaXN0OwogICAgd2hpbGUgKGxwKSB7CiAgICAgICAgY21wID0gbWVtY21wKGxwLT5ncm91cE5hbWUsIHZwLT5ncm91cE5hbWUsIGdsZW4gKyAxKTsKICAgICAgICBpZiAoY21wID4gMCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgaWYgKGNtcCA8IDApCiAgICAgICAgICAgIGdvdG8gbmV4dDsKICAgICAgICBjbXAgPSBtZW1jbXAobHAtPmNvbnRleHRQcmVmaXgsIHZwLT5jb250ZXh0UHJlZml4LCBjbGVuICsgMSk7CiAgICAgICAgaWYgKGNtcCA+IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGlmIChjbXAgPCAwKQogICAgICAgICAgICBnb3RvIG5leHQ7CiAgICAgICAgaWYgKGxwLT5zZWN1cml0eU1vZGVsID4gc2VjdXJpdHlNb2RlbCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgaWYgKGxwLT5zZWN1cml0eU1vZGVsIDwgc2VjdXJpdHlNb2RlbCkKICAgICAgICAgICAgZ290byBuZXh0OwogICAgICAgIGlmIChscC0+c2VjdXJpdHlMZXZlbCA+IHNlY3VyaXR5TGV2ZWwpCiAgICAgICAgICAgIGJyZWFrOwogICAgICBuZXh0OgogICAgICAgIG9wID0gbHA7CiAgICAgICAgbHAgPSBscC0+bmV4dDsKICAgIH0KICAgIHZwLT5uZXh0ID0gbHA7CiAgICBpZiAob3AgPT0gTlVMTCkKICAgICAgICBhY2Nlc3NMaXN0ID0gdnA7CiAgICBlbHNlCiAgICAgICAgb3AtPm5leHQgPSB2cDsKICAgIHJldHVybiB2cDsKfQoKdm9pZAp2YWNtX2Rlc3Ryb3lBY2Nlc3NFbnRyeShjb25zdCBjaGFyICpncm91cE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnRleHRQcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWN1cml0eU1vZGVsLCBpbnQgc2VjdXJpdHlMZXZlbCkKewogICAgc3RydWN0IHZhY21fYWNjZXNzRW50cnkgKnZwLCAqbGFzdHZwID0gTlVMTDsKCiAgICBpZiAoYWNjZXNzTGlzdCAmJiBhY2Nlc3NMaXN0LT5zZWN1cml0eU1vZGVsID09IHNlY3VyaXR5TW9kZWwKICAgICAgICAmJiBhY2Nlc3NMaXN0LT5zZWN1cml0eUxldmVsID09IHNlY3VyaXR5TGV2ZWwKICAgICAgICAmJiAhc3RyY21wKGFjY2Vzc0xpc3QtPmdyb3VwTmFtZSArIDEsIGdyb3VwTmFtZSkKICAgICAgICAmJiAhc3RyY21wKGFjY2Vzc0xpc3QtPmNvbnRleHRQcmVmaXggKyAxLCBjb250ZXh0UHJlZml4KSkgewogICAgICAgIHZwID0gYWNjZXNzTGlzdDsKICAgICAgICBhY2Nlc3NMaXN0ID0gYWNjZXNzTGlzdC0+bmV4dDsKICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICh2cCA9IGFjY2Vzc0xpc3Q7IHZwOyB2cCA9IHZwLT5uZXh0KSB7CiAgICAgICAgICAgIGlmICh2cC0+c2VjdXJpdHlNb2RlbCA9PSBzZWN1cml0eU1vZGVsCiAgICAgICAgICAgICAgICAmJiB2cC0+c2VjdXJpdHlMZXZlbCA9PSBzZWN1cml0eUxldmVsCiAgICAgICAgICAgICAgICAmJiAhc3RyY21wKHZwLT5ncm91cE5hbWUgKyAxLCBncm91cE5hbWUpCiAgICAgICAgICAgICAgICAmJiAhc3RyY21wKHZwLT5jb250ZXh0UHJlZml4ICsgMSwgY29udGV4dFByZWZpeCkpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgbGFzdHZwID0gdnA7CiAgICAgICAgfQogICAgICAgIGlmICghdnAgfHwgIWxhc3R2cCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIGxhc3R2cC0+bmV4dCA9IHZwLT5uZXh0OwogICAgfQogICAgaWYgKHZwLT5yZXNlcnZlZCkKICAgICAgICBmcmVlKHZwLT5yZXNlcnZlZCk7CiAgICBmcmVlKHZwKTsKICAgIHJldHVybjsKfQoKdm9pZAp2YWNtX2Rlc3Ryb3lBbGxBY2Nlc3NFbnRyaWVzKHZvaWQpCnsKICAgIHN0cnVjdCB2YWNtX2FjY2Vzc0VudHJ5ICphcDsKICAgIHdoaWxlICgoYXAgPSBhY2Nlc3NMaXN0KSkgewogICAgICAgIGFjY2Vzc0xpc3QgPSBhcC0+bmV4dDsKICAgICAgICBpZiAoYXAtPnJlc2VydmVkKQogICAgICAgICAgICBmcmVlKGFwLT5yZXNlcnZlZCk7CiAgICAgICAgZnJlZShhcCk7CiAgICB9Cn0KCmludApzdG9yZV92YWNtKGludCBtYWpvcklELCBpbnQgbWlub3JJRCwgdm9pZCAqc2VydmVyYXJnLCB2b2lkICpjbGllbnRhcmcpCnsKICAgIC8qCiAgICAgKiBmaWd1cmUgb3V0IG91ciBhcHBsaWNhdGlvbiBuYW1lIAogICAgICovCiAgICBjaGFyICAgICAgICAgICAqYXBwbmFtZSA9IChjaGFyICopIGNsaWVudGFyZzsKICAgIGlmIChhcHBuYW1lID09IE5VTEwpIHsKICAgICAgICBhcHBuYW1lID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkJTkVUU05NUF9EU19MSUJfQVBQVFlQRSk7CiAgICB9CgogICAgLyoKICAgICAqIHNhdmUgdGhlIFZBQ00gTUlCIAogICAgICovCiAgICB2YWNtX3NhdmUoInZhY20iLCBhcHBuYW1lKTsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCi8qCiAqIHJldHVybnMgMSBpZiB2YWNtIGhhcyAqYW55KiAobm9uLWJ1aWx0LWluKSBjb25maWd1cmF0aW9uIGVudHJpZXMsCiAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgdGhlcmUgaXMgZW5vdWdoIHRvIG1ha2UgYSBkZWNpc2lvbiwKICogZWxzZSByZXR1cm4gMCAKICovCmludAp2YWNtX2lzX2NvbmZpZ3VyZWQodm9pZCkKewogICAgaWYgKGFjY2Vzc0xpc3QgPT0gTlVMTCAmJiBncm91cExpc3QgPT0gTlVMTCkgewogICAgICAgIHJldHVybiAwOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCi8qCiAqIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5CiAqLwpzdHJ1Y3QgdmFjbV92aWV3RW50cnkgKgp2YWNtX2dldFZpZXdFbnRyeShjb25zdCBjaGFyICp2aWV3TmFtZSwKICAgICAgICAgICAgICAgICAgb2lkICogdmlld1N1YnRyZWUsIHNpemVfdCB2aWV3U3VidHJlZUxlbiwgaW50IG1vZGUpCnsKICAgIHJldHVybiBuZXRzbm1wX3ZpZXdfZ2V0KCB2aWV3TGlzdCwgdmlld05hbWUsIHZpZXdTdWJ0cmVlLCB2aWV3U3VidHJlZUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlKTsKfQoKaW50CnZhY21fY2hlY2tTdWJ0cmVlKGNvbnN0IGNoYXIgKnZpZXdOYW1lLAogICAgICAgICAgICAgICAgICBvaWQgKiB2aWV3U3VidHJlZSwgc2l6ZV90IHZpZXdTdWJ0cmVlTGVuKQp7CiAgICByZXR1cm4gbmV0c25tcF92aWV3X3N1YnRyZWVfY2hlY2soIHZpZXdMaXN0LCB2aWV3TmFtZSwgdmlld1N1YnRyZWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdTdWJ0cmVlTGVuKTsKfQoKc3RydWN0IHZhY21fdmlld0VudHJ5ICoKdmFjbV9jcmVhdGVWaWV3RW50cnkoY29uc3QgY2hhciAqdmlld05hbWUsCiAgICAgICAgICAgICAgICAgICAgIG9pZCAqIHZpZXdTdWJ0cmVlLCBzaXplX3Qgdmlld1N1YnRyZWVMZW4pCnsKICAgIHJldHVybiBuZXRzbm1wX3ZpZXdfY3JlYXRlKCAmdmlld0xpc3QsIHZpZXdOYW1lLCB2aWV3U3VidHJlZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3U3VidHJlZUxlbik7Cn0KCnZvaWQKdmFjbV9kZXN0cm95Vmlld0VudHJ5KGNvbnN0IGNoYXIgKnZpZXdOYW1lLAogICAgICAgICAgICAgICAgICAgICAgb2lkICogdmlld1N1YnRyZWUsIHNpemVfdCB2aWV3U3VidHJlZUxlbikKewogICAgbmV0c25tcF92aWV3X2Rlc3Ryb3koICZ2aWV3TGlzdCwgdmlld05hbWUsIHZpZXdTdWJ0cmVlLCB2aWV3U3VidHJlZUxlbik7Cn0KCnZvaWQKdmFjbV9kZXN0cm95QWxsVmlld0VudHJpZXModm9pZCkKewogICAgbmV0c25tcF92aWV3X2NsZWFyKCAmdmlld0xpc3QgKTsKfQoK