LyoKICogc25tcGQuYwogKi8KLyoqIEBkZWZncm91cCBhZ2VudCBUaGUgTmV0LVNOTVAgYWdlbnQKICogVGhlIHNubXAgYWdlbnQgcmVzcG9uZHMgdG8gU05NUCBxdWVyaWVzIGZyb20gbWFuYWdlbWVudCBzdGF0aW9ucwogKi8KLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cy4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qCiAqIENvcHlyaWdodCAxOTg4LCAxOTg5IGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CiAqIAogKiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqIAogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCiAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKICogYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAogKiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIENNVSBub3QgYmUKICogdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCiAqIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIAogKiAKICogQ01VIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKICogQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCiAqIENNVSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKICogQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAogKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCiAqIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKICogU09GVFdBUkUuCiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwovKgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgoKI2lmIEhBVkVfSU9fSAojaW5jbHVkZSA8aW8uaD4KI2VuZGlmCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2lmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2lmIEhBVkVfVU5JU1REX0gKI2luY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX0FSUEFfSU5FVF9ICiNpbmNsdWRlIDxhcnBhL2luZXQuaD4KI2VuZGlmCiNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKIyBpZmRlZiBXSU4zMgojICBpbmNsdWRlIDxzeXMvdGltZWIuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZW5kaWYKIyBpbmNsdWRlIDx0aW1lLmg+CiNlbHNlCiMgaWYgSEFWRV9TWVNfVElNRV9ICiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZWxzZQojICBpbmNsdWRlIDx0aW1lLmg+CiMgZW5kaWYKI2VuZGlmCiNpZiBIQVZFX1NZU19TRUxFQ1RfSAojaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NPQ0tFVF9ICiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbGlmIEhBVkVfV0lOU09DS19ICiNpbmNsdWRlIDx3aW5zb2NrLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRfSUZfSAojaW5jbHVkZSA8bmV0L2lmLmg+CiNlbmRpZgojaWYgSEFWRV9JTkVUX01JQjJfSAojaW5jbHVkZSA8aW5ldC9taWIyLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfSU9DVExfSAojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfRklMRV9ICiNpbmNsdWRlIDxzeXMvZmlsZS5oPgojZW5kaWYKI2lmZGVmIEhBVkVfRkNOVExfSAojaW5jbHVkZSA8ZmNudGwuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19XQUlUX0gKI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiNlbmRpZgojaW5jbHVkZSA8c2lnbmFsLmg+CiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpZiBIQVZFX1BST0NFU1NfSCAgICAgICAgICAgICAgLyogV2luMzItZ2V0cGlkICovCiNpbmNsdWRlIDxwcm9jZXNzLmg+CiNlbmRpZgojaWYgSEFWRV9MSU1JVFNfSAojaW5jbHVkZSA8bGltaXRzLmg+CiNlbmRpZgojaWYgSEFWRV9QV0RfSAojaW5jbHVkZSA8cHdkLmg+CiNlbmRpZgojaWYgSEFWRV9HUlBfSAojaW5jbHVkZSA8Z3JwLmg+CiNlbmRpZgoKI2lmbmRlZiBQQVRIX01BWAojIGlmZGVmIF9QT1NJWF9QQVRIX01BWAojICBkZWZpbmUgUEFUSF9NQVggX1BPU0lYX1BBVEhfTUFYCiMgZWxzZQojICBkZWZpbmUgUEFUSF9NQVggMjU1CiMgZW5kaWYKI2VuZGlmCgojaWZuZGVmIEZEX1NFVAp0eXBlZGVmIGxvbmcgICAgZmRfbWFzazsKI2RlZmluZSBORkRCSVRTIChzaXplb2YoZmRfbWFzaykgKiBOQkJZKSAgICAgICAgLyogYml0cyBwZXIgbWFzayAqLwojZGVmaW5lIEZEX1NFVChuLCBwKSAgICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gfD0gKDEgPDwgKChuKSAlIE5GREJJVFMpKSkKI2RlZmluZSBGRF9DTFIobiwgcCkgICAgKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdICY9IH4oMSA8PCAoKG4pICUgTkZEQklUUykpKQojZGVmaW5lIEZEX0lTU0VUKG4sIHApICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gJiAoMSA8PCAoKG4pICUgTkZEQklUUykpKQojZGVmaW5lIEZEX1pFUk8ocCkgICAgICBtZW1zZXQoKHApLCAwLCBzaXplb2YoKihwKSkpCiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgoKI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvZmRfZXZlbnRfbWFuYWdlci5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9sYXJnZV9mZF9zZXQuaD4KCiNpbmNsdWRlICJtMm0uaCIKI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L21pYl9tb2R1bGVfY29uZmlnLmg+CgojaW5jbHVkZSAic25tcGQuaCIKI2luY2x1ZGUgIm1pYmdyb3VwL3N0cnVjdC5oIgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbWliX21vZHVsZXMuaD4KCiNpbmNsdWRlICJtaWJncm91cC91dGlsX2Z1bmNzLmgiCgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYWdlbnRfdHJhcC5oPgoKI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L3RhYmxlLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC90YWJsZV9pdGVyYXRvci5oPgojaW5jbHVkZSAibWliX21vZHVsZV9pbmNsdWRlcy5oIgoKLyoKICogSW5jbHVkZSB3aW5zZXJ2aWNlLmggdG8gc3VwcG9ydCBXaW5kb3dzIFNlcnZpY2UKICovCiNpZmRlZiBXSU4zMgojaW5jbHVkZSA8d2luZG93cy5oPgojaW5jbHVkZSA8dGNoYXIuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvd2luc2VydmljZS5oPgoKI2RlZmluZSBXSU4zMlNFUlZJQ0UKCiNlbmRpZgoKLyoKICogR2xvYmFscy4KICovCiNpZmRlZiBORVRTTk1QX1VTRV9MSUJXUkFQCiNpbmNsdWRlIDx0Y3BkLmg+CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9VU0VfTElCV1JBUCAqLwoKI2RlZmluZSBUSU1FVElDSyAgICAgICAgIDUwMDAwMEwKCmludCAgICAgICAgICAgICBzbm1wX2R1bXBfcGFja2V0OwpzdGF0aWMgaW50ICAgICAgcmVjb25maWcgPSAwOwppbnQgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfREFFTU9OOwoKI2lmZGVmIFdJTjMyU0VSVklDRQovKgogKiBTTk1QIEFnZW50IFN0YXR1cyAKICovCiNkZWZpbmUgQUdFTlRfUlVOTklORyAxCiNkZWZpbmUgQUdFTlRfU1RPUFBFRCAwCmludCAgICAgICAgICAgICBhZ2VudF9zdGF0dXMgPSBBR0VOVF9TVE9QUEVEOwovKiBhcHBfbmFtZV9sb25nIHVzZWQgZm9yIEV2ZW50IExvZyAoc3lzbG9nKSwgU0NNLCByZWdpc3RyeSBldGMgKi8KTFBDVFNUUiAgICAgICAgIGFwcF9uYW1lX2xvbmcgPSBfVCgiTmV0LVNOTVAgQWdlbnQiKTsgICAgIC8qIEFwcGxpY2F0aW9uIE5hbWUgKi8KI2VuZGlmCgpjb25zdCBjaGFyICAgICAqYXBwX25hbWUgPSAic25tcGQiOwoKZXh0ZXJuIGludCAgICAgIG5ldHNubXBfcnVubmluZzsKZXh0ZXJuIGNoYXIgICAqKmFyZ3ZyZXN0YXJ0cDsKZXh0ZXJuIGNoYXIgICAgKmFyZ3ZyZXN0YXJ0OwpleHRlcm4gY2hhciAgICAqYXJndnJlc3RhcnRuYW1lOwoKI2lmZGVmIFVTSU5HX1NNVVhfTU9EVUxFCiNpbmNsdWRlIDxtaWJncm91cC9zbXV4L3NtdXguaD4KI2VuZGlmIC8qIFVTSU5HX1NNVVhfTU9EVUxFICovCgovKgogKiBQcm90b3R5cGVzLgogKi8KaW50ICAgICAgICAgICAgIHNubXBfcmVhZF9wYWNrZXQoaW50KTsKaW50ICAgICAgICAgICAgIHNubXBfaW5wdXQoaW50LCBuZXRzbm1wX3Nlc3Npb24gKiwgaW50LCBuZXRzbm1wX3BkdSAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopOwpzdGF0aWMgdm9pZCAgICAgdXNhZ2UoY2hhciAqKTsKc3RhdGljIHZvaWQgICAgIFNubXBUcmFwTm9kZURvd24odm9pZCk7CnN0YXRpYyBpbnQgICAgICByZWNlaXZlKHZvaWQpOwojaWZkZWYgV0lOMzJTRVJWSUNFCnZvaWQgICAgICAgICAgICBTdG9wU25tcEFnZW50KHZvaWQpOwppbnQgICAgICAgICAgICAgU25tcERhZW1vbk1haW4oaW50IGFyZ2MsIFRDSEFSICogYXJndltdKTsKaW50IF9fY2RlY2wgICAgIF90bWFpbihpbnQgYXJnYywgVENIQVIgKiBhcmd2W10pOwojZWxzZQppbnQgICAgICAgICAgICAgbWFpbihpbnQsIGNoYXIgKiopOwojZW5kaWYKCi8qCiAqIFRoZXNlIGRlZmluaXRpb25zIGhhbmRsZSA0LjIgc3lzdGVtcyB3aXRob3V0IGFkZGl0aW9uYWwgc3lzbG9nIGZhY2lsaXRpZXMuCiAqLwojaWZuZGVmIExPR19DT05TCiNkZWZpbmUgTE9HX0NPTlMJMCAgICAgICAvKiBEb24ndCBib3RoZXIgaWYgbm90IGRlZmluZWQuLi4gKi8KI2VuZGlmCiNpZm5kZWYgTE9HX1BJRAojZGVmaW5lIExPR19QSUQJCTAgICAgICAgLyogRG9uJ3QgYm90aGVyIGlmIG5vdCBkZWZpbmVkLi4uICovCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDAKI2RlZmluZSBMT0dfTE9DQUwwCTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMMQojZGVmaW5lIExPR19MT0NBTDEJMAojZW5kaWYKI2lmbmRlZiBMT0dfTE9DQUwyCiNkZWZpbmUgTE9HX0xPQ0FMMgkwCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDMKI2RlZmluZSBMT0dfTE9DQUwzCTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMNAojZGVmaW5lIExPR19MT0NBTDQJMAojZW5kaWYKI2lmbmRlZiBMT0dfTE9DQUw1CiNkZWZpbmUgTE9HX0xPQ0FMNQkwCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDYKI2RlZmluZSBMT0dfTE9DQUw2CTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMNwojZGVmaW5lIExPR19MT0NBTDcJMAojZW5kaWYKI2lmbmRlZiBMT0dfREFFTU9OCiNkZWZpbmUgTE9HX0RBRU1PTgkwCiNlbmRpZgoKCnN0YXRpYyB2b2lkCnVzYWdlKGNoYXIgKnByb2cpCnsKI2lmZGVmIFdJTjMyU0VSVklDRQogICAgcHJpbnRmKCJcblVzYWdlOiAgJXMgWy1yZWdpc3Rlcl0gWy1xdWlldF0gW09QVElPTlNdIFtMSVNURU5JTkcgQUREUkVTU0VTXSIsCiAgICAgICAgICAgcHJvZyk7CiAgICBwcmludGYoIlxuICAgICAgICAlcyBbLXVucmVnaXN0ZXJdIFstcXVpZXRdIiwgcHJvZyk7CiNlbHNlCiAgICBwcmludGYoIlxuVXNhZ2U6ICAlcyBbT1BUSU9OU10gW0xJU1RFTklORyBBRERSRVNTRVNdIiwgcHJvZyk7CiNlbmRpZgogICAgcHJpbnRmKCJcbiIpOwogICAgcHJpbnRmKCJcblx0VmVyc2lvbjogICVzXG4iLCBuZXRzbm1wX2dldF92ZXJzaW9uKCkpOwogICAgcHJpbnRmKCJcdFdlYjogICAgICBodHRwOi8vd3d3Lm5ldC1zbm1wLm9yZy9cbiIpOwogICAgcHJpbnRmKCJcdEVtYWlsOiAgICBuZXQtc25tcC1jb2RlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0XG4iKTsKICAgIHByaW50ZigiXG4gIC1hXHRcdFx0bG9nIGFkZHJlc3Nlc1xuIik7CiAgICBwcmludGYoIiAgLUFcdFx0XHRhcHBlbmQgdG8gdGhlIGxvZ2ZpbGUgcmF0aGVyIHRoYW4gdHJ1bmNhdGluZyBpdFxuIik7CiAgICBwcmludGYoIiAgLWMgRklMRVssLi4uXVx0XHRyZWFkIEZJTEUocykgYXMgY29uZmlndXJhdGlvbiBmaWxlKHMpXG4iKTsKICAgIHByaW50ZigiICAtQ1x0XHRcdGRvIG5vdCByZWFkIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlsZXNcbiIpOwogICAgcHJpbnRmKCIgIC1kXHRcdFx0ZHVtcCBzZW50IGFuZCByZWNlaXZlZCBTTk1QIHBhY2tldHNcbiIpOwogICAgcHJpbnRmKCIgIC1EW1RPS0VOWywuLi5dXVx0dHVybiBvbiBkZWJ1Z2dpbmcgb3V0cHV0IGZvciB0aGUgZ2l2ZW4gVE9LRU4ocylcbiIKCSAgICJcdFx0XHQgICh0cnkgQUxMIGZvciBleHRyZW1lbHkgdmVyYm9zZSBvdXRwdXQpXG4iCgkgICAiXHRcdFx0ICBEb24ndCBwdXQgc3BhY2UocykgYmV0d2VlbiAtRCBhbmQgVE9LRU4ocykuXG4iKTsKICAgIHByaW50ZigiICAtZlx0XHRcdGRvIG5vdCBmb3JrIGZyb20gdGhlIHNoZWxsXG4iKTsKI2lmIEhBVkVfVU5JU1REX0gKICAgIHByaW50ZigiICAtZyBHSURcdFx0Y2hhbmdlIHRvIHRoaXMgbnVtZXJpYyBnaWQgYWZ0ZXIgb3BlbmluZ1xuIgoJICAgIlx0XHRcdCAgdHJhbnNwb3J0IGVuZHBvaW50c1xuIik7CiNlbmRpZgogICAgcHJpbnRmKCIgIC1oLCAtLWhlbHBcdFx0ZGlzcGxheSB0aGlzIHVzYWdlIG1lc3NhZ2VcbiIpOwogICAgcHJpbnRmKCIgIC1IXHRcdFx0ZGlzcGxheSBjb25maWd1cmF0aW9uIGZpbGUgZGlyZWN0aXZlcyB1bmRlcnN0b29kXG4iKTsKICAgIHByaW50ZigiICAtSSBbLV1JTklUTElTVFx0bGlzdCBvZiBtaWIgbW9kdWxlcyB0byBpbml0aWFsaXplIChvciBub3QpXG4iKTsKICAgIHByaW50ZigiXHRcdFx0ICAocnVuIHNubXBkIHdpdGggLURtaWJfaW5pdCBmb3IgYSBsaXN0KVxuIik7CiAgICBwcmludGYoIiAgLUwgPExPR09QVFM+XHRcdHRvZ2dsZSBvcHRpb25zIGNvbnRyb2xsaW5nIHdoZXJlIHRvIGxvZyB0b1xuIik7CiAgICBzbm1wX2xvZ19vcHRpb25zX3VzYWdlKCJcdCIsIHN0ZG91dCk7CiAgICBwcmludGYoIiAgLW0gTUlCTElTVFx0XHR1c2UgTUlCTElTVCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IE1JQiBsaXN0XG4iKTsKICAgIHByaW50ZigiICAtTSBESVJMSVNUXHRcdHVzZSBESVJMSVNUIGFzIHRoZSBsaXN0IG9mIGxvY2F0aW9uc1xuXHRcdFx0ICB0byBsb29rIGZvciBNSUJzXG4iKTsKICAgIHByaW50ZigiICAtcCBGSUxFXHRcdHN0b3JlIHByb2Nlc3MgaWQgaW4gRklMRVxuIik7CiAgICBwcmludGYoIiAgLXFcdFx0XHRwcmludCBpbmZvcm1hdGlvbiBpbiBhIG1vcmUgcGFyc2FibGUgZm9ybWF0XG4iKTsKICAgIHByaW50ZigiICAtclx0XHRcdGRvIG5vdCBleGl0IGlmIGZpbGVzIG9ubHkgYWNjZXNzaWJsZSB0byByb290XG4iCgkgICAiXHRcdFx0ICBjYW5ub3QgYmUgb3BlbmVkXG4iKTsKI2lmZGVmIFdJTjMyU0VSVklDRQogICAgcHJpbnRmKCIgIC1yZWdpc3Rlclx0XHRyZWdpc3RlciBhcyBhIFdpbmRvd3Mgc2VydmljZVxuIik7CiAgICBwcmludGYoIiAgXHRcdFx0ICAoZm9sbG93ZWQgYnkgLXF1aWV0IHRvIHByZXZlbnQgbWVzc2FnZSBwb3B1cHMpXG4iKTsKICAgIHByaW50ZigiICBcdFx0XHQgIChmb2xsb3dlZCBieSB0aGUgc3RhcnR1cCBwYXJhbWV0ZXIgbGlzdClcbiIpOwogICAgcHJpbnRmKCIgIFx0XHRcdCAgTm90ZSB0aGF0IHNvbWUgcGFyYW1ldGVycyBhcmUgbm90IHJlbGV2YW50IHdoZW4gcnVubmluZyBhcyBhIHNlcnZpY2VcbiIpOwojZW5kaWYKI2lmIEhBVkVfVU5JU1REX0gKICAgIHByaW50ZigiICAtdSBVSURcdFx0Y2hhbmdlIHRvIHRoaXMgdWlkIChudW1lcmljIG9yIHRleHR1YWwpIGFmdGVyXG4iCgkgICAiXHRcdFx0ICBvcGVuaW5nIHRyYW5zcG9ydCBlbmRwb2ludHNcbiIpOwojZW5kaWYKI2lmZGVmIFdJTjMyU0VSVklDRQogICAgcHJpbnRmKCIgIC11bnJlZ2lzdGVyXHRcdHVucmVnaXN0ZXIgYXMgYSBXaW5kb3dzIHNlcnZpY2VcbiIpOwogICAgcHJpbnRmKCIgIFx0XHRcdCAgKGZvbGxvd2VkIC1xdWlldCB0byBwcmV2ZW50IG1lc3NhZ2UgcG9wdXBzKVxuIik7CiNlbmRpZgogICAgcHJpbnRmKCIgIC12LCAtLXZlcnNpb25cdFx0ZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uXG4iKTsKICAgIHByaW50ZigiICAtVlx0XHRcdHZlcmJvc2UgZGlzcGxheVxuIik7CiNpZiBkZWZpbmVkKFVTSU5HX0FHRU5UWF9TVUJBR0VOVF9NT0RVTEUpfHwgZGVmaW5lZChVU0lOR19BR0VOVFhfTUFTVEVSX01PRFVMRSkKICAgIHByaW50ZigiICAteCBBRERSRVNTXHRcdHVzZSBBRERSRVNTIGFzIEFnZW50WCBhZGRyZXNzXG4iKTsKI2VuZGlmCiNpZmRlZiBVU0lOR19BR0VOVFhfU1VCQUdFTlRfTU9EVUxFCiAgICBwcmludGYoIiAgLVhcdFx0XHRydW4gYXMgYW4gQWdlbnRYIHN1YmFnZW50IHJhdGhlciB0aGFuIGFzIGFuXG4iCgkgICAiXHRcdFx0ICBTTk1QIG1hc3RlciBhZ2VudFxuIik7CiNlbmRpZgoKICAgIHByaW50ZigiXG5EZXByZWNhdGVkIG9wdGlvbnM6XG4iKTsKICAgIHByaW50ZigiICAtbCBGSUxFXHRcdHVzZSAtTGYgPEZJTEU+IGluc3RlYWRcbiIpOwogICAgcHJpbnRmKCIgIC1QXHRcdFx0dXNlIC1wIGluc3RlYWRcbiIpOwogICAgcHJpbnRmKCIgIC1zXHRcdFx0dXNlIC1Mc2QgaW5zdGVhZFxuIik7CiAgICBwcmludGYoIiAgLVMgZHxpfDAtN1x0XHR1c2UgLUxzIDxmYWNpbGl0eT4gaW5zdGVhZFxuIik7CgogICAgcHJpbnRmKCJcbiIpOwogICAgZXhpdCgxKTsKfQoKc3RhdGljIHZvaWQKdmVyc2lvbih2b2lkKQp7CiAgICBwcmludGYoIlxuTkVULVNOTVAgdmVyc2lvbjogICVzXG4iLCBuZXRzbm1wX2dldF92ZXJzaW9uKCkpOwogICAgcHJpbnRmKCJXZWI6ICAgICAgICAgICAgICAgaHR0cDovL3d3dy5uZXQtc25tcC5vcmcvXG4iKTsKICAgIHByaW50ZigiRW1haWw6ICAgICAgICAgICAgIG5ldC1zbm1wLWNvZGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXRcblxuIik7CiAgICBleGl0KDApOwp9CgpSRVRTSUdUWVBFClNubXBkU2h1dERvd24oaW50IGEpCnsKI2lmZGVmIFdJTjMyU0VSVklDRQogICAgZXh0ZXJuIG5ldHNubXBfc2Vzc2lvbiAqbWFpbl9zZXNzaW9uOwojZW5kaWYKICAgIG5ldHNubXBfcnVubmluZyA9IDA7CiNpZmRlZiBXSU4zMlNFUlZJQ0UKICAgIC8qCiAgICAgKiBJbiBjYXNlIG9mIHdpbmRvd3MsIHNlbGVjdCgpIGluIHJlY2VpdmUoKSBmdW5jdGlvbiB3aWxsIG5vdCByZXR1cm4gCiAgICAgKiBvbiBzaWduYWwuIFRoYXRzIHdoeSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgY2FsbGVkLCB3aGljaCBjbG9zZXMgdGhlIAogICAgICogc29ja2V0IGRlc2NyaXB0b3JzIGFuZCBjYXVzZXMgdGhlIHNlbGVjdCgpIHRvIHJldHVybgogICAgICovCiAgICBzbm1wX2Nsb3NlKG1haW5fc2Vzc2lvbik7CiNlbmRpZgp9CgojaWZkZWYgU0lHSFVQClJFVFNJR1RZUEUKU25tcGRSZWNvbmZpZyhpbnQgYSkKewogICAgcmVjb25maWcgPSAxOwogICAgc2lnbmFsKFNJR0hVUCwgU25tcGRSZWNvbmZpZyk7Cn0KI2VuZGlmCgojaWZkZWYgU0lHVVNSMQpleHRlcm4gdm9pZCAgICAgZHVtcF9yZWdpc3RyeSh2b2lkKTsKUkVUU0lHVFlQRQpTbm1wZER1bXAoaW50IGEpCnsKICAgIGR1bXBfcmVnaXN0cnkoKTsKICAgIHNpZ25hbChTSUdVU1IxLCBTbm1wZER1bXApOwp9CiNlbmRpZgoKUkVUU0lHVFlQRQpTbm1wZENhdGNoUmFuZG9tU2lnbmFsKGludCBhKQp7CiAgICAvKiBEaXNhYmxlIGFsbCBsb2dzIGFuZCBsb2cgdGhlIGVycm9yIHZpYSBzeXNsb2cgKi8KICAgIHNubXBfZGlzYWJsZV9sb2coKTsKICAgIHNubXBfZW5hYmxlX3N5c2xvZygpOwogICAgc25tcF9sb2coTE9HX0VSUiwgIkV4aXRpbmcgb24gc2lnbmFsICVkXG4iLCBhKTsKICAgIHNubXBfZGlzYWJsZV9zeXNsb2coKTsKICAgIGV4aXQoMSk7Cn0KCnN0YXRpYyB2b2lkClNubXBUcmFwTm9kZURvd24odm9pZCkKewogICAgc2VuZF9lYXN5X3RyYXAoU05NUF9UUkFQX0VOVEVSUFJJU0VTUEVDSUZJQywgMik7CiAgICAvKgogICAgICogWFhYICAyIC0gTm9kZSBEb3duICNkZWZpbmUgaXQgYXMgTk9ERV9ET1dOX1RSQVAgCiAgICAgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotby0qKioqKioKICogbWFpbiAtIE5vbiBXaW5kb3dzCiAqIFNubXBEYWVtb25NYWluIC0gV2luZG93cyB0byBzdXBwb3J0IHdpbmRvd3Mgc2VydmljZQogKgogKiBQYXJhbWV0ZXJzOgogKgkgYXJnYwogKgkqYXJndltdCiAqICAgICAgCiAqIFJldHVybnM6CiAqCTAJQWx3YXlzIHN1Y2NlZWRzLiAgKD8pCiAqCiAqCiAqIFNldHVwIGFuZCBzdGFydCB0aGUgYWdlbnQgZGFlbW9uLgogKgogKiBBbHNvIHN1Y2Nlc3NmdWxseSBFWElUcyB3aXRoIHplcm8gZm9yIHNvbWUgb3B0aW9ucy4KICovCmludAojaWZkZWYgV0lOMzJTRVJWSUNFClNubXBEYWVtb25NYWluKGludCBhcmdjLCBUQ0hBUiAqIGFyZ3ZbXSkKI2Vsc2UKbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQojZW5kaWYKewogICAgY2hhciAgICAgICAgICAgIG9wdGlvbnNbMTI4XSA9ICJhQWM6Q2REOjpmaEhJOmw6TDptOk06bjpwOlA6cXJzUzpVdlYtOlk6IjsKICAgIGludCAgICAgICAgICAgICBhcmcsIGksIHJldDsKICAgIGludCAgICAgICAgICAgICBkb250X2ZvcmsgPSAwLCBkb19oZWxwID0gMDsKICAgIGludCAgICAgICAgICAgICBsb2dfc2V0ID0gMDsKICAgIGludCAgICAgICAgICAgICB1aWQgPSAwLCBnaWQgPSAwOwogICAgaW50ICAgICAgICAgICAgIGFnZW50X21vZGUgPSAtMTsKICAgIGNoYXIgICAgICAgICAgICpjcHRyLCAqKmFyZ3ZwdHI7CiAgICBjaGFyICAgICAgICAgICAqcGlkX2ZpbGUgPSBOVUxMOwogICAgY2hhciAgICAgICAgICAgIG9wdGlvbl9jb21wYXRhYmlsaXR5W10gPSAiLUxlIjsKI2lmIEhBVkVfR0VUUElECiAgICBpbnQgZmQ7CiAgICBGSUxFICAgICAgICAgICAqUElEOwojZW5kaWYKI2lmIEhBVkVfR0VUUFdOQU0gJiYgSEFWRV9QV0RfSAogICAgc3RydWN0IHBhc3N3ZCAgKmluZm87CiNlbmRpZgojaWYgSEFWRV9VTklTVERfSAogICAgY29uc3QgY2hhciAgICAgKnBlcnNpc3RlbnRfZGlyOwojZW5kaWYKCiNpZm5kZWYgV0lOMzIKICAgIC8qCiAgICAgKiBjbG9zZSBhbGwgbm9uLXN0YW5kYXJkIGZpbGUgZGVzY3JpcHRvcnMgd2UgbWF5IGhhdmUKICAgICAqIGluaGVyaXRlZCBmcm9tIHRoZSBzaGVsbC4KICAgICAqLwogICAgZm9yIChpID0gZ2V0ZHRhYmxlc2l6ZSgpIC0gMTsgaSA+IDI7IC0taSkgewogICAgICAgICh2b2lkKSBjbG9zZShpKTsKICAgIH0KI2VuZGlmIC8qICNXSU4zMiAqLwogICAgCiAgICAvKgogICAgICogcmVnaXN0ZXIgc2lnbmFscyBBU0FQIHRvIHByZXZlbnQgZGVmYXVsdCBhY3Rpb24gKHVzdWFsbHkgY29yZSkKICAgICAqIGZvciBzaWduYWxzIGR1cmluZyBzdGFydHVwLi4uCiAgICAgKi8KI2lmZGVmIFNJR1RFUk0KICAgIERFQlVHTVNHVEwoKCJzaWduYWwiLCAicmVnaXN0ZXJpbmcgU0lHVEVSTSBzaWduYWwgaGFuZGxlclxuIikpOwogICAgc2lnbmFsKFNJR1RFUk0sIFNubXBkU2h1dERvd24pOwojZW5kaWYKI2lmZGVmIFNJR0lOVAogICAgREVCVUdNU0dUTCgoInNpZ25hbCIsICJyZWdpc3RlcmluZyBTSUdJTlQgc2lnbmFsIGhhbmRsZXJcbiIpKTsKICAgIHNpZ25hbChTSUdJTlQsIFNubXBkU2h1dERvd24pOwojZW5kaWYKI2lmZGVmIFNJR0hVUAogICAgc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7ICAgLyogZG8gbm90IHRlcm1pbmF0ZSBvbiBlYXJseSBTSUdIVVAgKi8KI2VuZGlmCiNpZmRlZiBTSUdVU1IxCiAgICBERUJVR01TR1RMKCgic2lnbmFsIiwgInJlZ2lzdGVyaW5nIFNJR1VTUjEgc2lnbmFsIGhhbmRsZXJcbiIpKTsKICAgIHNpZ25hbChTSUdVU1IxLCBTbm1wZER1bXApOwojZW5kaWYKI2lmZGVmIFNJR1BJUEUKICAgIERFQlVHTVNHVEwoKCJzaWduYWwiLCAicmVnaXN0ZXJpbmcgU0lHUElQRSBzaWduYWwgaGFuZGxlclxuIikpOwogICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOyAgIC8qICdJbmxpbmUnIGZhaWx1cmUgb2Ygd2F5d2FyZCByZWFkZXJzICovCiNlbmRpZgojaWZkZWYgU0lHWEZTWgogICAgc2lnbmFsKFNJR1hGU1osIFNubXBkQ2F0Y2hSYW5kb21TaWduYWwpOwojZW5kaWYKCiNpZmRlZiBORVRTTk1QX05PX1JPT1RfQUNDRVNTCiAgICAvKgogICAgICogRGVmYXVsdCB0byBuby4gIAogICAgICovCiAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkgICBORVRTTk1QX0RTX0FHRU5UX05PX1JPT1RfQUNDRVNTLCAxKTsKI2VuZGlmCiAgICAvKgogICAgICogRGVmYXVsdCB0byBOT1QgcnVubmluZyBhbiBBZ2VudFggbWFzdGVyLiAgCiAgICAgKi8KICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCSAgIE5FVFNOTVBfRFNfQUdFTlRfQUdFTlRYX01BU1RFUiwgMCk7CiAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0FHRU5UX0FHRU5UWF9USU1FT1VULCAtMSk7CiAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0FHRU5UX0FHRU5UWF9SRVRSSUVTLCAtMSk7CgogICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsCiAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19BR0VOVF9DQUNIRV9USU1FT1VULCA1KTsKICAgIC8qCiAgICAgKiBBZGQgc29tZSBvcHRpb25zIGlmIHRoZXkgYXJlIGF2YWlsYWJsZS4gIAogICAgICovCiNpZiBIQVZFX1VOSVNURF9ICiAgICBzdHJjYXQob3B0aW9ucywgImc6dToiKTsKI2VuZGlmCiNpZiBkZWZpbmVkKFVTSU5HX0FHRU5UWF9TVUJBR0VOVF9NT0RVTEUpfHwgZGVmaW5lZChVU0lOR19BR0VOVFhfTUFTVEVSX01PRFVMRSkKICAgIHN0cmNhdChvcHRpb25zLCAieDoiKTsKI2VuZGlmCiNpZmRlZiBVU0lOR19BR0VOVFhfU1VCQUdFTlRfTU9EVUxFCiAgICBzdHJjYXQob3B0aW9ucywgIlgiKTsKI2VuZGlmCgogICAgLyoKICAgICAqIFRoaXMgaXMgaW5jcmVkaWJseSB1Z2x5LCBidXQgaXQncyBwcm9iYWJseSB0aGUgc2ltcGxlc3Qgd2F5CiAgICAgKiAgdG8gaGFuZGxlIHRoZSBvbGQgJy1MJyBvcHRpb24gYXMgd2VsbCBhcyB0aGUgbmV3ICctTHgnIHN0eWxlCiAgICAgKi8KICAgIGZvciAoaT0wOyBpPGFyZ2M7IGkrKykgewogICAgICAgIGlmICghc3RyY21wKGFyZ3ZbaV0sICItTCIpKQogICAgICAgICAgICBhcmd2W2ldID0gb3B0aW9uX2NvbXBhdGFiaWxpdHk7ICAgICAgICAgICAgCiAgICB9CgojaWZkZWYgV0lOMzIKICAgIHNubXBfbG9nX3N5c2xvZ25hbWUoYXBwX25hbWVfbG9uZyk7CiNlbHNlCiAgICBzbm1wX2xvZ19zeXNsb2duYW1lKGFwcF9uYW1lKTsKI2VuZGlmCiAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0FQUFRZUEUsIGFwcF9uYW1lKTsKCiAgICAvKgogICAgICogTm93IHByb2Nlc3Mgb3B0aW9ucyBub3JtYWxseS4gIAogICAgICovCiAgICB3aGlsZSAoKGFyZyA9IGdldG9wdChhcmdjLCBhcmd2LCBvcHRpb25zKSkgIT0gRU9GKSB7CiAgICAgICAgc3dpdGNoIChhcmcpIHsKICAgICAgICBjYXNlICctJzoKICAgICAgICAgICAgaWYgKHN0cmNhc2VjbXAob3B0YXJnLCAiaGVscCIpID09IDApIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJjYXNlY21wKG9wdGFyZywgInZlcnNpb24iKSA9PSAwKSB7CiAgICAgICAgICAgICAgICB2ZXJzaW9uKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGhhbmRsZV9sb25nX29wdChvcHRhcmcpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgIGxvZ19hZGRyZXNzZXMrKzsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ0EnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9BUFBFTkRfTE9HRklMRVMsIDEpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnYyc6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkgICAgICBORVRTTk1QX0RTX0xJQl9PUFRJT05BTENPTkZJRywgb3B0YXJnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdDJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJICAgTkVUU05NUF9EU19MSUJfRE9OVF9SRUFEX0NPTkZJR1MsIDEpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgIHNubXBfc2V0X2R1bXBfcGFja2V0KCsrc25tcF9kdW1wX3BhY2tldCk7CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICBORVRTTk1QX0RTX0FHRU5UX1ZFUkJPU0UsIDEpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnRCc6CiAgICAgICAgICAgIGRlYnVnX3JlZ2lzdGVyX3Rva2VucyhvcHRhcmcpOwogICAgICAgICAgICBzbm1wX3NldF9kb19kZWJ1Z2dpbmcoMSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdmJzoKICAgICAgICAgICAgZG9udF9mb3JrID0gMTsKICAgICAgICAgICAgYnJlYWs7CgojaWYgSEFWRV9VTklTVERfSAogICAgICAgIGNhc2UgJ2cnOgogICAgICAgICAgICBpZiAob3B0YXJnICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICplY3A7CiAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgZ2lkOwoKICAgICAgICAgICAgICAgIGdpZCA9IHN0cnRvdWwob3B0YXJnLCAmZWNwLCAxMCk7CiAgICAgICAgICAgICAgICBpZiAoKmVjcCkgewojaWYgSEFWRV9HRVRQV05BTSAmJiBIQVZFX1BXRF9ICiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdyb3VwICAqaW5mbzsKICAgICAgICAgICAgICAgICAgICBpbmZvID0gZ2V0Z3JuYW0ob3B0YXJnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbykgewogICAgICAgICAgICAgICAgICAgICAgICBnaWQgPSBpbmZvLT5ncl9naWQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQmFkIGdyb3VwIGlkOiAlc1xuIiwgb3B0YXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKI2lmIEhBVkVfR0VUUFdOQU0gJiYgSEFWRV9QV0RfSAogICAgICAgICAgICAgICAgICAgIH0KI2VuZGlmCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICBORVRTTk1QX0RTX0FHRU5UX0dST1VQSUQsIGdpZCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKI2VuZGlmCgogICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ0gnOgogICAgICAgICAgICBkb19oZWxwID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ0knOgogICAgICAgICAgICBpZiAob3B0YXJnICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIGFkZF90b19pbml0X2xpc3Qob3B0YXJnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdsJzoKICAgICAgICAgICAgcHJpbnRmKCJXYXJuaW5nOiAtbCBvcHRpb24gaXMgZGVwcmVjYXRlZCwgdXNlIC1MZiA8ZmlsZT4gaW5zdGVhZFxuIik7CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgaWYgKHN0cmxlbihvcHRhcmcpID4gUEFUSF9NQVgpIHsKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogbG9nZmlsZSBwYXRoIHRvbyBsb25nIChsaW1pdCAlZCBjaGFycylcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2WzBdLCBQQVRIX01BWCk7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNubXBfZW5hYmxlX2ZpbGVsb2cob3B0YXJnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9BUFBFTkRfTE9HRklMRVMpKTsKICAgICAgICAgICAgICAgIGxvZ19zZXQgPSAxOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ0wnOgoJICAgIGlmICAoc25tcF9sb2dfb3B0aW9ucyggb3B0YXJnLCBhcmdjLCBhcmd2ICkgPCAwICkgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbG9nX3NldCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgaWYgKG9wdGFyZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBzZXRlbnYoIk1JQlMiLCBvcHRhcmcsIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ00nOgogICAgICAgICAgICBpZiAob3B0YXJnICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIHNldGVudigiTUlCRElSUyIsIG9wdGFyZywgMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnbic6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgYXBwX25hbWUgPSBvcHRhcmc7CiAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0FQUFRZUEUsIGFwcF9uYW1lKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdQJzoKICAgICAgICAgICAgcHJpbnRmKCJXYXJuaW5nOiAtUCBvcHRpb24gaXMgZGVwcmVjYXRlZCwgdXNlIC1wIGluc3RlYWRcbiIpOwogICAgICAgIGNhc2UgJ3AnOgogICAgICAgICAgICBpZiAob3B0YXJnICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIHBpZF9maWxlID0gb3B0YXJnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ3EnOgogICAgICAgICAgICBzbm1wX3NldF9xdWlja19wcmludCgxKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ3InOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgICAgTkVUU05NUF9EU19BR0VOVF9OT19ST09UX0FDQ0VTUyk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgcHJpbnRmKCJXYXJuaW5nOiAtcyBvcHRpb24gaXMgZGVwcmVjYXRlZCwgdXNlIC1Mc2QgaW5zdGVhZFxuIik7CiAgICAgICAgICAgIHNubXBfZW5hYmxlX3N5c2xvZygpOwogICAgICAgICAgICBsb2dfc2V0ID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ1MnOgogICAgICAgICAgICBwcmludGYoIldhcm5pbmc6IC1TIG9wdGlvbiBpcyBkZXByZWNhdGVkLCB1c2UgLUxzIDxmYWNpbGl0eT4gaW5zdGVhZFxuIik7CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgc3dpdGNoICgqb3B0YXJnKSB7CiAgICAgICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICAgIGNhc2UgJ0QnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0RBRU1PTjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2knOgogICAgICAgICAgICAgICAgY2FzZSAnSSc6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfSU5GTzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzAnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMMDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzEnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMMTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzInOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMMjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzMnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMMzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzQnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMNDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzUnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMNTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzYnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMNjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzcnOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0xPQ0FMNzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIHN5c2xvZyBmYWNpbGl0eTogLVMlY1xuIiwqb3B0YXJnKTsKICAgICAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNubXBfZW5hYmxlX3N5c2xvZ19pZGVudChzbm1wX2xvZ19zeXNsb2duYW1lKE5VTEwpLCBGYWNpbGl0eSk7CiAgICAgICAgICAgICAgICBsb2dfc2V0ID0gMTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibm8gc3lzbG9nIGZhY2lsaXR5IHNwZWNpZmllZFxuIik7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnVSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICAgICBORVRTTk1QX0RTX0FHRU5UX0xFQVZFX1BJREZJTEUpOwogICAgICAgICAgICBicmVhazsKCiNpZiBIQVZFX1VOSVNURF9ICiAgICAgICAgY2FzZSAndSc6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgKmVjcDsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICB1aWQ7CgogICAgICAgICAgICAgICAgdWlkID0gc3RydG91bChvcHRhcmcsICZlY3AsIDEwKTsKICAgICAgICAgICAgICAgIGlmICgqZWNwKSB7CiNpZiBIQVZFX0dFVFBXTkFNICYmIEhBVkVfUFdEX0gKICAgICAgICAgICAgICAgICAgICBpbmZvID0gZ2V0cHduYW0ob3B0YXJnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbykgewogICAgICAgICAgICAgICAgICAgICAgICB1aWQgPSBpbmZvLT5wd191aWQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQmFkIHVzZXIgaWQ6ICVzXG4iLCBvcHRhcmcpOwogICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwojaWYgSEFWRV9HRVRQV05BTSAmJiBIQVZFX1BXRF9ICiAgICAgICAgICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgIE5FVFNOTVBfRFNfQUdFTlRfVVNFUklELCB1aWQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiNlbmRpZgoKICAgICAgICBjYXNlICd2JzoKICAgICAgICAgICAgdmVyc2lvbigpOwoKICAgICAgICBjYXNlICdWJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgIE5FVFNOTVBfRFNfQUdFTlRfVkVSQk9TRSwgMSk7CiAgICAgICAgICAgIGJyZWFrOwoKI2lmIGRlZmluZWQoVVNJTkdfQUdFTlRYX1NVQkFHRU5UX01PRFVMRSl8fCBkZWZpbmVkKFVTSU5HX0FHRU5UWF9NQVNURVJfTU9EVUxFKQogICAgICAgIGNhc2UgJ3gnOgogICAgICAgICAgICBpZiAob3B0YXJnICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X3N0cmluZyhORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgICAgIE5FVFNOTVBfRFNfQUdFTlRfWF9TT0NLRVQsIG9wdGFyZyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgTkVUU05NUF9EU19BR0VOVF9BR0VOVFhfTUFTVEVSLCAxKTsKICAgICAgICAgICAgYnJlYWs7CiNlbmRpZgoKICAgICAgICBjYXNlICdYJzoKI2lmIGRlZmluZWQoVVNJTkdfQUdFTlRYX1NVQkFHRU5UX01PRFVMRSkKICAgICAgICAgICAgYWdlbnRfbW9kZSA9IFNVQl9BR0VOVDsKI2Vsc2UKICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogSWxsZWdhbCBhcmd1bWVudCAtWDoiCgkJICAgICAgICAgICAgIkFnZW50WCBzdXBwb3J0IG5vdCBjb21waWxlZCBpbi5cbiIsIGFyZ3ZbMF0pOwogICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgZXhpdCgxKTsKI2VuZGlmCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdZJzoKICAgICAgICAgICAgbmV0c25tcF9jb25maWdfcmVtZW1iZXIob3B0YXJnKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgaWYgKGRvX2hlbHApIHsKICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19BR0VOVF9OT19ST09UX0FDQ0VTUywgMSk7CiAgICAgICAgaW5pdF9hZ2VudChhcHBfbmFtZSk7ICAgICAgICAvKiByZWdpc3RlciBvdXIgLmNvbmYgaGFuZGxlcnMgKi8KICAgICAgICBpbml0X21pYl9tb2R1bGVzKCk7CiAgICAgICAgaW5pdF9zbm1wKGFwcF9uYW1lKTsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcyB1bmRlcnN0b29kOlxuIik7CiAgICAgICAgcmVhZF9jb25maWdfcHJpbnRfdXNhZ2UoIiAgIik7CiAgICAgICAgZXhpdCgwKTsKICAgIH0KCiAgICBpZiAob3B0aW5kIDwgYXJnYykgewogICAgICAgIC8qCiAgICAgICAgICogVGhlcmUgYXJlIG9wdGlvbmFsIHRyYW5zcG9ydCBhZGRyZXNzZXMgb24gdGhlIGNvbW1hbmQgbGluZS4gIAogICAgICAgICAqLwogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZC9tYWluIiwgIm9wdGluZCAlZCwgYXJnYyAlZFxuIiwgb3B0aW5kLCBhcmdjKSk7CiAgICAgICAgZm9yIChpID0gb3B0aW5kOyBpIDwgYXJnYzsgaSsrKSB7CiAgICAgICAgICAgIGNoYXIgKmMsICphc3RyaW5nOwogICAgICAgICAgICBpZiAoKGMgPSBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkJICAgTkVUU05NUF9EU19BR0VOVF9QT1JUUykpKSB7CiAgICAgICAgICAgICAgICBhc3RyaW5nID0gbWFsbG9jKHN0cmxlbihjKSArIDIgKyBzdHJsZW4oYXJndltpXSkpOwogICAgICAgICAgICAgICAgaWYgKGFzdHJpbmcgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFsbG9jIGZhaWx1cmUgcHJvY2Vzc2luZyBhcmd2WyVkXVxuIiwgaSk7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNwcmludGYoYXN0cmluZywgIiVzLCVzIiwgYywgYXJndltpXSk7CiAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICAgICBORVRTTk1QX0RTX0FHRU5UX1BPUlRTLCBhc3RyaW5nKTsKICAgICAgICAgICAgICAgIFNOTVBfRlJFRShhc3RyaW5nKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X3N0cmluZyhORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgICAgIE5FVFNOTVBfRFNfQUdFTlRfUE9SVFMsIGFyZ3ZbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZC9tYWluIiwgInBvcnQgc3BlYzogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJCSAgTkVUU05NUF9EU19BR0VOVF9QT1JUUykpKTsKICAgIH0KCiNpZmRlZiBORVRTTk1QX0xPR0ZJTEUKICAgIGlmICgwID09IGxvZ19zZXQpCiAgICAgICAgc25tcF9lbmFibGVfZmlsZWxvZyhORVRTTk1QX0xPR0ZJTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfQVBQRU5EX0xPR0ZJTEVTKSk7CiNlbmRpZgoKICAgIC8qCiAgICAgKiBJbml0aWFsaXplIGEgYXJndiBzZXQgdG8gdGhlIGN1cnJlbnQgZm9yIHJlc3RhcnRpbmcgdGhlIGFnZW50LiAgIAogICAgICovCiAgICBhcmd2cmVzdGFydHAgPSAoY2hhciAqKiltYWxsb2MoKGFyZ2MgKyAyKSAqIHNpemVvZihjaGFyICopKTsKICAgIGFyZ3ZwdHIgPSBhcmd2cmVzdGFydHA7CiAgICBmb3IgKGkgPSAwLCByZXQgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CiAgICAgICAgcmV0ICs9IHN0cmxlbihhcmd2W2ldKSArIDE7CiAgICB9CiAgICBhcmd2cmVzdGFydCA9IChjaGFyICopIG1hbGxvYyhyZXQpOwogICAgYXJndnJlc3RhcnRuYW1lID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihhcmd2WzBdKSArIDEpOwogICAgaWYgKCFhcmd2cmVzdGFydHAgfHwgIWFyZ3ZyZXN0YXJ0IHx8ICFhcmd2cmVzdGFydG5hbWUpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1hbGxvYyBmYWlsdXJlIHByb2Nlc3NpbmcgYXJndnJlc3RhcnRcbiIpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CiAgICBzdHJjcHkoYXJndnJlc3RhcnRuYW1lLCBhcmd2WzBdKTsKICAgIGlmIChhZ2VudF9tb2RlID09IC0xKSB7CiAgICAgICAgaWYgKHN0cnN0cihhcmd2cmVzdGFydG5hbWUsICJhZ2VudHhkIikgIT0gTlVMTCkgewogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgTkVUU05NUF9EU19BR0VOVF9ST0xFLCBTVUJfQUdFTlQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICBORVRTTk1QX0RTX0FHRU5UX1JPTEUsIE1BU1RFUl9BR0VOVCk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkgICAgICAgTkVUU05NUF9EU19BR0VOVF9ST0xFLCBhZ2VudF9tb2RlKTsKICAgIH0KCiAgICBmb3IgKGNwdHIgPSBhcmd2cmVzdGFydCwgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKICAgICAgICBzdHJjcHkoY3B0ciwgYXJndltpXSk7CiAgICAgICAgKihhcmd2cHRyKyspID0gY3B0cjsKICAgICAgICBjcHRyICs9IHN0cmxlbihhcmd2W2ldKSArIDE7CiAgICB9CiAgICAqY3B0ciA9IDA7CiAgICAqYXJndnB0ciA9IE5VTEw7CgogICAgU09DS19TVEFSVFVQOwogICAgaWYgKGluaXRfYWdlbnQoYXBwX25hbWUpICE9IDApIHsKICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiQWdlbnQgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKICAgICAgICBleGl0KDEpOwogICAgfQogICAgaW5pdF9taWJfbW9kdWxlcygpOwoKICAgIC8qCiAgICAgKiBzdGFydCBsaWJyYXJ5IAogICAgICovCiAgICBpbml0X3NubXAoYXBwX25hbWUpOwoKICAgIGlmICgocmV0ID0gaW5pdF9tYXN0ZXJfYWdlbnQoKSkgIT0gMCkgewogICAgICAgIC8qCiAgICAgICAgICogU29tZSBlcnJvciBvcGVuaW5nIG9uZSBvZiB0aGUgc3BlY2lmaWVkIGFnZW50IHRyYW5zcG9ydHMuICAKICAgICAgICAgKi8KICAgICAgICBFeGl0KDEpOyAgICAgICAgICAgICAgICAvKiAgRXhpdCBsb2dzIGV4aXQgdmFsIGZvciB1cyAgKi8KICAgIH0KCiAgICAvKgogICAgICogSW5pdGlhbGl6ZSB0aGUgd29ybGQuICBEZXRhY2ggZnJvbSB0aGUgc2hlbGwuICBDcmVhdGUgaW5pdGlhbCB1c2VyLiAgCiAgICAgKi8KICAgIGlmKCFkb250X2ZvcmspIHsKICAgICAgICBpbnQgcXVpdCA9ICEgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfQUdFTlRfUVVJVF9JTU1FRElBVEVMWSk7CiAgICAgICAgcmV0ID0gbmV0c25tcF9kYWVtb25pemUocXVpdCwgc25tcF9zdGRlcnJsb2dfc3RhdHVzKCkpOwogICAgICAgIC8qCiAgICAgICAgICogeHh4LXJrczogZG8gd2UgY2FyZSBpZiBmb3JrIGZhaWxzPyBJIHRoaW5rIHdlIHNob3VsZC4uLgogICAgICAgICAqLwogICAgICAgIGlmKHJldCAhPSAwKQogICAgICAgICAgICBFeGl0KDEpOyAgICAgICAgICAgICAgICAvKiAgRXhpdCBsb2dzIGV4aXQgdmFsIGZvciB1cyAgKi8KICAgIH0KCiNpZiBIQVZFX0dFVFBJRAogICAgaWYgKHBpZF9maWxlICE9IE5VTEwpIHsKICAgICAgICAvKgogICAgICAgICAqIHVubGluayB0aGUgcGlkX2ZpbGUsIGlmIGl0IGV4aXN0cywgcHJpb3IgdG8gb3Blbi4gIFdpdGhvdXQKICAgICAgICAgKiBkb2luZyB0aGlzIHRoZSBvcGVuIHdpbGwgZmFpbCBpZiB0aGUgdXNlciBzcGVjaWZpZWQgcGlkX2ZpbGUKICAgICAgICAgKiBhbHJlYWR5IGV4aXN0cy4KICAgICAgICAgKi8KICAgICAgICB1bmxpbmsocGlkX2ZpbGUpOwogICAgICAgIGZkID0gb3BlbihwaWRfZmlsZSwgT19DUkVBVCB8IE9fRVhDTCB8IE9fV1JPTkxZLCAwNjAwKTsKICAgICAgICBpZiAoZmQgPT0gLTEpIHsKICAgICAgICAgICAgc25tcF9sb2dfcGVycm9yKHBpZF9maWxlKTsKICAgICAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19BR0VOVF9OT19ST09UX0FDQ0VTUykpIHsKICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoKFBJRCA9IGZkb3BlbihmZCwgInciKSkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgc25tcF9sb2dfcGVycm9yKHBpZF9maWxlKTsKICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKFBJRCwgIiVkXG4iLCAoaW50KSBnZXRwaWQoKSk7CiAgICAgICAgICAgICAgICBmY2xvc2UoUElEKTsKICAgICAgICAgICAgfQojaWZuZGVmIF9NU0NfVkVSCiAgICAgICAgICAgIC8qIFRoZSBzZXF1ZW5jZSBvcGVuKCkvZmRvcGVuKCkvZmNsb3NlKCkvY2xvc2UoKSBtYWtlcyBNU1ZDIGNyYXNoLAogICAgICAgICAgICAgICBoZW5jZSBza2lwIHRoZSBjbG9zZSgpIGNhbGwgd2hlbiB1c2luZyB0aGUgTVNWQyBydW50aW1lLiAqLwogICAgICAgICAgICBjbG9zZShmZCk7CiNlbmRpZgogICAgICAgIH0KICAgIH0KI2VuZGlmCgojaWYgSEFWRV9VTklTVERfSAogICAgcGVyc2lzdGVudF9kaXIgPSBnZXRfcGVyc2lzdGVudF9kaXJlY3RvcnkoKTsKICAgIG1rZGlyaGllciggcGVyc2lzdGVudF9kaXIsIE5FVFNOTVBfQUdFTlRfRElSRUNUT1JZX01PREUsIDAgKTsKICAgCiAgICB1aWQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCSAgICAgTkVUU05NUF9EU19BR0VOVF9VU0VSSUQpOwogICAgZ2lkID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkgICAgIE5FVFNOTVBfRFNfQUdFTlRfR1JPVVBJRCk7CiAgICAKICAgIGlmICggdWlkICE9IDAgfHwgZ2lkICE9IDAgKQogICAgICAgIGNob3duKCBwZXJzaXN0ZW50X2RpciwgdWlkLCBnaWQgKTsKCiNpZmRlZiBIQVZFX1NFVEdJRAogICAgaWYgKChnaWQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgIE5FVFNOTVBfRFNfQUdFTlRfR1JPVVBJRCkpID4gMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZC9tYWluIiwgIkNoYW5naW5nIGdpZCB0byAlZC5cbiIsIGdpZCkpOwogICAgICAgIGlmIChzZXRnaWQoZ2lkKSA9PSAtMQojaWZkZWYgSEFWRV9TRVRHUk9VUFMKICAgICAgICAgICAgfHwgc2V0Z3JvdXBzKDEsIChnaWRfdCAqKSZnaWQpID09IC0xCiNlbmRpZgogICAgICAgICAgICApIHsKICAgICAgICAgICAgc25tcF9sb2dfcGVycm9yKCJzZXRnaWQgZmFpbGVkIik7CiAgICAgICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCQlORVRTTk1QX0RTX0FHRU5UX05PX1JPT1RfQUNDRVNTKSkgewogICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KI2VuZGlmCiNpZmRlZiBIQVZFX1NFVFVJRAogICAgaWYgKCh1aWQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgIE5FVFNOTVBfRFNfQUdFTlRfVVNFUklEKSkgPiAwKSB7CiNpZiBIQVZFX0dFVFBXTkFNICYmIEhBVkVfUFdEX0ggJiYgSEFWRV9JTklUR1JPVVBTCiAgICAgICAgLyoKICAgICAgICAgKiBTZXQgc3VwcGxlbWVudGFyeSBncm91cHMgYmVmb3JlIGNoYW5naW5nIFVJRAogICAgICAgICAqICAgKHdoaWNoIHByb2JhYmx5IGludm9sdmVzIGdpdmluZyB1cCBwcml2aWxlZ2VzKQogICAgICAgICAqLwogICAgICAgIGluZm8gPSBnZXRwd3VpZCh1aWQpOwogICAgICAgIGlmIChpbmZvKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZC9tYWluIiwgIlN1cHBsZW1lbnRhcnkgZ3JvdXBzIGZvciAlcy5cbiIsIGluZm8tPnB3X25hbWUpKTsKICAgICAgICAgICAgaWYgKGluaXRncm91cHMoaW5mby0+cHdfbmFtZSwgKGdpZCAhPSAwID8gZ2lkIDogaW5mby0+cHdfZ2lkKSkgPT0gLTEpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nX3BlcnJvcigiaW5pdGdyb3VwcyBmYWlsZWQiKTsKICAgICAgICAgICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0FHRU5UX05PX1JPT1RfQUNDRVNTKSkgewogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiNlbmRpZgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZC9tYWluIiwgIkNoYW5naW5nIHVpZCB0byAlZC5cbiIsIHVpZCkpOwogICAgICAgIGlmIChzZXR1aWQodWlkKSA9PSAtMSkgewogICAgICAgICAgICBzbm1wX2xvZ19wZXJyb3IoInNldHVpZCBmYWlsZWQiKTsKICAgICAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJCU5FVFNOTVBfRFNfQUdFTlRfTk9fUk9PVF9BQ0NFU1MpKSB7CiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojZW5kaWYKI2VuZGlmCgogICAgLyoKICAgICAqIFN0b3JlIHBlcnNpc3RlbnQgZGF0YSBpbW1lZGlhdGVseSBpbiBjYXNlIHdlIGNyYXNoIGxhdGVyLiAgCiAgICAgKi8KICAgIHNubXBfc3RvcmUoYXBwX25hbWUpOwoKI2lmZGVmIFNJR0hVUAogICAgREVCVUdNU0dUTCgoInNpZ25hbCIsICJyZWdpc3RlcmluZyBTSUdIVVAgc2lnbmFsIGhhbmRsZXJcbiIpKTsKICAgIHNpZ25hbChTSUdIVVAsIFNubXBkUmVjb25maWcpOwojZW5kaWYKCiAgICAvKgogICAgICogU2VuZCBjb2xkc3RhcnQgdHJhcCBpZiBwb3NzaWJsZS4gIAogICAgICovCiAgICBzZW5kX2Vhc3lfdHJhcCgwLCAwKTsKCiAgICAvKgogICAgICogV2UncmUgdXAsIGxvZyBvdXIgdmVyc2lvbiBudW1iZXIuICAKICAgICAqLwogICAgc25tcF9sb2coTE9HX0lORk8sICJORVQtU05NUCB2ZXJzaW9uICVzXG4iLCBuZXRzbm1wX2dldF92ZXJzaW9uKCkpOwojaWZkZWYgV0lOMzJTRVJWSUNFCiAgICBhZ2VudF9zdGF0dXMgPSBBR0VOVF9SVU5OSU5HOwojZW5kaWYKICAgIG5ldHNubXBfYWRkcmNhY2hlX2luaXRpYWxpc2UoKTsKCiAgICAvKgogICAgICogRm9yZXZlciBtb25pdG9yIHRoZSBkZXN0X3BvcnQgZm9yIGluY29taW5nIFBEVXMuICAKICAgICAqLwogICAgREVCVUdNU0dUTCgoInNubXBkL21haW4iLCAiV2UncmUgdXAuICBTdGFydGluZyB0byBwcm9jZXNzIGRhdGEuXG4iKSk7CiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQlORVRTTk1QX0RTX0FHRU5UX1FVSVRfSU1NRURJQVRFTFkpKQogICAgICAgIHJlY2VpdmUoKTsKICAgIERFQlVHTVNHVEwoKCJzbm1wZC9tYWluIiwgInNlbmRpbmcgc2h1dGRvd24gdHJhcFxuIikpOwogICAgU25tcFRyYXBOb2RlRG93bigpOwogICAgREVCVUdNU0dUTCgoInNubXBkL21haW4iLCAiQnllLi4uXG4iKSk7CiAgICBzbm1wX3NodXRkb3duKGFwcF9uYW1lKTsKICAgIHNodXRkb3duX21hc3Rlcl9hZ2VudCgpOwogICAgc2h1dGRvd25fYWdlbnQoKTsKCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQlORVRTTk1QX0RTX0FHRU5UX0xFQVZFX1BJREZJTEUpICYmCgkocGlkX2ZpbGUgIT0gTlVMTCkpIHsKICAgICAgICB1bmxpbmsocGlkX2ZpbGUpOwogICAgfQojaWZkZWYgV0lOMzJTRVJWSUNFCiAgICBhZ2VudF9zdGF0dXMgPSBBR0VOVF9TVE9QUEVEOwojZW5kaWYKCiAgICBTTk1QX0ZSRUUoYXJndnJlc3RhcnRuYW1lKTsKICAgIFNOTVBfRlJFRShhcmd2cmVzdGFydCk7CiAgICBTTk1QX0ZSRUUoYXJndnJlc3RhcnRwKTsKICAgIFNPQ0tfQ0xFQU5VUDsKICAgIHJldHVybiAwOwp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBtYWluKCkgLS0gc25tcGQgKi8KCiNpZiBkZWZpbmVkKFdJTjMyKQoKI2luY2x1ZGUgPHByb2Nlc3MuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9hc3NlcnQuaD4KCnN0YXRpYyB1bnNpZ25lZCBzX3RocmVhZGlkOwpIQU5ETEUgc190aHJlYWRfaGFuZGxlOwoKc3RhdGljIHVuc2lnbmVkIF9fc3RkY2FsbCB3YWl0X2Zvcl9zdGRpbih2b2lkKiBhcmcpCnsKICAgIGlmIChnZXRjKHN0ZGluKSAhPSBFT0YpCiAgICAgICAgbmV0c25tcF9ydW5uaW5nID0gMDsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBjcmVhdGVfc3RkaW5fd2FpdGVyX3RocmVhZCh2b2lkKQp7CiAgICBuZXRzbm1wX2Fzc2VydChzX3RocmVhZF9oYW5kbGUgPT0gMCk7CiAgICBzX3RocmVhZF9oYW5kbGUgPSAoSEFORExFKV9iZWdpbnRocmVhZGV4KDAsIDAsIHdhaXRfZm9yX3N0ZGluLCAwLCAwLCAmc190aHJlYWRpZCk7CiAgICBuZXRzbm1wX2Fzc2VydChzX3RocmVhZF9oYW5kbGUgIT0gMCk7Cn0KCnN0YXRpYyB2b2lkIGpvaW5fc3RkaW5fd2FpdGVyX3RocmVhZCh2b2lkKQp7CiAgICBpbnQgcmVzdWx0OwoKICAgIG5ldHNubXBfYXNzZXJ0KHNfdGhyZWFkX2hhbmRsZSAhPSAwKTsKICAgIHJlc3VsdCA9IFdhaXRGb3JTaW5nbGVPYmplY3Qoc190aHJlYWRfaGFuZGxlLCAxMDAwKTsKICAgIG5ldHNubXBfYXNzZXJ0KHJlc3VsdCAhPSBXQUlUX1RJTUVPVVQpOwogICAgQ2xvc2VIYW5kbGUoc190aHJlYWRfaGFuZGxlKTsKICAgIHNfdGhyZWFkX2hhbmRsZSA9IDA7Cn0KI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiByZWNlaXZlCiAqCiAqIFBhcmFtZXRlcnM6CiAqICAgICAgCiAqIFJldHVybnM6CiAqCTAJT24gc3VjY2Vzcy4KICoJLTEJU3lzdGVtIGVycm9yLgogKgogKiBJbmZpbml0ZSB3aGlsZS1sb29wIHdoaWNoIG1vbml0b3JzIGluY29taW5nIG1lc3NnZXMgZm9yIHRoZSBhZ2VudC4KICogSW52b2tlIHRoZSBlc3RhYmxpc2hlZCBtZXNzYWdlIGhhbmRsZXJzIGZvciBpbmNvbWluZyBtZXNzYWdlcyBvbiBhIHBlcgogKiBwb3J0IGJhc2lzLiAgSGFuZGxlIHRpbWVvdXRzLgogKi8Kc3RhdGljIGludApyZWNlaXZlKHZvaWQpCnsKICAgIGludCAgICAgICAgICAgICBudW1mZHM7CiAgICBuZXRzbm1wX2xhcmdlX2ZkX3NldCByZWFkZmRzLCB3cml0ZWZkcywgZXhjZXB0ZmRzOwogICAgc3RydWN0IHRpbWV2YWwgIHRpbWVvdXQsICp0dnAgPSAmdGltZW91dDsKICAgIGludCAgICAgICAgICAgICBjb3VudCwgYmxvY2ssIGk7CiNpZmRlZglVU0lOR19TTVVYX01PRFVMRQogICAgaW50ICAgICAgICAgICAgIHNkOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVTSU5HX1NNVVhfTU9EVUxFICovCgogICAgbmV0c25tcF9sYXJnZV9mZF9zZXRfaW5pdCgmcmVhZGZkcywgRkRfU0VUU0laRSk7CiAgICBuZXRzbm1wX2xhcmdlX2ZkX3NldF9pbml0KCZ3cml0ZWZkcywgRkRfU0VUU0laRSk7CiAgICBuZXRzbm1wX2xhcmdlX2ZkX3NldF9pbml0KCZleGNlcHRmZHMsIEZEX1NFVFNJWkUpOwoKICAgIC8qCiAgICAgKiBpZ25vcmUgZWFybHkgc2lnaHVwIGR1cmluZyBzdGFydHVwCiAgICAgKi8KICAgIHJlY29uZmlnID0gMDsKCiNpZiBkZWZpbmVkKFdJTjMyKQogICAgY3JlYXRlX3N0ZGluX3dhaXRlcl90aHJlYWQoKTsKI2VuZGlmCgogICAgLyoKICAgICAqIExvb3AtZm9yZXZlcjogZXhlY3V0ZSBtZXNzYWdlIGhhbmRsZXJzIGZvciBzb2NrZXRzIHdpdGggZGF0YQogICAgICovCiAgICB3aGlsZSAobmV0c25tcF9ydW5uaW5nKSB7CiAgICAgICAgaWYgKHJlY29uZmlnKSB7CiNpZiBIQVZFX1NJR0hPTEQKICAgICAgICAgICAgc2lnaG9sZChTSUdIVVApOwojZW5kaWYKICAgICAgICAgICAgcmVjb25maWcgPSAwOwogICAgICAgICAgICBzbm1wX2xvZyhMT0dfSU5GTywgIlJlY29uZmlndXJpbmcgZGFlbW9uXG4iKTsKCSAgICAvKiAgU3RvcCBhbmQgcmVzdGFydCBsb2dnaW5nLiAgVGhpcyBhbGxvd3MgbG9nZmlsZXMgdG8gYmUKCQlyb3RhdGVkIGV0Yy4gICovCgkgICAgbmV0c25tcF9sb2dnaW5nX3Jlc3RhcnQoKTsKCSAgICBzbm1wX2xvZyhMT0dfSU5GTywgIk5FVC1TTk1QIHZlcnNpb24gJXMgcmVzdGFydGVkXG4iLAoJCSAgICAgbmV0c25tcF9nZXRfdmVyc2lvbigpKTsKICAgICAgICAgICAgdXBkYXRlX2NvbmZpZygpOwogICAgICAgICAgICBzZW5kX2Vhc3lfdHJhcChTTk1QX1RSQVBfRU5URVJQUklTRVNQRUNJRklDLCAzKTsKI2lmIEhBVkVfU0lHSE9MRAogICAgICAgICAgICBzaWdyZWxzZShTSUdIVVApOwojZW5kaWYKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogZGVmYXVsdCB0byBzbGVlcGluZyBmb3IgYSByZWFsbHkgbG9uZyB0aW1lLiBJTlRfTUFYCiAgICAgICAgICogc2hvdWxkIGJlIHN1ZmZpY2llbnQgKGVnIHdlIGRvbid0IGNhcmUgaWYgdGltZV90IGlzCiAgICAgICAgICogYSBsb25nIHRoYXQncyBiaWdnZXIgdGhhbiBhbiBpbnQpLgogICAgICAgICAqLwogICAgICAgIHR2cCA9ICZ0aW1lb3V0OwogICAgICAgIHR2cC0+dHZfc2VjID0gSU5UX01BWDsKICAgICAgICB0dnAtPnR2X3VzZWMgPSAwOwoKICAgICAgICBudW1mZHMgPSAwOwogICAgICAgIE5FVFNOTVBfTEFSR0VfRkRfWkVSTygmcmVhZGZkcyk7CiAgICAgICAgTkVUU05NUF9MQVJHRV9GRF9aRVJPKCZ3cml0ZWZkcyk7CiAgICAgICAgTkVUU05NUF9MQVJHRV9GRF9aRVJPKCZleGNlcHRmZHMpOwogICAgICAgIGJsb2NrID0gMDsKICAgICAgICBzbm1wX3NlbGVjdF9pbmZvMigmbnVtZmRzLCAmcmVhZGZkcywgdHZwLCAmYmxvY2spOwogICAgICAgIGlmIChibG9jayA9PSAxKSB7CiAgICAgICAgICAgIHR2cCA9IE5VTEw7ICAgICAgICAgLyogYmxvY2sgd2l0aG91dCB0aW1lb3V0ICovCgl9CgojaWZkZWYJVVNJTkdfU01VWF9NT0RVTEUKICAgICAgICBpZiAoc211eF9saXN0ZW5fc2QgPj0gMCkgewogICAgICAgICAgICBORVRTTk1QX0xBUkdFX0ZEX1NFVChzbXV4X2xpc3Rlbl9zZCwgJnJlYWRmZHMpOwogICAgICAgICAgICBudW1mZHMgPQogICAgICAgICAgICAgICAgc211eF9saXN0ZW5fc2QgPj0gbnVtZmRzID8gc211eF9saXN0ZW5fc2QgKyAxIDogbnVtZmRzOwoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNtdXhfc25tcF9zZWxlY3RfbGlzdF9nZXRfbGVuZ3RoKCk7IGkrKykgewogICAgICAgICAgICAgICAgc2QgPSBzbXV4X3NubXBfc2VsZWN0X2xpc3RfZ2V0X1NEX2Zyb21fTGlzdChpKTsKICAgICAgICAgICAgICAgIGlmIChzZCAhPSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgTkVUU05NUF9MQVJHRV9GRF9TRVQoc2QsICZyZWFkZmRzKTsKICAgICAgICAgICAgICAgICAgIG51bWZkcyA9IHNkID49IG51bWZkcyA/IHNkICsgMSA6IG51bWZkczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVU0lOR19TTVVYX01PRFVMRSAqLwoKICAgICAgICBuZXRzbm1wX2V4dGVybmFsX2V2ZW50X2luZm8yKCZudW1mZHMsICZyZWFkZmRzLCAmd3JpdGVmZHMsICZleGNlcHRmZHMpOwoKICAgIHJlc2VsZWN0OgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fRVhURVJOQUxfU0lHUzsgaSsrKSB7CiAgICAgICAgICAgIGlmIChleHRlcm5hbF9zaWduYWxfc2NoZWR1bGVkW2ldKSB7CiAgICAgICAgICAgICAgICBleHRlcm5hbF9zaWduYWxfc2NoZWR1bGVkW2ldLS07CiAgICAgICAgICAgICAgICBleHRlcm5hbF9zaWduYWxfaGFuZGxlcltpXShpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkL3NlbGVjdCIsICJzZWxlY3QoIG51bWZkcz0lZCwgLi4uLCB0dnA9JXApXG4iLAogICAgICAgICAgICAgICAgICAgIG51bWZkcywgdHZwKSk7CiAgICAgICAgaWYodHZwKQogICAgICAgICAgICBERUJVR01TR1RMKCgidGltZXIiLCAidHZwICVsZC4lbGRcbiIsIHR2cC0+dHZfc2VjLCB0dnAtPnR2X3VzZWMpKTsKICAgICAgICBjb3VudCA9IHNlbGVjdChudW1mZHMsIHJlYWRmZHMubGZzX3NldHB0ciwgd3JpdGVmZHMubGZzX3NldHB0ciwgZXhjZXB0ZmRzLmxmc19zZXRwdHIsIHR2cCk7CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkL3NlbGVjdCIsICJyZXR1cm5lZCwgY291bnQgPSAlZFxuIiwgY291bnQpKTsKCiAgICAgICAgaWYgKGNvdW50ID4gMCkgewoKI2lmZGVmIFVTSU5HX1NNVVhfTU9EVUxFCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGhhbmRsZSB0aGUgU01VWCBzZCdzIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHNtdXhfbGlzdGVuX3NkID49IDApIHsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzbXV4X3NubXBfc2VsZWN0X2xpc3RfZ2V0X2xlbmd0aCgpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBzZCA9IHNtdXhfc25tcF9zZWxlY3RfbGlzdF9nZXRfU0RfZnJvbV9MaXN0KGkpOwogICAgICAgICAgICAgICAgICAgIGlmIChORVRTTk1QX0xBUkdFX0ZEX0lTU0VUKHNkLCAmcmVhZGZkcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNtdXhfcHJvY2VzcyhzZCkgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbXV4X3NubXBfc2VsZWN0X2xpc3RfZGVsKHNkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBuZXcgY29ubmVjdGlvbiAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKE5FVFNOTVBfTEFSR0VfRkRfSVNTRVQoc211eF9saXN0ZW5fc2QsICZyZWFkZmRzKSkgewogICAgICAgICAgICAgICAgICAgIGlmICgoc2QgPSBzbXV4X2FjY2VwdChzbXV4X2xpc3Rlbl9zZCkpID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgc211eF9zbm1wX3NlbGVjdF9saXN0X2FkZChzZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVTSU5HX1NNVVhfTU9EVUxFICovCiAgICAgICAgICAgIG5ldHNubXBfZGlzcGF0Y2hfZXh0ZXJuYWxfZXZlbnRzMigmY291bnQsICZyZWFkZmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndyaXRlZmRzLCAmZXhjZXB0ZmRzKTsKICAgICAgICAgICAgLyogSWYgdGhlcmUgYXJlIHN0aWxsIGV2ZW50cyBsZWZ0b3ZlciwgcHJvY2VzcyB0aGVtICovCiAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHsKICAgICAgICAgICAgICBzbm1wX3JlYWQyKCZyZWFkZmRzKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZQogICAgICAgICAgICBzd2l0Y2ggKGNvdW50KSB7CiAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHNubXBfdGltZW91dCgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgLTE6CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgic25tcGQvc2VsZWN0IiwgIiAgZXJybm8gPSAlZFxuIiwgZXJybm8pKTsKICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgewogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogbGlrZWx5IHRoYXQgd2UgZ290IGEgc2lnbmFsLiBDaGVjayBvdXIgc3BlY2lhbCBzaWduYWwKICAgICAgICAgICAgICAgICAgICAgKiBmbGFncyBiZWZvcmUgcmV0cnlpbmcgc2VsZWN0LgogICAgICAgICAgICAgICAgICAgICAqLwoJCSAgICBpZiAobmV0c25tcF9ydW5uaW5nICYmICFyZWNvbmZpZykgewogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJlc2VsZWN0OwoJCSAgICB9CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNubXBfbG9nX3BlcnJvcigic2VsZWN0Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAic2VsZWN0IHJldHVybmVkICVkXG4iLCBjb3VudCk7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogZW5kaWYgLS0gY291bnQ+MCAqLwoKICAgICAgICAvKgogICAgICAgICAqIHJ1biByZXF1ZXN0ZWQgYWxhcm1zIAogICAgICAgICAqLwogICAgICAgIHJ1bl9hbGFybXMoKTsKCiAgICAgICAgbmV0c25tcF9jaGVja19vdXRzdGFuZGluZ19hZ2VudF9yZXF1ZXN0cygpOwoKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmR3aGlsZSAqLwoKICAgIG5ldHNubXBfbGFyZ2VfZmRfc2V0X2NsZWFudXAoJnJlYWRmZHMpOwogICAgbmV0c25tcF9sYXJnZV9mZF9zZXRfY2xlYW51cCgmd3JpdGVmZHMpOwogICAgbmV0c25tcF9sYXJnZV9mZF9zZXRfY2xlYW51cCgmZXhjZXB0ZmRzKTsKCiNpZiBkZWZpbmVkKFdJTjMyKQogICAgam9pbl9zdGRpbl93YWl0ZXJfdGhyZWFkKCk7CiNlbmRpZgoKICAgIHNubXBfbG9nKExPR19JTkZPLCAiUmVjZWl2ZWQgVEVSTSBvciBTVE9QIHNpZ25hbC4uLiAgc2h1dHRpbmcgZG93bi4uLlxuIik7CiAgICByZXR1cm4gMDsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHJlY2VpdmUoKSAqLwoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiBzbm1wX2lucHV0CiAqCiAqIFBhcmFtZXRlcnM6CiAqCSBvcAogKgkqc2Vzc2lvbgogKgkgcmVxdWlkCiAqCSpwZHUKICoJKm1hZ2ljCiAqICAgICAgCiAqIFJldHVybnM6CiAqCTEJCU9uIHN1Y2Nlc3MJLU9SLQogKglQYXNzZXMgdGhyb3VnaAlSZXR1cm4gZnJvbSBhbGFybUdldFJlc3BvbnNlKCkgd2hlbiAKICoJICAJCSAgVVNJTkdfVjJQQVJUWV9BTEFSTV9NT0RVTEUgaXMgZGVmaW5lZC4KICoKICogQ2FsbC1iYWNrIGZ1bmN0aW9uIHRvIG1hbmFnZSByZXNwb25zZXMgdG8gdHJhcHMgKGluZm9ybXMpIGFuZCBhbGFybXMuCiAqIE5vdCB1c2VkIGJ5IHRoZSBhZ2VudCB0byBwcm9jZXNzIG90aGVyIFJlc3BvbnNlIFBEVXMuCiAqLwppbnQKc25tcF9pbnB1dChpbnQgb3AsCiAgICAgICAgICAgbmV0c25tcF9zZXNzaW9uICogc2Vzc2lvbiwKICAgICAgICAgICBpbnQgcmVxaWQsIG5ldHNubXBfcGR1ICpwZHUsIHZvaWQgKm1hZ2ljKQp7CiAgICBzdHJ1Y3QgZ2V0X3JlcV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGdldF9yZXFfc3RhdGUgKikgbWFnaWM7CgogICAgaWYgKG9wID09IE5FVFNOTVBfQ0FMTEJBQ0tfT1BfUkVDRUlWRURfTUVTU0FHRSkgewogICAgICAgIGlmIChwZHUtPmNvbW1hbmQgPT0gU05NUF9NU0dfR0VUKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS0+dHlwZSA9PSBFVkVOVF9HRVRfUkVRKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogdGhpcyBpcyBqdXN0IHRoZSBhY2sgdG8gb3VyIGluZm9ybSBwZHUgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChvcCA9PSBORVRTTk1QX0NBTExCQUNLX09QX1RJTUVEX09VVCkgewogICAgICAgIGlmIChzdGF0ZS0+dHlwZSA9PSBBTEFSTV9HRVRfUkVRKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIE5lZWQgYSBtZWNoYW5pc20gdG8gcmVwbGFjZSBvYnNvbGV0ZSBTTk1QdjJwIGFsYXJtIAogICAgICAgICAgICAgKi8KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHNubXBfaW5wdXQoKSAqLwoKCgovKgogKiBXaW5kb3dzIFNlcnZpY2UgUmVsYXRlZCBmdW5jdGlvbnMgCiAqLwojaWZkZWYgV0lOMzJTRVJWSUNFCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBtYWluIGZ1bmN0aW9uIGZvciBXaW5kb3dzCiogUGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3Igc3RhcnR1cCBvcHRpb25zLAoqIHRvIHN0YXJ0IGFzIHNlcnZpY2Ugb3IgY29uc29sZSBtb2RlIGFwcGxpY2F0aW9uIGluIHdpbmRvd3MuCiogSW52b2tlcyBhcHByb3ByaWF0ZSBzdGFydHVwIGZ1bmN0aW9ucyBkZXBlbmRpbmcgb24gdGhlIAoqIHBhcmFtZXRlcnMgcGFzc2VkCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludAogICAgX19jZGVjbApfdG1haW4oaW50IGFyZ2MsIFRDSEFSICogYXJndltdKQp7CiAgICAvKgogICAgICogRGVmaW5lIFNlcnZpY2UgTmFtZSBhbmQgRGVzY3JpcHRpb24sIHdoaWNoIGFwcGVhcnMgaW4gd2luZG93cyBTQ00gCiAgICAgKi8KICAgIExQQ1RTVFIgICAgICAgICBscHN6U2VydmljZU5hbWUgPSBhcHBfbmFtZV9sb25nOyAgICAgIC8qIFNlcnZpY2UgUmVnaXN0cnkgTmFtZSAqLwogICAgTFBDVFNUUiAgICAgICAgIGxwc3pTZXJ2aWNlRGlzcGxheU5hbWUgPSBfVCgiTmV0LVNOTVAgQWdlbnQiKTsgICAgICAgLyogRGlzcGxheSBOYW1lICovCiAgICBMUENUU1RSICAgICAgICAgbHBzelNlcnZpY2VEZXNjcmlwdGlvbiA9CiNpZmRlZiBJRkRFU0NSCiAgICAgICAgX1QoIlNOTVB2MmMgLyBTTk1QdjMgY29tbWFuZCByZXNwb25kZXIgZnJvbSBOZXQtU05NUC4gU3VwcG9ydHMgTUlCIG9iamVjdHMgZm9yIElQLElDTVAsVENQLFVEUCwgYW5kIG5ldHdvcmsgaW50ZXJmYWNlIHN1Yi1sYXllcnMuIik7CiNlbHNlCiAgICAgICAgX1QoIlNOTVB2MmMgLyBTTk1QdjMgY29tbWFuZCByZXNwb25kZXIgZnJvbSBOZXQtU05NUCIpOwojZW5kaWYKICAgIElucHV0UGFyYW1zICAgICBJbnB1dE9wdGlvbnM7CgoKICAgIGludCAgICAgICAgICAgICBuUnVuVHlwZSA9IFJVTl9BU19DT05TT0xFOwogICAgaW50ICAgICAgICAgICAgIHF1aWV0ID0gMDsKICAgIAogICAgblJ1blR5cGUgPSBQYXJzZUNtZExpbmVGb3JTZXJ2aWNlT3B0aW9uKGFyZ2MsIGFyZ3YsICZxdWlldCk7CgogICAgc3dpdGNoIChuUnVuVHlwZSkgewogICAgY2FzZSBSRUdJU1RFUl9TRVJWSUNFOgogICAgICAgIC8qCiAgICAgICAgICogUmVnaXN0ZXIgQXMgc2VydmljZSAKICAgICAgICAgKi8KICAgICAgICBJbnB1dE9wdGlvbnMuQXJnYyA9IGFyZ2M7CiAgICAgICAgSW5wdXRPcHRpb25zLkFyZ3YgPSBhcmd2OwogICAgICAgIGV4aXQgKFJlZ2lzdGVyU2VydmljZShscHN6U2VydmljZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGxwc3pTZXJ2aWNlRGlzcGxheU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGxwc3pTZXJ2aWNlRGVzY3JpcHRpb24sICZJbnB1dE9wdGlvbnMsIHF1aWV0KSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFVOX1JFR0lTVEVSX1NFUlZJQ0U6CiAgICAgICAgLyoKICAgICAgICAgKiBVbnJlZ2lzdGVyIHNlcnZpY2UgCiAgICAgICAgICovCiAgICAgICAgZXhpdCAoVW5yZWdpc3RlclNlcnZpY2UobHBzelNlcnZpY2VOYW1lLCBxdWlldCkpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBSVU5fQVNfU0VSVklDRToKICAgICAgICAvKgogICAgICAgICAqIFJ1biBhcyBzZXJ2aWNlIAogICAgICAgICAqLwogICAgICAgIC8qCiAgICAgICAgICogUmVnaXN0ZXIgU3RvcCBGdW5jdGlvbiAKICAgICAgICAgKi8KICAgICAgICBSZWdpc3RlclN0b3BGdW5jdGlvbihTdG9wU25tcEFnZW50KTsKICAgICAgICByZXR1cm4gUnVuQXNTZXJ2aWNlKFNubXBEYWVtb25NYWluKTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgLyoKICAgICAgICAgKiBSdW4gaW4gY29uc29sZSBtb2RlIAogICAgICAgICAqLwogICAgICAgIHJldHVybiBTbm1wRGFlbW9uTWFpbihhcmdjLCBhcmd2KTsKICAgICAgICBicmVhazsKICAgIH0KfQoKLyoKICogVG8gc3RvcCBTbm1wIEFnZW50IGRhZW1vbgogKiBUaGlzIHBvcnRpb24gaXMgc3RpbGwgbm90IHdvcmtpbmcKICovCnZvaWQKU3RvcFNubXBBZ2VudCh2b2lkKQp7CiAgICAvKgogICAgICogU2h1dCBEb3duIEFnZW50IAogICAgICovCiAgICBTbm1wZFNodXREb3duKDEpOwoKICAgIC8qCiAgICAgKiBXYWl0IHRpbGwgYWdlbnQgaXMgY29tcGxldGVseSBzdG9wcGVkIAogICAgICovCgogICAgd2hpbGUgKGFnZW50X3N0YXR1cyAhPSBBR0VOVF9TVE9QUEVEKSB7CiAgICAgICAgU2xlZXAoMTAwKTsKICAgIH0KfQoKI2VuZGlmIC8qV0lOMzJTRVJWSUNFKi8K