LyoKICogQ2luZXBhayBlbmNvZGVyIChjKSAyMDExIFRvbWFzIEjkcmRpbgogKiBodHRwOi8vdGl0YW4uY29kZW1pbGwuc2UvfnRvbWhhci9jaW5lcGFrZW5jLnBhdGNoCiAqCiAqIEZpeGVzIGFuZCBpbXByb3ZlbWVudHMsIHZpbnRhZ2UgZGVjb2RlcnMgY29tcGF0aWJpbGl0eQogKiAgKGMpIDIwMTMsIDIwMTQgUmwsIEFldGV5IEdsb2JhbCBUZWNobm9sb2dpZXMgQUIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCmNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCnRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCmFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQpTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCkFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgpPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgogKiBUT0RPOgogKiAtIG9wdGltaXplOiBjb2xvciBzcGFjZSBjb252ZXJzaW9uLCAuLi4KICogLSBpbXBsZW1lbnQgb3B0aW9ucyB0byBzZXQgdGhlIG1pbi9tYXggbnVtYmVyIG9mIHN0cmlwcz8KICogTUFZQkU6CiAqIC0gIm9wdGltYWxseSIgc3BsaXQgdGhlIGZyYW1lIGludG8gc2V2ZXJhbCBub24tcmVndWxhciBhcmVhcwogKiAgIHVzaW5nIGEgc2VwYXJhdGUgY29kZWJvb2sgcGFpciBmb3IgZWFjaCBhcmVhIGFuZCBhcHByb3hpbWF0aW5nCiAqICAgdGhlIGFyZWEgYnkgc2V2ZXJhbCByZWN0YW5ndWxhciBzdHJpcHMgKGdlbmVyYWxseSBub3QgZnVsbCB3aWR0aCBvbmVzKQogKiAgICh1c2UgcXVhZHRyZWUgc3BsaXR0aW5nPyBhIHNpbXBsZSBmaXhlZC1ncmFudWxhcml0eSBncmlkPykKICoKICoKICogdmVyc2lvbiAyMDE0LTAxLTIzIFJsCiAqIC0gYWRkZWQgb3B0aW9uIGhhbmRsaW5nIGZvciBmbGV4aWJpbGl0eQogKgogKiB2ZXJzaW9uIDIwMTQtMDEtMjEgUmwKICogLSBiZWxpZXZlIGl0IG9yIG5vdCwgbm93IHdlIGdldCBldmVuIHNtYWxsZXIgZmlsZXMsIHdpdGggYmV0dGVyIHF1YWxpdHkKICogICAod2hpY2ggbWVhbnMgSSBtaXNzZWQgYW4gb3B0aW1pemF0aW9uIGVhcmxpZXIgOikKICoKICogdmVyc2lvbiAyMDE0LTAxLTIwIFJsCiAqIC0gbWFkZSB0aGUgZW5jb2RlciBjb21wYXRpYmxlIHdpdGggdmludGFnZSBkZWNvZGVycwogKiAgIGFuZCBhZGRlZCBzb21lIHlldCB1bnVzZWQgY29kZSBmb3IgcG9zc2libGUgZnV0dXJlCiAqICAgaW5jcmVtZW50YWwgY29kZWJvb2sgdXBkYXRlcwogKiAtIGZpeGVkIGEgc21hbGwgbWVtb3J5IGxlYWsKICoKICogdmVyc2lvbiAyMDEzLTA0LTI4IFJsCiAqIC0gYnVnZml4ZWQgY29kZWJvb2sgb3B0aW1pemF0aW9uIGxvZ2ljCiAqCiAqIHZlcnNpb24gMjAxMy0wMi0xNCBSbAogKiAiVmFsZW50aW5lJ3MgRGF5IiB2ZXJzaW9uOgogKiAtIG1hZGUgc3RyaXAgZGl2aXNpb24gbW9yZSByb2J1c3QKICogLSBtaW5pbWl6ZWQgYnJ1dGVmb3JjaW5nIHRoZSBudW1iZXIgb2Ygc3RyaXBzLAogKiAgIChjb3N0cyBzb21lIFIvRCBidXQgc3BlZWRzIHVwIGNvbXBlc3Npb24gYSBsb3QpLCB0aGUgaGV1cmlzdGljCiAqICAgYXNzdW1wdGlvbiBpcyB0aGF0IHNjb3JlIGFzIGEgZnVuY3Rpb24gb2YgdGhlIG51bWJlciBvZiBzdHJpcHMgaGFzCiAqICAgb25lIHdpZGUgbWluaW11bSB3aGljaCBtb3ZlcyBzbG93bHksIG9mIGNvdXJzZSBub3QgZnVsbHkgdHJ1ZQogKiAtIHNpbXBsaWZpZWQgY29kZWJvb2sgZ2VuZXJhdGlvbiwKICogICB0aGUgb2xkIGNvZGUgd2FzIG1lYW50IGZvciBvdGhlciBvcHRpbWl6YXRpb25zIHRoYW4gd2UgYWN0dWFsbHkgZG8KICogLSBvcHRpbWl6ZWQgdGhlIGNvZGVib29rIGdlbmVyYXRpb24gLyBlcnJvciBlc3RpbWF0aW9uIGZvciBNT0RFX01DCiAqCiAqIHZlcnNpb24gMjAxMy0wMi0xMiBSbAogKiAtIHNlcGFyYXRlZCBjb2RlYm9vayB0cmFpbmluZyBzZXRzLCBhdm9pZGVkIHRoZSB0cmFuc2ZlciBvZiB3YXN0ZWQgYnl0ZXMsCiAqICAgd2hpY2ggeWllbGRzIGJvdGggYmV0dGVyIHF1YWxpdHkgYW5kIHNtYWxsZXIgZmlsZXMKICogLSBub3cgdXNpbmcgdGhlIGNvcnJlY3QgY29sb3JzcGFjZSAoVE9ETzogbW92ZSBjb252ZXJzaW9uIHRvIGxpYnN3c2NhbGUpCiAqCiAqIHZlcnNpb24gMjAxMy0wMi0wOCBSbAogKiAtIGZpeGVzL29wdGltaXphdGlvbiBpbiBtdWx0aXN0cmlwIGVuY29kaW5nIGFuZCBjb2RlYm9vayBzaXplIGNob2ljZSwKICogICBxdWFsaXR5L2JpdHJhdGUgaXMgbm93IGJldHRlciB0aGFuIHRoYXQgb2YgdGhlIGJpbmFyeSBwcm9wcmlldGFyeSBlbmNvZGVyCiAqLwoKI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKI2luY2x1ZGUgImF2Y29kZWMuaCIKI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKI2luY2x1ZGUgImVsYmcuaCIKI2luY2x1ZGUgImludGVybmFsLmgiCgojaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCgojZGVmaW5lIENWSURfSEVBREVSX1NJWkUgMTAKI2RlZmluZSBTVFJJUF9IRUFERVJfU0laRSAxMgojZGVmaW5lIENIVU5LX0hFQURFUl9TSVpFIDQKCiNkZWZpbmUgTUJfU0laRSA0ICAgICAgICAgICAvLzR4NCBNQnMKI2RlZmluZSBNQl9BUkVBIChNQl9TSVpFKk1CX1NJWkUpCgojZGVmaW5lIFZFQ1RPUl9NQVggNiAgICAgICAgLy9zaXggb3IgZm91ciBlbnRyaWVzIHBlciB2ZWN0b3IgZGVwZW5kaW5nIG9uIGZvcm1hdAojZGVmaW5lIENPREVCT09LX01BWCAyNTYgICAgLy9zaXplIG9mIGEgY29kZWJvb2sKCiNkZWZpbmUgTUFYX1NUUklQUyAgMzIgICAgICAvL05vdGU6IGhhdmluZyBmZXdlciBjaG9pY2VzIHJlZ2FyZGluZyB0aGUgbnVtYmVyIG9mIHN0cmlwcyBzcGVlZHMgdXAgZW5jb2RpbmcgKG9idmlvdXNseSkKI2RlZmluZSBNSU5fU1RSSVBTICAxICAgICAgIC8vTm90ZTogaGF2aW5nIG1vcmUgc3RyaXBzIHNwZWVkcyB1cCBlbmNvZGluZyB0aGUgZnJhbWUgKHRoaXMgaXMgbGVzcyBvYnZpb3VzKQovLyBNQVhfU1RSSVBTIGxpbWl0cyB0aGUgbWF4aW11bSBxdWFsaXR5IHlvdSBjYW4gcmVhY2gKLy8gICAgICAgICAgICB3aGVuIHlvdSB3YW50IGhpZ2h0IHF1YWxpdHkgb24gaGlnaCByZXNvbHV0aW9ucywKLy8gTUlOX1NUUklQUyBsaW1pdHMgdGhlIG1pbmltdW0gZWZmaWNpZW50bHkgZW5jb2RhYmxlIGJpdCByYXRlCi8vICAgICAgICAgICAgb24gbG93IHJlc29sdXRpb25zCi8vIHRoZSBudW1iZXJzIGFyZSBvbmx5IHVzZWQgZm9yIGJydXRlIGZvcmNlIG9wdGltaXphdGlvbiBmb3IgdGhlIGZpcnN0IGZyYW1lLAovLyBmb3IgdGhlIGZvbGxvd2luZyBmcmFtZXMgdGhleSBhcmUgYWRhcHRpdmVseSByZWFkanVzdGVkCi8vIE5PVEUgdGhlIGRlY29kZXIgaW4gZmZtcGVnIGhhcyBpdHMgb3duIGFyYml0cmFyeSBsaW1pdGF0aW9uIG9uIHRoZSBudW1iZXIKLy8gb2Ygc3RyaXBzLCBjdXJyZW50bHkgMzIKCnR5cGVkZWYgZW51bSB7CiAgICBNT0RFX1YxX09OTFkgPSAwLAogICAgTU9ERV9WMV9WNCwKICAgIE1PREVfTUMsCgogICAgTU9ERV9DT1VOVCwKfSBDaW5lcGFrTW9kZTsKCnR5cGVkZWYgZW51bSB7CiAgICBFTkNfVjEsCiAgICBFTkNfVjQsCiAgICBFTkNfU0tJUCwKCiAgICBFTkNfVU5DRVJUQUlOCn0gbWJfZW5jb2Rpbmc7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBpbnQgdjFfdmVjdG9yOyAgICAgICAgICAgICAgICAgIC8vaW5kZXggaW50byB2MSBjb2RlYm9vawogICAgaW50IHYxX2Vycm9yOyAgICAgICAgICAgICAgICAgICAvL2Vycm9yIHdoZW4gdXNpbmcgVjEgZW5jb2RpbmcKICAgIGludCB2NF92ZWN0b3JbNF07ICAgICAgICAgICAgICAgLy9pbmRpY2VzIGludG8gdjQgY29kZWJvb2tzCiAgICBpbnQgdjRfZXJyb3I7ICAgICAgICAgICAgICAgICAgIC8vZXJyb3Igd2hlbiB1c2luZyBWNCBlbmNvZGluZwogICAgaW50IHNraXBfZXJyb3I7ICAgICAgICAgICAgICAgICAvL2Vycm9yIHdoZW4gYmxvY2sgaXMgc2tpcHBlZCAoYWthIGNvcGllZCBmcm9tIGxhc3QgZnJhbWUpCiAgICBtYl9lbmNvZGluZyBiZXN0X2VuY29kaW5nOyAgICAgIC8vbGFzdCByZXN1bHQgZnJvbSBjYWxjdWxhdGVfbW9kZV9zY29yZSgpCn0gbWJfaW5mbzsKCnR5cGVkZWYgc3RydWN0IHsKICAgIGludCB2MV9jb2RlYm9va1tDT0RFQk9PS19NQVgqVkVDVE9SX01BWF07CiAgICBpbnQgdjRfY29kZWJvb2tbQ09ERUJPT0tfTUFYKlZFQ1RPUl9NQVhdOwogICAgaW50IHYxX3NpemU7CiAgICBpbnQgdjRfc2l6ZTsKICAgIENpbmVwYWtNb2RlIG1vZGU7Cn0gc3RyaXBfaW5mbzsKCnR5cGVkZWYgc3RydWN0IHsKICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OwogICAgdW5zaWduZWQgY2hhciAqcGljdF9idWZzWzRdLCAqc3RyaXBfYnVmLCAqZnJhbWVfYnVmOwogICAgQVZGcmFtZSAqbGFzdF9mcmFtZTsKICAgIEFWRnJhbWUgKmJlc3RfZnJhbWU7CiAgICBBVkZyYW1lICpzY3JhdGNoX2ZyYW1lOwogICAgQVZGcmFtZSAqaW5wdXRfZnJhbWU7CiAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdDsKICAgIGludCB3LCBoOwogICAgaW50IGZyYW1lX2J1Zl9zaXplOwogICAgaW50IGN1cmZyYW1lLCBrZXlpbnQ7CiAgICBBVkxGRyByYW5kY3R4OwogICAgdWludDY0X3QgbGFtYmRhOwogICAgaW50ICpjb2RlYm9va19pbnB1dDsKICAgIGludCAqY29kZWJvb2tfY2xvc2VzdDsKICAgIG1iX2luZm8gKm1iOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9NQiBSRCBzdGF0ZQogICAgaW50IG1pbl9zdHJpcHM7ICAgICAgICAgIC8vdGhlIGN1cnJlbnQgbGltaXQKICAgIGludCBtYXhfc3RyaXBzOyAgICAgICAgICAvL3RoZSBjdXJyZW50IGxpbWl0CiNpZmRlZiBDSU5FUEFLRU5DX0RFQlVHCiAgICBtYl9pbmZvICpiZXN0X21iOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogcmVtb3ZlLiBvbmx5IHVzZWQgZm9yIHByaW50aW5nIHN0YXRzCiAgICBpbnQgbnVtX3YxX21vZGUsIG51bV92NF9tb2RlLCBudW1fbWNfbW9kZTsKICAgIGludCBudW1fdjFfZW5jcywgbnVtX3Y0X2VuY3MsIG51bV9za2lwczsKI2VuZGlmCi8vIG9wdGlvbnMKICAgIGludCBtYXhfZXh0cmFfY2JfaXRlcmF0aW9uczsKICAgIGludCBza2lwX2VtcHR5X2NiOwogICAgaW50IG1pbl9taW5fc3RyaXBzOwogICAgaW50IG1heF9tYXhfc3RyaXBzOwogICAgaW50IHN0cmlwX251bWJlcl9kZWx0YV9yYW5nZTsKfSBDaW5lcGFrRW5jQ29udGV4dDsKCiNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKENpbmVwYWtFbmNDb250ZXh0LCB4KQojZGVmaW5lIFZFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0Kc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKICAgIHsgIm1heF9leHRyYV9jYl9pdGVyYXRpb25zIiwgIk1heCBleHRyYSBjb2RlYm9vayByZWNhbGN1bGF0aW9uIHBhc3NlcywgbW9yZSBpcyBiZXR0ZXIgYW5kIHNsb3dlciIsIE9GRlNFVChtYXhfZXh0cmFfY2JfaXRlcmF0aW9ucyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMiB9LCAwLCBJTlRfTUFYLCBWRSB9LAogICAgeyAic2tpcF9lbXB0eV9jYiIsICJBdm9pZCB3YXN0aW5nIGJ5dGVzLCBpZ25vcmUgdmludGFnZSBNYWNPUyBkZWNvZGVyIiwgT0ZGU0VUKHNraXBfZW1wdHlfY2IpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgMSwgVkUgfSwKICAgIHsgIm1heF9zdHJpcHMiLCAiTGltaXQgc3RyaXBzL2ZyYW1lLCB2aW50YWdlIGNvbXBhdGlibGUgaXMgMS4uMywgb3RoZXJ3aXNlIHRoZSBtb3JlIHRoZSBiZXR0ZXIiLCBPRkZTRVQobWF4X21heF9zdHJpcHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDMgfSwgTUlOX1NUUklQUywgTUFYX1NUUklQUywgVkUgfSwKICAgIHsgIm1pbl9zdHJpcHMiLCAiRW5mb3JjZSBtaW4gc3RyaXBzL2ZyYW1lLCBtb3JlIGlzIHdvcnNlIGFuZCBmYXN0ZXIsIG11c3QgYmUgPD0gbWF4X3N0cmlwcyIsIE9GRlNFVChtaW5fbWluX3N0cmlwcyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gTUlOX1NUUklQUyB9LCBNSU5fU1RSSVBTLCBNQVhfU1RSSVBTLCBWRSB9LAogICAgeyAic3RyaXBfbnVtYmVyX2FkYXB0aXZpdHkiLCAiSG93IGZhc3QgdGhlIHN0cmlwIG51bWJlciBhZGFwdHMsIG1vcmUgaXMgc2xpZ2h0bHkgYmV0dGVyLCBtdWNoIHNsb3dlciIsIE9GRlNFVChzdHJpcF9udW1iZXJfZGVsdGFfcmFuZ2UpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgTUFYX1NUUklQUy1NSU5fU1RSSVBTLCBWRSB9LAogICAgeyBOVUxMIH0sCn07CgpzdGF0aWMgY29uc3QgQVZDbGFzcyBjaW5lcGFrX2NsYXNzID0gewogICAgLmNsYXNzX25hbWUgPSAiY2luZXBhayIsCiAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAogICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAogICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCn07CgpzdGF0aWMgYXZfY29sZCBpbnQgY2luZXBha19lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCnsKICAgIENpbmVwYWtFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKICAgIGludCB4LCBtYl9jb3VudCwgc3RyaXBfYnVmX3NpemUsIGZyYW1lX2J1Zl9zaXplOwoKICAgIGlmIChhdmN0eC0+d2lkdGggJiAzIHx8IGF2Y3R4LT5oZWlnaHQgJiAzKSB7CiAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgbXVsdGlwbGVzIG9mIGZvdXIgKGdvdCAlaXglaSlcbiIsCiAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOwogICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICB9CgogICAgaWYgKHMtPm1pbl9taW5fc3RyaXBzID4gcy0+bWF4X21heF9zdHJpcHMpIHsKICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm1pbmltYWwgbnVtYmVyIG9mIHN0cmlwcyBjYW4gbm90IGV4Y2VlZCBtYXhpbWFsIChnb3QgJWkgYW5kICVpKVxuIiwKICAgICAgICAgICAgICAgIHMtPm1pbl9taW5fc3RyaXBzLCBzLT5tYXhfbWF4X3N0cmlwcyk7CiAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgIH0KCiAgICBpZiAoIShzLT5sYXN0X2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkpCiAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgIGlmICghKHMtPmJlc3RfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpKSkKICAgICAgICBnb3RvIGVub21lbTsKICAgIGlmICghKHMtPnNjcmF0Y2hfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpKSkKICAgICAgICBnb3RvIGVub21lbTsKICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KQogICAgICAgIGlmICghKHMtPmlucHV0X2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkpCiAgICAgICAgICAgIGdvdG8gZW5vbWVtOwoKICAgIGlmICghKHMtPmNvZGVib29rX2lucHV0ID0gYXZfbWFsbG9jKHNpemVvZihpbnQpICogKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA2IDogNCkgKiAoYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCkgPj4gMikpKQogICAgICAgIGdvdG8gZW5vbWVtOwoKICAgIGlmICghKHMtPmNvZGVib29rX2Nsb3Nlc3QgPSBhdl9tYWxsb2Moc2l6ZW9mKGludCkgKiAoYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCkgPj4gMikpKQogICAgICAgIGdvdG8gZW5vbWVtOwoKICAgIGZvcih4ID0gMDsgeCA8IChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNCA6IDMpOyB4KyspCiAgICAgICAgaWYoIShzLT5waWN0X2J1ZnNbeF0gPSBhdl9tYWxsb2MoKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA2IDogNCkgKiAoYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCkgPj4gMikpKQogICAgICAgICAgICBnb3RvIGVub21lbTsKCiAgICBtYl9jb3VudCA9IGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQgLyBNQl9BUkVBOwoKICAgIC8vdGhlIGxhcmdlc3QgcG9zc2libGUgY2h1bmsgaXMgMHgzMSB3aXRoIGFsbCBNQnMgZW5jb2RlZCBpbiBWNCBtb2RlCiAgICAvL2FuZCBmdWxsIGNvZGVib29rcyBiZWluZyByZXBsYWNlZCBpbiBJTlRFUiBtb2RlLAogICAgLy8gd2hpY2ggaXMgMzQgYml0cyBwZXIgTUIKICAgIC8vYW5kIDIqMjU2IGV4dHJhIGZsYWcgYml0cyBwZXIgc3RyaXAKICAgIHN0cmlwX2J1Zl9zaXplID0gU1RSSVBfSEVBREVSX1NJWkUgKyAzICogQ0hVTktfSEVBREVSX1NJWkUgKyAyICogVkVDVE9SX01BWCAqIENPREVCT09LX01BWCArIDQgKiAobWJfY291bnQgKyAobWJfY291bnQgKyAxNSkgLyAxNikgKyAoMiAqIENPREVCT09LX01BWCkvODsKCiAgICBmcmFtZV9idWZfc2l6ZSA9IENWSURfSEVBREVSX1NJWkUgKyBzLT5tYXhfbWF4X3N0cmlwcyAqIHN0cmlwX2J1Zl9zaXplOwoKICAgIGlmICghKHMtPnN0cmlwX2J1ZiA9IGF2X21hbGxvYyhzdHJpcF9idWZfc2l6ZSkpKQogICAgICAgIGdvdG8gZW5vbWVtOwoKICAgIGlmICghKHMtPmZyYW1lX2J1ZiA9IGF2X21hbGxvYyhmcmFtZV9idWZfc2l6ZSkpKQogICAgICAgIGdvdG8gZW5vbWVtOwoKICAgIGlmICghKHMtPm1iID0gYXZfbWFsbG9jX2FycmF5KG1iX2NvdW50LCBzaXplb2YobWJfaW5mbykpKSkKICAgICAgICBnb3RvIGVub21lbTsKCiNpZmRlZiBDSU5FUEFLRU5DX0RFQlVHCiAgICBpZiAoIShzLT5iZXN0X21iID0gYXZfbWFsbG9jX2FycmF5KG1iX2NvdW50LCBzaXplb2YobWJfaW5mbykpKSkKICAgICAgICBnb3RvIGVub21lbTsKI2VuZGlmCgogICAgYXZfbGZnX2luaXQoJnMtPnJhbmRjdHgsIDEpOwogICAgcy0+YXZjdHggPSBhdmN0eDsKICAgIHMtPncgPSBhdmN0eC0+d2lkdGg7CiAgICBzLT5oID0gYXZjdHgtPmhlaWdodDsKICAgIHMtPmZyYW1lX2J1Zl9zaXplID0gZnJhbWVfYnVmX3NpemU7CiAgICBzLT5jdXJmcmFtZSA9IDA7CiAgICBzLT5rZXlpbnQgPSBhdmN0eC0+a2V5aW50X21pbjsKICAgIHMtPnBpeF9mbXQgPSBhdmN0eC0+cGl4X2ZtdDsKCiAgICAvL3NldCB1cCBBVkZyYW1lcwogICAgcy0+bGFzdF9mcmFtZS0+ZGF0YVswXSAgICAgICAgPSBzLT5waWN0X2J1ZnNbMF07CiAgICBzLT5sYXN0X2ZyYW1lLT5saW5lc2l6ZVswXSAgICA9IHMtPnc7CiAgICBzLT5iZXN0X2ZyYW1lLT5kYXRhWzBdICAgICAgICA9IHMtPnBpY3RfYnVmc1sxXTsKICAgIHMtPmJlc3RfZnJhbWUtPmxpbmVzaXplWzBdICAgID0gcy0+dzsKICAgIHMtPnNjcmF0Y2hfZnJhbWUtPmRhdGFbMF0gICAgID0gcy0+cGljdF9idWZzWzJdOwogICAgcy0+c2NyYXRjaF9mcmFtZS0+bGluZXNpemVbMF0gPSBzLT53OwoKICAgIGlmIChzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpIHsKICAgICAgICBzLT5sYXN0X2ZyYW1lLT5kYXRhWzFdICAgICAgICA9IHMtPmxhc3RfZnJhbWUtPmRhdGFbMF0gKyBzLT53ICogcy0+aDsKICAgICAgICBzLT5sYXN0X2ZyYW1lLT5kYXRhWzJdICAgICAgICA9IHMtPmxhc3RfZnJhbWUtPmRhdGFbMV0gKyAoKHMtPncgKiBzLT5oKSA+PiAyKTsKICAgICAgICBzLT5sYXN0X2ZyYW1lLT5saW5lc2l6ZVsxXSAgICA9IHMtPmxhc3RfZnJhbWUtPmxpbmVzaXplWzJdID0gcy0+dyA+PiAxOwoKICAgICAgICBzLT5iZXN0X2ZyYW1lLT5kYXRhWzFdICAgICAgICA9IHMtPmJlc3RfZnJhbWUtPmRhdGFbMF0gKyBzLT53ICogcy0+aDsKICAgICAgICBzLT5iZXN0X2ZyYW1lLT5kYXRhWzJdICAgICAgICA9IHMtPmJlc3RfZnJhbWUtPmRhdGFbMV0gKyAoKHMtPncgKiBzLT5oKSA+PiAyKTsKICAgICAgICBzLT5iZXN0X2ZyYW1lLT5saW5lc2l6ZVsxXSAgICA9IHMtPmJlc3RfZnJhbWUtPmxpbmVzaXplWzJdID0gcy0+dyA+PiAxOwoKICAgICAgICBzLT5zY3JhdGNoX2ZyYW1lLT5kYXRhWzFdICAgICA9IHMtPnNjcmF0Y2hfZnJhbWUtPmRhdGFbMF0gKyBzLT53ICogcy0+aDsKICAgICAgICBzLT5zY3JhdGNoX2ZyYW1lLT5kYXRhWzJdICAgICA9IHMtPnNjcmF0Y2hfZnJhbWUtPmRhdGFbMV0gKyAoKHMtPncgKiBzLT5oKSA+PiAyKTsKICAgICAgICBzLT5zY3JhdGNoX2ZyYW1lLT5saW5lc2l6ZVsxXSA9IHMtPnNjcmF0Y2hfZnJhbWUtPmxpbmVzaXplWzJdID0gcy0+dyA+PiAxOwoKICAgICAgICBzLT5pbnB1dF9mcmFtZS0+ZGF0YVswXSAgICAgICA9IHMtPnBpY3RfYnVmc1szXTsKICAgICAgICBzLT5pbnB1dF9mcmFtZS0+bGluZXNpemVbMF0gICA9IHMtPnc7CiAgICAgICAgcy0+aW5wdXRfZnJhbWUtPmRhdGFbMV0gICAgICAgPSBzLT5pbnB1dF9mcmFtZS0+ZGF0YVswXSArIHMtPncgKiBzLT5oOwogICAgICAgIHMtPmlucHV0X2ZyYW1lLT5kYXRhWzJdICAgICAgID0gcy0+aW5wdXRfZnJhbWUtPmRhdGFbMV0gKyAoKHMtPncgKiBzLT5oKSA+PiAyKTsKICAgICAgICBzLT5pbnB1dF9mcmFtZS0+bGluZXNpemVbMV0gICA9IHMtPmlucHV0X2ZyYW1lLT5saW5lc2l6ZVsyXSA9IHMtPncgPj4gMTsKICAgIH0KCiAgICBzLT5taW5fc3RyaXBzID0gcy0+bWluX21pbl9zdHJpcHM7CiAgICBzLT5tYXhfc3RyaXBzID0gcy0+bWF4X21heF9zdHJpcHM7CgojaWZkZWYgQ0lORVBBS0VOQ19ERUJVRwogICAgcy0+bnVtX3YxX21vZGUgPSBzLT5udW1fdjRfbW9kZSA9IHMtPm51bV9tY19tb2RlID0gcy0+bnVtX3YxX2VuY3MgPSBzLT5udW1fdjRfZW5jcyA9IHMtPm51bV9za2lwcyA9IDA7CiNlbmRpZgoKICAgIHJldHVybiAwOwoKZW5vbWVtOgogICAgYXZfZnJhbWVfZnJlZSgmcy0+bGFzdF9mcmFtZSk7CiAgICBhdl9mcmFtZV9mcmVlKCZzLT5iZXN0X2ZyYW1lKTsKICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnNjcmF0Y2hfZnJhbWUpOwogICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpCiAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+aW5wdXRfZnJhbWUpOwogICAgYXZfZnJlZXAoJnMtPmNvZGVib29rX2lucHV0KTsKICAgIGF2X2ZyZWVwKCZzLT5jb2RlYm9va19jbG9zZXN0KTsKICAgIGF2X2ZyZWVwKCZzLT5zdHJpcF9idWYpOwogICAgYXZfZnJlZXAoJnMtPmZyYW1lX2J1Zik7CiAgICBhdl9mcmVlcCgmcy0+bWIpOwojaWZkZWYgQ0lORVBBS0VOQ19ERUJVRwogICAgYXZfZnJlZXAoJnMtPmJlc3RfbWIpOwojZW5kaWYKCiAgICBmb3IoeCA9IDA7IHggPCAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/IDQgOiAzKTsgeCsrKQogICAgICAgIGF2X2ZyZWVwKCZzLT5waWN0X2J1ZnNbeF0pOwoKICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Cn0KCnN0YXRpYyBpbnQ2NF90IGNhbGN1bGF0ZV9tb2RlX3Njb3JlKENpbmVwYWtFbmNDb250ZXh0ICpzLCBpbnQgaCwgc3RyaXBfaW5mbyAqaW5mbywgaW50IHJlcG9ydCwgaW50ICp0cmFpbmluZ19zZXRfdjFfc2hydW5rLCBpbnQgKnRyYWluaW5nX3NldF92NF9zaHJ1bmsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKLCBpbnQ2NF90ICpzZXJyCiNlbmRpZgopCnsKICAgIC8vc2NvcmUgPSBGRl9MQU1CREFfU0NBTEUgKiBlcnJvciArIGxhbWJkYSAqIGJpdHMKICAgIGludCB4OwogICAgaW50IGVudHJ5X3NpemUgPSBzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA2IDogNDsKICAgIGludCBtYl9jb3VudCA9IHMtPncgKiBoIC8gTUJfQVJFQTsKICAgIG1iX2luZm8gKm1iOwogICAgaW50NjRfdCBzY29yZTEsIHNjb3JlMiwgc2NvcmUzOwogICAgaW50NjRfdCByZXQgPSBzLT5sYW1iZGEgKiAoKGluZm8tPnYxX3NpemUgPyBDSFVOS19IRUFERVJfU0laRSArIGluZm8tPnYxX3NpemUgKiBlbnRyeV9zaXplIDogMCkgKwogICAgICAgICAgICAgICAgICAgKGluZm8tPnY0X3NpemUgPyBDSFVOS19IRUFERVJfU0laRSArIGluZm8tPnY0X3NpemUgKiBlbnRyeV9zaXplIDogMCkgKwogICAgICAgICAgICAgICAgICAgQ0hVTktfSEVBREVSX1NJWkUpIDw8IDM7CgogICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAic2l6ZXMgJTNpICUzaSAtPiAlOWxsaSBzY29yZSBtYl9jb3VudCAlaSIsIGluZm8tPnYxX3NpemUsIGluZm8tPnY0X3NpemUsIChsb25nIGxvbmcgaW50KXJldCwgbWJfY291bnQpOwoKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICpzZXJyID0gMDsKI2VuZGlmCgogICAgc3dpdGNoKGluZm8tPm1vZGUpIHsKICAgIGNhc2UgTU9ERV9WMV9PTkxZOgogICAgICAgIC8vb25lIGJ5dGUgcGVyIE1CCiAgICAgICAgcmV0ICs9IHMtPmxhbWJkYSAqIDggKiBtYl9jb3VudDsKCi8vIHdoaWxlIGNhbGN1bGF0aW5nIHdlIGFzc3VtZSBhbGwgYmxvY2tzIGFyZSBFTkNfVjEKICAgICAgICBmb3IoeCA9IDA7IHggPCBtYl9jb3VudDsgeCsrKSB7CiAgICAgICAgICAgIG1iID0gJnMtPm1iW3hdOwogICAgICAgICAgICByZXQgKz0gRkZfTEFNQkRBX1NDQUxFICogbWItPnYxX2Vycm9yOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICAqc2VyciArPSBtYi0+djFfZXJyb3I7CiNlbmRpZgovLyB0aGlzIGZ1bmN0aW9uIGlzIG5ldmVyIGNhbGxlZCBmb3IgcmVwb3J0IGluIE1PREVfVjFfT05MWQovLyAgICAgICAgICAgIGlmKCFyZXBvcnQpCiAgICAgICAgICAgIG1iLT5iZXN0X2VuY29kaW5nID0gRU5DX1YxOwogICAgICAgIH0KCiAgICAgICAgYnJlYWs7CiAgICBjYXNlIE1PREVfVjFfVjQ6CiAgICAgICAgLy85IG9yIDMzIGJpdHMgcGVyIE1CCiAgICAgICAgaWYocmVwb3J0KSB7Ci8vIG5vIG1vdmVzIGJldHdlZW4gdGhlIGNvcnJlc3BvbmRpbmcgdHJhaW5pbmcgc2V0cyBhcmUgYWxsb3dlZAogICAgICAgICAgICAqdHJhaW5pbmdfc2V0X3YxX3NocnVuayA9ICp0cmFpbmluZ19zZXRfdjRfc2hydW5rID0gMDsKICAgICAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHgrKykgewogICAgICAgICAgICAgICAgaW50IG1iZXJyOwogICAgICAgICAgICAgICAgbWIgPSAmcy0+bWJbeF07CiAgICAgICAgICAgICAgICBpZihtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjEpCiAgICAgICAgICAgICAgICAgICAgc2NvcmUxID0gcy0+bGFtYmRhICogOSAgKyBGRl9MQU1CREFfU0NBTEUgKiAobWJlcnI9bWItPnYxX2Vycm9yKTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBzY29yZTEgPSBzLT5sYW1iZGEgKiAzMyArIEZGX0xBTUJEQV9TQ0FMRSAqIChtYmVycj1tYi0+djRfZXJyb3IpOwogICAgICAgICAgICAgICAgcmV0ICs9IHNjb3JlMTsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgICAgICpzZXJyICs9IG1iZXJyOwojZW5kaWYKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7IC8vIGZpbmQgYmVzdCBtb2RlIHBlciBibG9jawogICAgICAgICAgICBmb3IoeCA9IDA7IHggPCBtYl9jb3VudDsgeCsrKSB7CiAgICAgICAgICAgICAgICBtYiA9ICZzLT5tYlt4XTsKICAgICAgICAgICAgICAgIHNjb3JlMSA9IHMtPmxhbWJkYSAqIDkgICsgRkZfTEFNQkRBX1NDQUxFICogbWItPnYxX2Vycm9yOwogICAgICAgICAgICAgICAgc2NvcmUyID0gcy0+bGFtYmRhICogMzMgKyBGRl9MQU1CREFfU0NBTEUgKiBtYi0+djRfZXJyb3I7CgogICAgICAgICAgICAgICAgaWYoc2NvcmUxIDw9IHNjb3JlMikgewogICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTE7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnYxX2Vycm9yOwojZW5kaWYKICAgICAgICAgICAgICAgICAgICBtYi0+YmVzdF9lbmNvZGluZyA9IEVOQ19WMTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHNjb3JlMjsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+djRfZXJyb3I7CiNlbmRpZgogICAgICAgICAgICAgICAgICAgIG1iLT5iZXN0X2VuY29kaW5nID0gRU5DX1Y0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBicmVhazsKICAgIGNhc2UgTU9ERV9NQzoKICAgICAgICAvLzEsIDEwIG9yIDM0IGJpdHMgcGVyIE1CCiAgICAgICAgaWYocmVwb3J0KSB7CiAgICAgICAgICAgIGludCB2MV9zaHJ1bmsgPSAwLCB2NF9zaHJ1bmsgPSAwOwogICAgICAgICAgICBmb3IoeCA9IDA7IHggPCBtYl9jb3VudDsgeCsrKSB7CiAgICAgICAgICAgICAgICBtYiA9ICZzLT5tYlt4XTsKLy8gaXQgaXMgT0sgdG8gbW92ZSBibG9ja3MgdG8gRU5DX1NLSVAgaGVyZQovLyBidXQgbm90IHRvIGFueSBjb2RlYm9vayBlbmNvZGluZyEKICAgICAgICAgICAgICAgIHNjb3JlMSA9IHMtPmxhbWJkYSAqIDEgICsgRkZfTEFNQkRBX1NDQUxFICogbWItPnNraXBfZXJyb3I7CiAgICAgICAgICAgICAgICBpZihtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfU0tJUCkgewogICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTE7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnNraXBfZXJyb3I7CiNlbmRpZgogICAgICAgICAgICAgICAgfSBlbHNlIGlmKG1iLT5iZXN0X2VuY29kaW5nID09IEVOQ19WMSkgewogICAgICAgICAgICAgICAgICAgIGlmKChzY29yZTI9cy0+bGFtYmRhICogMTAgKyBGRl9MQU1CREFfU0NBTEUgKiBtYi0+djFfZXJyb3IpID49IHNjb3JlMSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYi0+YmVzdF9lbmNvZGluZyA9IEVOQ19TS0lQOwogICAgICAgICAgICAgICAgICAgICAgICArK3YxX3NocnVuazsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHNjb3JlMTsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnNraXBfZXJyb3I7CiNlbmRpZgogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTI7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgICAgICAgICAgICAgICpzZXJyICs9IG1iLT52MV9lcnJvcjsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZigoc2NvcmUzPXMtPmxhbWJkYSAqIDM0ICsgRkZfTEFNQkRBX1NDQUxFICogbWItPnY0X2Vycm9yKSA+PSBzY29yZTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWItPmJlc3RfZW5jb2RpbmcgPSBFTkNfU0tJUDsKICAgICAgICAgICAgICAgICAgICAgICAgKyt2NF9zaHJ1bms7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTE7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgICAgICAgICAgICAgICpzZXJyICs9IG1iLT5za2lwX2Vycm9yOwojZW5kaWYKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUzOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+djRfZXJyb3I7CiNlbmRpZgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqdHJhaW5pbmdfc2V0X3YxX3NocnVuayA9IHYxX3NocnVuazsKICAgICAgICAgICAgKnRyYWluaW5nX3NldF92NF9zaHJ1bmsgPSB2NF9zaHJ1bms7CiAgICAgICAgfSBlbHNlIHsgLy8gZmluZCBiZXN0IG1vZGUgcGVyIGJsb2NrCiAgICAgICAgICAgIGZvcih4ID0gMDsgeCA8IG1iX2NvdW50OyB4KyspIHsKICAgICAgICAgICAgICAgIG1iID0gJnMtPm1iW3hdOwogICAgICAgICAgICAgICAgc2NvcmUxID0gcy0+bGFtYmRhICogMSAgKyBGRl9MQU1CREFfU0NBTEUgKiBtYi0+c2tpcF9lcnJvcjsKICAgICAgICAgICAgICAgIHNjb3JlMiA9IHMtPmxhbWJkYSAqIDEwICsgRkZfTEFNQkRBX1NDQUxFICogbWItPnYxX2Vycm9yOwogICAgICAgICAgICAgICAgc2NvcmUzID0gcy0+bGFtYmRhICogMzQgKyBGRl9MQU1CREFfU0NBTEUgKiBtYi0+djRfZXJyb3I7CgogICAgICAgICAgICAgICAgaWYoc2NvcmUxIDw9IHNjb3JlMiAmJiBzY29yZTEgPD0gc2NvcmUzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHNjb3JlMTsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+c2tpcF9lcnJvcjsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgbWItPmJlc3RfZW5jb2RpbmcgPSBFTkNfU0tJUDsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZihzY29yZTIgPD0gc2NvcmUzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHNjb3JlMjsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+djFfZXJyb3I7CiNlbmRpZgogICAgICAgICAgICAgICAgICAgIG1iLT5iZXN0X2VuY29kaW5nID0gRU5DX1YxOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUzOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICAgICAgICAgICpzZXJyICs9IG1iLT52NF9lcnJvcjsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgbWItPmJlc3RfZW5jb2RpbmcgPSBFTkNfVjQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGJyZWFrOwogICAgfQoKICAgIHJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQgd3JpdGVfY2h1bmtfaGVhZGVyKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNodW5rX3R5cGUsIGludCBjaHVua19zaXplKQp7CiAgICBidWZbMF0gPSBjaHVua190eXBlOwogICAgQVZfV0IyNCgmYnVmWzFdLCBjaHVua19zaXplICsgQ0hVTktfSEVBREVSX1NJWkUpOwogICAgcmV0dXJuIENIVU5LX0hFQURFUl9TSVpFOwp9CgpzdGF0aWMgaW50IGVuY29kZV9jb2RlYm9vayhDaW5lcGFrRW5jQ29udGV4dCAqcywgaW50ICpjb2RlYm9vaywgaW50IHNpemUsIGludCBjaHVua190eXBlX3l1diwgaW50IGNodW5rX3R5cGVfZ3JheSwgdW5zaWduZWQgY2hhciAqYnVmKQp7CiAgICBpbnQgeCwgeSwgcmV0LCBlbnRyeV9zaXplID0gcy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNiA6IDQ7CiAgICBpbnQgaW5jcmVtZW50YWxfY29kZWJvb2tfcmVwbGFjZW1lbnRfbW9kZSA9IDA7IC8vIGhhcmRjb2RlZCBoZXJlLAogICAgICAgICAgICAgICAgLy8gdGhlIGNvbXBpbGVyIHNob3VsZCBub3RpY2UgdGhhdCB0aGlzIGlzIGEgY29uc3RhbnQgLS0gcmwKCiAgICByZXQgPSB3cml0ZV9jaHVua19oZWFkZXIoYnVmLAogICAgICAgICAgcy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8KICAgICAgICAgICBjaHVua190eXBlX3l1disoaW5jcmVtZW50YWxfY29kZWJvb2tfcmVwbGFjZW1lbnRfbW9kZT8xOjApIDoKICAgICAgICAgICBjaHVua190eXBlX2dyYXkrKGluY3JlbWVudGFsX2NvZGVib29rX3JlcGxhY2VtZW50X21vZGU/MTowKSwKICAgICAgICAgIGVudHJ5X3NpemUgKiBzaXplCiAgICAgICAgICAgKyAoaW5jcmVtZW50YWxfY29kZWJvb2tfcmVwbGFjZW1lbnRfbW9kZT8oc2l6ZSszMSkvMzIqNDowKSApOwoKLy8gd2UgZG8gY29kZWJvb2sgZW5jb2RpbmcgYWNjb3JkaW5nIHRvIHRoZSAiaW50cmEiIG1vZGUKLy8gYnV0IHdlIGtlZXAgdGhlICJkZWFkIiBjb2RlIGZvciByZWZlcmVuY2UgaW4gY2FzZSB3ZSB3aWxsIHdhbnQKLy8gdG8gdXNlIGluY3JlbWVudGFsIGNvZGVib29rIHVwZGF0ZXMgKHdoaWNoIGFjdHVhbGx5IHdvdWxkIGdpdmUgdXMKLy8gImtpbmQgb2YiIG1vdGlvbiBjb21wZW5zYXRpb24sIGVzcGVjaWFsbHkgaW4gMSBzdHJpcC9mcmFtZSBjYXNlKSAtLSBybAovLyAob2YgY291cnNlLCB0aGUgY29kZSB3aWxsIGJlIG5vdCB1c2VmdWwgYXMtaXMpCiAgICBpZihpbmNyZW1lbnRhbF9jb2RlYm9va19yZXBsYWNlbWVudF9tb2RlKSB7CiAgICAgICAgaW50IGZsYWdzID0gMDsKICAgICAgICBpbnQgZmxhZ3NpbmQ7CiAgICAgICAgZm9yKHggPSAwOyB4IDwgc2l6ZTsgeCsrKSB7CiAgICAgICAgICAgIGlmKGZsYWdzID09IDApIHsKICAgICAgICAgICAgICAgIGZsYWdzaW5kID0gcmV0OwogICAgICAgICAgICAgICAgcmV0ICs9IDQ7CiAgICAgICAgICAgICAgICBmbGFncyA9IDB4ODAwMDAwMDA7CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgZmxhZ3MgPSAoKGZsYWdzPj4xKSB8IDB4ODAwMDAwMDApOwogICAgICAgICAgICBmb3IoeSA9IDA7IHkgPCBlbnRyeV9zaXplOyB5KyspCiAgICAgICAgICAgICAgICBidWZbcmV0KytdID0gY29kZWJvb2tbeSArIHgqZW50cnlfc2l6ZV0gXiAoeSA+PSA0ID8gMHg4MCA6IDApOwogICAgICAgICAgICBpZigoZmxhZ3MmMHhmZmZmZmZmZikgPT0gMHhmZmZmZmZmZikgewogICAgICAgICAgICAgICAgQVZfV0IzMigmYnVmW2ZsYWdzaW5kXSwgZmxhZ3MpOwogICAgICAgICAgICAgICAgZmxhZ3MgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmKGZsYWdzKQogICAgICAgICAgICBBVl9XQjMyKCZidWZbZmxhZ3NpbmRdLCBmbGFncyk7CiAgICB9IGVsc2UKICAgICAgICBmb3IoeCA9IDA7IHggPCBzaXplOyB4KyspCiAgICAgICAgICAgIGZvcih5ID0gMDsgeSA8IGVudHJ5X3NpemU7IHkrKykKICAgICAgICAgICAgICAgIGJ1ZltyZXQrK10gPSBjb2RlYm9va1t5ICsgeCplbnRyeV9zaXplXSBeICh5ID49IDQgPyAweDgwIDogMCk7CgogICAgcmV0dXJuIHJldDsKfQoKLy9zZXRzIG91dCB0byB0aGUgc3ViIHBpY3R1cmUgc3RhcnRpbmcgYXQgKHgseSkgaW4gaW4Kc3RhdGljIHZvaWQgZ2V0X3N1Yl9waWN0dXJlKENpbmVwYWtFbmNDb250ZXh0ICpzLCBpbnQgeCwgaW50IHksIEFWUGljdHVyZSAqaW4sIEFWUGljdHVyZSAqb3V0KQp7CiAgICBvdXQtPmRhdGFbMF0gPSBpbi0+ZGF0YVswXSArIHggKyB5ICogaW4tPmxpbmVzaXplWzBdOwogICAgb3V0LT5saW5lc2l6ZVswXSA9IGluLT5saW5lc2l6ZVswXTsKCiAgICBpZihzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpIHsKICAgICAgICBvdXQtPmRhdGFbMV0gPSBpbi0+ZGF0YVsxXSArICh4ID4+IDEpICsgKHkgPj4gMSkgKiBpbi0+bGluZXNpemVbMV07CiAgICAgICAgb3V0LT5saW5lc2l6ZVsxXSA9IGluLT5saW5lc2l6ZVsxXTsKCiAgICAgICAgb3V0LT5kYXRhWzJdID0gaW4tPmRhdGFbMl0gKyAoeCA+PiAxKSArICh5ID4+IDEpICogaW4tPmxpbmVzaXplWzJdOwogICAgICAgIG91dC0+bGluZXNpemVbMl0gPSBpbi0+bGluZXNpemVbMl07CiAgICB9Cn0KCi8vZGVjb2RlcyB0aGUgVjEgdmVjdG9yIGluIG1iIGludG8gdGhlIDR4NCBNQiBwb2ludGVkIHRvIGJ5IHN1Yl9waWN0CnN0YXRpYyB2b2lkIGRlY29kZV92MV92ZWN0b3IoQ2luZXBha0VuY0NvbnRleHQgKnMsIEFWUGljdHVyZSAqc3ViX3BpY3QsIGludCB2MV92ZWN0b3IsIHN0cmlwX2luZm8gKmluZm8pCnsKICAgIGludCBlbnRyeV9zaXplID0gcy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNiA6IDQ7CgogICAgc3ViX3BpY3QtPmRhdGFbMF1bMF0gPQogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVswXVsxXSA9CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdWyAgICBzdWJfcGljdC0+bGluZXNpemVbMF1dID0KICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMF1bMSsgIHN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPSBpbmZvLT52MV9jb2RlYm9va1t2MV92ZWN0b3IqZW50cnlfc2l6ZV07CgogICAgc3ViX3BpY3QtPmRhdGFbMF1bMl0gPQogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVswXVszXSA9CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdWzIrICBzdWJfcGljdC0+bGluZXNpemVbMF1dID0KICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMF1bMysgIHN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPSBpbmZvLT52MV9jb2RlYm9va1t2MV92ZWN0b3IqZW50cnlfc2l6ZSsxXTsKCiAgICBzdWJfcGljdC0+ZGF0YVswXVsyKnN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPQogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVswXVsxKzIqc3ViX3BpY3QtPmxpbmVzaXplWzBdXSA9CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdWyAgMypzdWJfcGljdC0+bGluZXNpemVbMF1dID0KICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMF1bMSszKnN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPSBpbmZvLT52MV9jb2RlYm9va1t2MV92ZWN0b3IqZW50cnlfc2l6ZSsyXTsKCiAgICBzdWJfcGljdC0+ZGF0YVswXVsyKzIqc3ViX3BpY3QtPmxpbmVzaXplWzBdXSA9CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdWzMrMipzdWJfcGljdC0+bGluZXNpemVbMF1dID0KICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMF1bMiszKnN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPQogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVswXVszKzMqc3ViX3BpY3QtPmxpbmVzaXplWzBdXSA9IGluZm8tPnYxX2NvZGVib29rW3YxX3ZlY3RvciplbnRyeV9zaXplKzNdOwoKICAgIGlmKHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkgewogICAgICAgIHN1Yl9waWN0LT5kYXRhWzFdWzBdID0KICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMV1bMV0gPQogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVsxXVsgICAgc3ViX3BpY3QtPmxpbmVzaXplWzFdXSA9CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzFdWzErICBzdWJfcGljdC0+bGluZXNpemVbMV1dID0gaW5mby0+djFfY29kZWJvb2tbdjFfdmVjdG9yKmVudHJ5X3NpemUrNF07CgogICAgICAgIHN1Yl9waWN0LT5kYXRhWzJdWzBdID0KICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMl1bMV0gPQogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVsyXVsgICAgc3ViX3BpY3QtPmxpbmVzaXplWzJdXSA9CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzJdWzErICBzdWJfcGljdC0+bGluZXNpemVbMl1dID0gaW5mby0+djFfY29kZWJvb2tbdjFfdmVjdG9yKmVudHJ5X3NpemUrNV07CiAgICB9Cn0KCi8vZGVjb2RlcyB0aGUgVjQgdmVjdG9ycyBpbiBtYiBpbnRvIHRoZSA0eDQgTUIgcG9pbnRlZCB0byBieSBzdWJfcGljdApzdGF0aWMgdm9pZCBkZWNvZGVfdjRfdmVjdG9yKENpbmVwYWtFbmNDb250ZXh0ICpzLCBBVlBpY3R1cmUgKnN1Yl9waWN0LCBpbnQgKnY0X3ZlY3Rvciwgc3RyaXBfaW5mbyAqaW5mbykKewogICAgaW50IGksIHgsIHksIGVudHJ5X3NpemUgPSBzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA2IDogNDsKCiAgICBmb3IoaSA9IHkgPSAwOyB5IDwgNDsgeSArPSAyKSB7CiAgICAgICAgZm9yKHggPSAwOyB4IDwgNDsgeCArPSAyLCBpKyspIHsKICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMF1beCAgICsgICAgIHkqc3ViX3BpY3QtPmxpbmVzaXplWzBdXSA9IGluZm8tPnY0X2NvZGVib29rW3Y0X3ZlY3RvcltpXSplbnRyeV9zaXplXTsKICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMF1beCsxICsgICAgIHkqc3ViX3BpY3QtPmxpbmVzaXplWzBdXSA9IGluZm8tPnY0X2NvZGVib29rW3Y0X3ZlY3RvcltpXSplbnRyeV9zaXplKzFdOwogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVswXVt4ICAgKyAoeSsxKSpzdWJfcGljdC0+bGluZXNpemVbMF1dID0gaW5mby0+djRfY29kZWJvb2tbdjRfdmVjdG9yW2ldKmVudHJ5X3NpemUrMl07CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdW3grMSArICh5KzEpKnN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPSBpbmZvLT52NF9jb2RlYm9va1t2NF92ZWN0b3JbaV0qZW50cnlfc2l6ZSszXTsKCiAgICAgICAgICAgIGlmKHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkgewogICAgICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMV1bKHg+PjEpICsgKHk+PjEpKnN1Yl9waWN0LT5saW5lc2l6ZVsxXV0gPSBpbmZvLT52NF9jb2RlYm9va1t2NF92ZWN0b3JbaV0qZW50cnlfc2l6ZSs0XTsKICAgICAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzJdWyh4Pj4xKSArICh5Pj4xKSpzdWJfcGljdC0+bGluZXNpemVbMl1dID0gaW5mby0+djRfY29kZWJvb2tbdjRfdmVjdG9yW2ldKmVudHJ5X3NpemUrNV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyB2b2lkIGNvcHlfbWIoQ2luZXBha0VuY0NvbnRleHQgKnMsIEFWUGljdHVyZSAqYSwgQVZQaWN0dXJlICpiKQp7CiAgICBpbnQgeSwgcDsKCiAgICBmb3IoeSA9IDA7IHkgPCBNQl9TSVpFOyB5KyspIHsKICAgICAgICBtZW1jcHkoYS0+ZGF0YVswXSt5KmEtPmxpbmVzaXplWzBdLCBiLT5kYXRhWzBdK3kqYi0+bGluZXNpemVbMF0sCiAgICAgICAgICAgICAgIE1CX1NJWkUpOwogICAgfQoKICAgIGlmKHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkgewogICAgICAgIGZvcihwID0gMTsgcCA8PSAyOyBwKyspIHsKICAgICAgICAgICAgZm9yKHkgPSAwOyB5IDwgTUJfU0laRS8yOyB5KyspIHsKICAgICAgICAgICAgICAgIG1lbWNweShhLT5kYXRhW3BdICsgeSphLT5saW5lc2l6ZVtwXSwKICAgICAgICAgICAgICAgICAgICAgICBiLT5kYXRhW3BdICsgeSpiLT5saW5lc2l6ZVtwXSwKICAgICAgICAgICAgICAgICAgICAgICBNQl9TSVpFLzIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgaW50IGVuY29kZV9tb2RlKENpbmVwYWtFbmNDb250ZXh0ICpzLCBpbnQgaCwgQVZQaWN0dXJlICpzY3JhdGNoX3BpY3QsIEFWUGljdHVyZSAqbGFzdF9waWN0LCBzdHJpcF9pbmZvICppbmZvLCB1bnNpZ25lZCBjaGFyICpidWYpCnsKICAgIGludCB4LCB5LCB6LCBmbGFncywgYml0cywgdGVtcF9zaXplLCBoZWFkZXJfb2ZzLCByZXQgPSAwLCBtYl9jb3VudCA9IHMtPncgKiBoIC8gTUJfQVJFQTsKICAgIGludCBuZWVkc19leHRyYV9iaXQsIHNob3VsZF93cml0ZV90ZW1wOwogICAgdW5zaWduZWQgY2hhciB0ZW1wWzY0XTsgLy8zMi8yID0gMTYgVjQgYmxvY2tzIGF0IDQgQiBlYWNoIC0+IDY0IEIKICAgIG1iX2luZm8gKm1iOwogICAgQVZQaWN0dXJlIHN1Yl9zY3JhdGNoID0ge3swfX0sIHN1Yl9sYXN0ID0ge3swfX07CgogICAgLy9lbmNvZGUgY29kZWJvb2tzCi8vLy8vLyBNYWNPUyB2aW50YWdlIGRlY29kZXIgY29tcGF0aWJpbGl0eSBkaWN0YXRlcyB0aGUgcHJlc2VuY2Ugb2YKLy8vLy8vIHRoZSBjb2RlYm9vayBjaHVuayBldmVuIHdoZW4gdGhlIGNvZGVib29rIGlzIGVtcHR5IC0gcHJldHR5IGR1bWIuLi4KLy8vLy8vIGFuZCBhbHNvIHRoZSBjZXJ0YWluIG9yZGVyIG9mIHRoZSBjb2RlYm9vayBjaHVua3MgLS0gcmwKICAgIGlmKGluZm8tPnY0X3NpemUgfHwgIXMtPnNraXBfZW1wdHlfY2IpCiAgICAgICAgcmV0ICs9IGVuY29kZV9jb2RlYm9vayhzLCBpbmZvLT52NF9jb2RlYm9vaywgaW5mby0+djRfc2l6ZSwgMHgyMCwgMHgyNCwgYnVmICsgcmV0KTsKCiAgICBpZihpbmZvLT52MV9zaXplIHx8ICFzLT5za2lwX2VtcHR5X2NiKQogICAgICAgIHJldCArPSBlbmNvZGVfY29kZWJvb2socywgaW5mby0+djFfY29kZWJvb2ssIGluZm8tPnYxX3NpemUsIDB4MjIsIDB4MjYsIGJ1ZiArIHJldCk7CgogICAgLy91cGRhdGUgc2NyYXRjaCBwaWN0dXJlCiAgICBmb3IoeiA9IHkgPSAwOyB5IDwgaDsgeSArPSBNQl9TSVpFKSB7CiAgICAgICAgZm9yKHggPSAwOyB4IDwgcy0+dzsgeCArPSBNQl9TSVpFLCB6KyspIHsKICAgICAgICAgICAgbWIgPSAmcy0+bWJbel07CgogICAgICAgICAgICBnZXRfc3ViX3BpY3R1cmUocywgeCwgeSwgc2NyYXRjaF9waWN0LCAmc3ViX3NjcmF0Y2gpOwoKICAgICAgICAgICAgaWYoaW5mby0+bW9kZSA9PSBNT0RFX01DICYmIG1iLT5iZXN0X2VuY29kaW5nID09IEVOQ19TS0lQKSB7CiAgICAgICAgICAgICAgICBnZXRfc3ViX3BpY3R1cmUocywgeCwgeSwgbGFzdF9waWN0LCAmc3ViX2xhc3QpOwogICAgICAgICAgICAgICAgY29weV9tYihzLCAmc3ViX3NjcmF0Y2gsICZzdWJfbGFzdCk7CiAgICAgICAgICAgIH0gZWxzZSBpZihpbmZvLT5tb2RlID09IE1PREVfVjFfT05MWSB8fCBtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjEpCiAgICAgICAgICAgICAgICBkZWNvZGVfdjFfdmVjdG9yKHMsICZzdWJfc2NyYXRjaCwgbWItPnYxX3ZlY3RvciwgaW5mbyk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGRlY29kZV92NF92ZWN0b3IocywgJnN1Yl9zY3JhdGNoLCBtYi0+djRfdmVjdG9yLCBpbmZvKTsKICAgICAgICB9CiAgICB9CgogICAgc3dpdGNoKGluZm8tPm1vZGUpIHsKICAgIGNhc2UgTU9ERV9WMV9PTkxZOgogICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIm1iX2NvdW50ID0gJWlcbiIsIG1iX2NvdW50KTsKICAgICAgICByZXQgKz0gd3JpdGVfY2h1bmtfaGVhZGVyKGJ1ZiArIHJldCwgMHgzMiwgbWJfY291bnQpOwoKICAgICAgICBmb3IoeCA9IDA7IHggPCBtYl9jb3VudDsgeCsrKQogICAgICAgICAgICBidWZbcmV0KytdID0gcy0+bWJbeF0udjFfdmVjdG9yOwoKICAgICAgICBicmVhazsKICAgIGNhc2UgTU9ERV9WMV9WNDoKICAgICAgICAvL3JlbWVtYmVyIGhlYWRlciBwb3NpdGlvbgogICAgICAgIGhlYWRlcl9vZnMgPSByZXQ7CiAgICAgICAgcmV0ICs9IENIVU5LX0hFQURFUl9TSVpFOwoKICAgICAgICBmb3IoeCA9IDA7IHggPCBtYl9jb3VudDsgeCArPSAzMikgewogICAgICAgICAgICBmbGFncyA9IDA7CiAgICAgICAgICAgIGZvcih5ID0geDsgeSA8IEZGTUlOKHgrMzIsIG1iX2NvdW50KTsgeSsrKQogICAgICAgICAgICAgICAgaWYocy0+bWJbeV0uYmVzdF9lbmNvZGluZyA9PSBFTkNfVjQpCiAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gMSA8PCAoMzEgLSB5ICsgeCk7CgogICAgICAgICAgICBBVl9XQjMyKCZidWZbcmV0XSwgZmxhZ3MpOwogICAgICAgICAgICByZXQgKz0gNDsKCiAgICAgICAgICAgIGZvcih5ID0geDsgeSA8IEZGTUlOKHgrMzIsIG1iX2NvdW50KTsgeSsrKSB7CiAgICAgICAgICAgICAgICBtYiA9ICZzLT5tYlt5XTsKCiAgICAgICAgICAgICAgICBpZihtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjEpCiAgICAgICAgICAgICAgICAgICAgYnVmW3JldCsrXSA9IG1iLT52MV92ZWN0b3I7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgZm9yKHogPSAwOyB6IDwgNDsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICBidWZbcmV0KytdID0gbWItPnY0X3ZlY3Rvclt6XTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgd3JpdGVfY2h1bmtfaGVhZGVyKGJ1ZiArIGhlYWRlcl9vZnMsIDB4MzAsIHJldCAtIGhlYWRlcl9vZnMgLSBDSFVOS19IRUFERVJfU0laRSk7CgogICAgICAgIGJyZWFrOwogICAgY2FzZSBNT0RFX01DOgogICAgICAgIC8vcmVtZW1iZXIgaGVhZGVyIHBvc2l0aW9uCiAgICAgICAgaGVhZGVyX29mcyA9IHJldDsKICAgICAgICByZXQgKz0gQ0hVTktfSEVBREVSX1NJWkU7CiAgICAgICAgZmxhZ3MgPSBiaXRzID0gdGVtcF9zaXplID0gMDsKCiAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHgrKykgewogICAgICAgICAgICBtYiA9ICZzLT5tYlt4XTsKICAgICAgICAgICAgZmxhZ3MgfD0gKG1iLT5iZXN0X2VuY29kaW5nICE9IEVOQ19TS0lQKSA8PCAoMzEgLSBiaXRzKyspOwogICAgICAgICAgICBuZWVkc19leHRyYV9iaXQgPSAwOwogICAgICAgICAgICBzaG91bGRfd3JpdGVfdGVtcCA9IDA7CgogICAgICAgICAgICBpZihtYi0+YmVzdF9lbmNvZGluZyAhPSBFTkNfU0tJUCkgewogICAgICAgICAgICAgICAgaWYoYml0cyA8IDMyKQogICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IChtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjQpIDw8ICgzMSAtIGJpdHMrKyk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgbmVlZHNfZXh0cmFfYml0ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoYml0cyA9PSAzMikgewogICAgICAgICAgICAgICAgQVZfV0IzMigmYnVmW3JldF0sIGZsYWdzKTsKICAgICAgICAgICAgICAgIHJldCArPSA0OwogICAgICAgICAgICAgICAgZmxhZ3MgPSBiaXRzID0gMDsKCiAgICAgICAgICAgICAgICBpZihtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfU0tJUCB8fCBuZWVkc19leHRyYV9iaXQpIHsKICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJmJ1ZltyZXRdLCB0ZW1wLCB0ZW1wX3NpemUpOwogICAgICAgICAgICAgICAgICAgIHJldCArPSB0ZW1wX3NpemU7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9zaXplID0gMDsKICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgIHNob3VsZF93cml0ZV90ZW1wID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYobmVlZHNfZXh0cmFfYml0KSB7CiAgICAgICAgICAgICAgICBmbGFncyA9IChtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjQpIDw8IDMxOwogICAgICAgICAgICAgICAgYml0cyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKG1iLT5iZXN0X2VuY29kaW5nID09IEVOQ19WMSkKICAgICAgICAgICAgICAgIHRlbXBbdGVtcF9zaXplKytdID0gbWItPnYxX3ZlY3RvcjsKICAgICAgICAgICAgZWxzZSBpZihtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjQpCiAgICAgICAgICAgICAgICBmb3IoeiA9IDA7IHogPCA0OyB6KyspCiAgICAgICAgICAgICAgICAgICAgdGVtcFt0ZW1wX3NpemUrK10gPSBtYi0+djRfdmVjdG9yW3pdOwoKICAgICAgICAgICAgaWYoc2hvdWxkX3dyaXRlX3RlbXApIHsKICAgICAgICAgICAgICAgIG1lbWNweSgmYnVmW3JldF0sIHRlbXAsIHRlbXBfc2l6ZSk7CiAgICAgICAgICAgICAgICByZXQgKz0gdGVtcF9zaXplOwogICAgICAgICAgICAgICAgdGVtcF9zaXplID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYoYml0cyA+IDApIHsKICAgICAgICAgICAgQVZfV0IzMigmYnVmW3JldF0sIGZsYWdzKTsKICAgICAgICAgICAgcmV0ICs9IDQ7CiAgICAgICAgICAgIG1lbWNweSgmYnVmW3JldF0sIHRlbXAsIHRlbXBfc2l6ZSk7CiAgICAgICAgICAgIHJldCArPSB0ZW1wX3NpemU7CiAgICAgICAgfQoKICAgICAgICB3cml0ZV9jaHVua19oZWFkZXIoYnVmICsgaGVhZGVyX29mcywgMHgzMSwgcmV0IC0gaGVhZGVyX29mcyAtIENIVU5LX0hFQURFUl9TSVpFKTsKCiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIHJldDsKfQoKLy9jb21wdXRlcyBkaXN0b3J0aW9uIG9mIDR4NCBNQiBpbiBiIGNvbXBhcmVkIHRvIGEKc3RhdGljIGludCBjb21wdXRlX21iX2Rpc3RvcnRpb24oQ2luZXBha0VuY0NvbnRleHQgKnMsIEFWUGljdHVyZSAqYSwgQVZQaWN0dXJlICpiKQp7CiAgICBpbnQgeCwgeSwgcCwgZCwgcmV0ID0gMDsKCiAgICBmb3IoeSA9IDA7IHkgPCBNQl9TSVpFOyB5KyspIHsKICAgICAgICBmb3IoeCA9IDA7IHggPCBNQl9TSVpFOyB4KyspIHsKICAgICAgICAgICAgZCA9IGEtPmRhdGFbMF1beCArIHkqYS0+bGluZXNpemVbMF1dIC0gYi0+ZGF0YVswXVt4ICsgeSpiLT5saW5lc2l6ZVswXV07CiAgICAgICAgICAgIHJldCArPSBkKmQ7CiAgICAgICAgfQogICAgfQoKICAgIGlmKHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkgewogICAgICAgIGZvcihwID0gMTsgcCA8PSAyOyBwKyspIHsKICAgICAgICAgICAgZm9yKHkgPSAwOyB5IDwgTUJfU0laRS8yOyB5KyspIHsKICAgICAgICAgICAgICAgIGZvcih4ID0gMDsgeCA8IE1CX1NJWkUvMjsgeCsrKSB7CiAgICAgICAgICAgICAgICAgICAgZCA9IGEtPmRhdGFbcF1beCArIHkqYS0+bGluZXNpemVbcF1dIC0gYi0+ZGF0YVtwXVt4ICsgeSpiLT5saW5lc2l6ZVtwXV07CiAgICAgICAgICAgICAgICAgICAgcmV0ICs9IGQqZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gcmV0Owp9CgovLyByZXR1cm4gdGhlIHBvc3NpYmx5IGFkanVzdGVkIHNpemUgb2YgdGhlIGNvZGVib29rCiNkZWZpbmUgQ0VSVEFJTih4KSAoKHgpIT1FTkNfVU5DRVJUQUlOKQpzdGF0aWMgaW50IHF1YW50aXplKENpbmVwYWtFbmNDb250ZXh0ICpzLCBpbnQgaCwgQVZQaWN0dXJlICpwaWN0LAogICAgICAgICAgICAgICAgICAgIGludCB2MW1vZGUsIHN0cmlwX2luZm8gKmluZm8sCiAgICAgICAgICAgICAgICAgICAgbWJfZW5jb2RpbmcgZW5jb2RpbmcpCnsKICAgIGludCB4LCB5LCBpLCBqLCBrLCB4MiwgeTIsIHgzLCB5MywgcGxhbmUsIHNoaWZ0LCBtYm47CiAgICBpbnQgZW50cnlfc2l6ZSA9IHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/IDYgOiA0OwogICAgaW50ICpjb2RlYm9vayA9IHYxbW9kZSA/IGluZm8tPnYxX2NvZGVib29rIDogaW5mby0+djRfY29kZWJvb2s7CiAgICBpbnQgc2l6ZSA9IHYxbW9kZSA/IGluZm8tPnYxX3NpemUgOiBpbmZvLT52NF9zaXplOwogICAgaW50NjRfdCB0b3RhbF9lcnJvciA9IDA7CiAgICB1aW50OF90IHZxX3BpY3RfYnVmWyhNQl9BUkVBKjMpLzJdOwogICAgQVZQaWN0dXJlIHN1Yl9waWN0LCB2cV9waWN0OwoKICAgIGZvcihtYm4gPSBpID0geSA9IDA7IHkgPCBoOyB5ICs9IE1CX1NJWkUpIHsKICAgICAgICBmb3IoeCA9IDA7IHggPCBzLT53OyB4ICs9IE1CX1NJWkUsICsrbWJuKSB7CiAgICAgICAgICAgIGludCAqYmFzZTsKCiAgICAgICAgICAgIGlmKENFUlRBSU4oZW5jb2RpbmcpKSB7Ci8vIHVzZSBmb3IgdGhlIHRyYWluaW5nIG9ubHkgdGhlIGJsb2NrcyBrbm93biB0byBiZSB0byBiZSBlbmNvZGVkIFtzaWM6LV0KICAgICAgICAgICAgICAgaWYocy0+bWJbbWJuXS5iZXN0X2VuY29kaW5nICE9IGVuY29kaW5nKSBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYmFzZSA9IHMtPmNvZGVib29rX2lucHV0ICsgaSplbnRyeV9zaXplOwogICAgICAgICAgICBpZih2MW1vZGUpIHsKICAgICAgICAgICAgICAgIC8vc3Vic2FtcGxlCiAgICAgICAgICAgICAgICBmb3IoaiA9IHkyID0gMDsgeTIgPCBlbnRyeV9zaXplOyB5MiArPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yKHgyID0gMDsgeDIgPCA0OyB4MiArPSAyLCBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmUgPSB5MiA8IDQgPyAwIDogMSArICh4MiA+PiAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSB5MiA8IDQgPyAwIDogMTsKICAgICAgICAgICAgICAgICAgICAgICAgeDMgPSBzaGlmdCA/IDAgOiB4MjsKICAgICAgICAgICAgICAgICAgICAgICAgeTMgPSBzaGlmdCA/IDAgOiB5MjsKICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVtqXSA9IChwaWN0LT5kYXRhW3BsYW5lXVsoKHgreDMpID4+IHNoaWZ0KSArICAgICAgKCh5K3kzKSA+PiBzaGlmdCkgICAgICAqIHBpY3QtPmxpbmVzaXplW3BsYW5lXV0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3QtPmRhdGFbcGxhbmVdWygoeCt4MykgPj4gc2hpZnQpICsgMSArICAoKHkreTMpID4+IHNoaWZ0KSAgICAgICogcGljdC0+bGluZXNpemVbcGxhbmVdXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdC0+ZGF0YVtwbGFuZV1bKCh4K3gzKSA+PiBzaGlmdCkgKyAgICAgKCgoeSt5MykgPj4gc2hpZnQpICsgMSkgKiBwaWN0LT5saW5lc2l6ZVtwbGFuZV1dICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0LT5kYXRhW3BsYW5lXVsoKHgreDMpID4+IHNoaWZ0KSArIDEgKyAoKCh5K3kzKSA+PiBzaGlmdCkgKyAxKSAqIHBpY3QtPmxpbmVzaXplW3BsYW5lXV0pID4+IDI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy9jb3B5CiAgICAgICAgICAgICAgICBmb3IoaiA9IHkyID0gMDsgeTIgPCBNQl9TSVpFOyB5MiArPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yKHgyID0gMDsgeDIgPCBNQl9TSVpFOyB4MiArPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IGVudHJ5X3NpemU7IGsrKywgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZSA9IGsgPj0gNCA/IGsgLSAzIDogMDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihrID49IDQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MyA9ICh4K3gyKSA+PiAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkzID0gKHkreTIpID4+IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgzID0geCArIHgyICsgKGsgJiAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MyA9IHkgKyB5MiArIChrID4+IDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2Vbal0gPSBwaWN0LT5kYXRhW3BsYW5lXVt4MyArIHkzKnBpY3QtPmxpbmVzaXplW3BsYW5lXV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaSArPSB2MW1vZGUgPyAxIDogNDsKICAgICAgICB9CiAgICB9Ci8vICAgIGlmKGkgPCBtYm4qKHYxbW9kZSA/IDEgOiA0KSkgewovLyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgInJlZHVjaW5nIHRyYWluaW5nIHNldCBmb3IgJXMgZnJvbSAlaSB0byAlaSAoZW5jb2RpbmcgJWkpXG4iLCB2MW1vZGU/InYxIjoidjQiLCBtYm4qKHYxbW9kZSA/IDEgOiA0KSwgaSwgZW5jb2RpbmcpOwovLyAgICB9CgogICAgaWYoaSA9PSAwKSAvLyBlbXB0eSB0cmFpbmluZyBzZXQsIG5vdGhpbmcgdG8gZG8KICAgICAgICByZXR1cm4gMDsKICAgIGlmKGkgPCBzaXplKSB7CiAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIChDRVJUQUlOKGVuY29kaW5nKSA/IEFWX0xPR19FUlJPUiA6IEFWX0xPR19JTkZPKSwgIldPVUxEIFdBU1RFOiAlcyBjYnNpemUgJWkgYmlnZ2VyIHRoYW4gdHJhaW5pbmcgc2V0IHNpemUgJWkgKGVuY29kaW5nICVpKVxuIiwgdjFtb2RlPyJ2MSI6InY0Iiwgc2l6ZSwgaSwgZW5jb2RpbmcpOwogICAgICAgIHNpemUgPSBpOwogICAgfQoKICAgIGF2cHJpdl9pbml0X2VsYmcocy0+Y29kZWJvb2tfaW5wdXQsIGVudHJ5X3NpemUsIGksIGNvZGVib29rLCBzaXplLCAxLCBzLT5jb2RlYm9va19jbG9zZXN0LCAmcy0+cmFuZGN0eCk7CiAgICBhdnByaXZfZG9fZWxiZyhzLT5jb2RlYm9va19pbnB1dCwgZW50cnlfc2l6ZSwgaSwgY29kZWJvb2ssIHNpemUsIDEsIHMtPmNvZGVib29rX2Nsb3Nlc3QsICZzLT5yYW5kY3R4KTsKCiAgICAvL3NldHVwIHZxX3BpY3QsIHdoaWNoIGNvbnRhaW5zIGEgc2luZ2xlIE1CCiAgICB2cV9waWN0LmRhdGFbMF0gPSB2cV9waWN0X2J1ZjsKICAgIHZxX3BpY3QubGluZXNpemVbMF0gPSBNQl9TSVpFOwogICAgdnFfcGljdC5kYXRhWzFdID0gJnZxX3BpY3RfYnVmW01CX0FSRUFdOwogICAgdnFfcGljdC5kYXRhWzJdID0gdnFfcGljdC5kYXRhWzFdICsgKE1CX0FSRUEgPj4gMik7CiAgICB2cV9waWN0LmxpbmVzaXplWzFdID0gdnFfcGljdC5saW5lc2l6ZVsyXSA9IE1CX1NJWkUgPj4gMTsKCiAgICAvL2NvcHkgaW5kaWNlcwogICAgZm9yKGkgPSBqID0geSA9IDA7IHkgPCBoOyB5ICs9IE1CX1NJWkUpIHsKICAgICAgICBmb3IoeCA9IDA7IHggPCBzLT53OyB4ICs9IE1CX1NJWkUsIGorKykgewogICAgICAgICAgICBtYl9pbmZvICptYiA9ICZzLT5tYltqXTsKLy8gc2tpcCB1bmludGVyZXN0aW5nIGJsb2NrcyBpZiB3ZSBrbm93IHRoZWlyIHByZWZlcnJlZCBlbmNvZGluZwogICAgICAgICAgICBpZihDRVJUQUlOKGVuY29kaW5nKSAmJiBtYi0+YmVzdF9lbmNvZGluZyAhPSBlbmNvZGluZykKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgLy9wb2ludCBzdWJfcGljdCB0byBjdXJyZW50IE1CCiAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCB4LCB5LCBwaWN0LCAmc3ViX3BpY3QpOwoKICAgICAgICAgICAgaWYodjFtb2RlKSB7CiAgICAgICAgICAgICAgICBtYi0+djFfdmVjdG9yID0gcy0+Y29kZWJvb2tfY2xvc2VzdFtpXTsKCiAgICAgICAgICAgICAgICAvL2ZpbGwgaW4gdnFfcGljdCB3aXRoIFYxIGRhdGEKICAgICAgICAgICAgICAgIGRlY29kZV92MV92ZWN0b3IocywgJnZxX3BpY3QsIG1iLT52MV92ZWN0b3IsIGluZm8pOwoKICAgICAgICAgICAgICAgIG1iLT52MV9lcnJvciA9IGNvbXB1dGVfbWJfZGlzdG9ydGlvbihzLCAmc3ViX3BpY3QsICZ2cV9waWN0KTsKICAgICAgICAgICAgICAgIHRvdGFsX2Vycm9yICs9IG1iLT52MV9lcnJvcjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IDQ7IGsrKykKICAgICAgICAgICAgICAgICAgICBtYi0+djRfdmVjdG9yW2tdID0gcy0+Y29kZWJvb2tfY2xvc2VzdFtpK2tdOwoKICAgICAgICAgICAgICAgIC8vZmlsbCBpbiB2cV9waWN0IHdpdGggVjQgZGF0YQogICAgICAgICAgICAgICAgZGVjb2RlX3Y0X3ZlY3RvcihzLCAmdnFfcGljdCwgbWItPnY0X3ZlY3RvciwgaW5mbyk7CgogICAgICAgICAgICAgICAgbWItPnY0X2Vycm9yID0gY29tcHV0ZV9tYl9kaXN0b3J0aW9uKHMsICZzdWJfcGljdCwgJnZxX3BpY3QpOwogICAgICAgICAgICAgICAgdG90YWxfZXJyb3IgKz0gbWItPnY0X2Vycm9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGkgKz0gdjFtb2RlID8gMSA6IDQ7CiAgICAgICAgfQogICAgfQovLyBjaGVjayB0aGF0IHdlIGRpZCBpdCByaWdodCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmdW5jdGlvbgogICAgYXZfYXNzZXJ0MChpID49IHNpemUpOyAvLyB0cmFpbmluZyBzZXQgaXMgbm8gc21hbGxlciB0aGFuIHRoZSBjb2RlYm9vawoKICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgImlzdjEgJWkgc2l6ZT0gJWkgaT0gJWkgZXJyb3IgJWxsaVxuIiwgdjFtb2RlLCBzaXplLCBpLCAobG9uZyBsb25nIGludCl0b3RhbF9lcnJvcik7CgogICAgcmV0dXJuIHNpemU7Cn0KCnN0YXRpYyB2b2lkIGNhbGN1bGF0ZV9za2lwX2Vycm9ycyhDaW5lcGFrRW5jQ29udGV4dCAqcywgaW50IGgsIEFWUGljdHVyZSAqbGFzdF9waWN0LCBBVlBpY3R1cmUgKnBpY3QsIHN0cmlwX2luZm8gKmluZm8pCnsKICAgIGludCB4LCB5LCBpOwogICAgQVZQaWN0dXJlIHN1Yl9sYXN0LCBzdWJfcGljdDsKCiAgICBmb3IoaSA9IHkgPSAwOyB5IDwgaDsgeSArPSBNQl9TSVpFKSB7CiAgICAgICAgZm9yKHggPSAwOyB4IDwgcy0+dzsgeCArPSBNQl9TSVpFLCBpKyspIHsKICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIHgsIHksIGxhc3RfcGljdCwgJnN1Yl9sYXN0KTsKICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIHgsIHksIHBpY3QsICAgICAgJnN1Yl9waWN0KTsKCiAgICAgICAgICAgIHMtPm1iW2ldLnNraXBfZXJyb3IgPSBjb21wdXRlX21iX2Rpc3RvcnRpb24ocywgJnN1Yl9sYXN0LCAmc3ViX3BpY3QpOwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQgd3JpdGVfc3RyaXBfaGVhZGVyKENpbmVwYWtFbmNDb250ZXh0ICpzLCBpbnQgeSwgaW50IGgsIGludCBrZXlmcmFtZSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RyaXBfc2l6ZSkKewovLyBhY3R1YWxseSB3ZSBhcmUgZXhjbHVzaXZlbHkgdXNpbmcgaW50cmEgc3RyaXAgY29kaW5nIChob3cgbXVjaCBjYW4gd2Ugd2luCi8vIG90aGVyd2lzZT8gaG93IHRvIGNob29zZSB3aGljaCBwYXJ0IG9mIGEgY29kZWJvb2sgdG8gdXBkYXRlPyksCi8vIGtleWZyYW1lcyBhcmUgZGlmZmVyZW50IG9ubHkgYmVjYXVzZSB3ZSBkaXNhbGxvdyBFTkNfU0tJUCBvbiB0aGVtIC0tIHJsCi8vIChiZXNpZGVzLCB0aGUgbG9naWMgaGVyZSB1c2VkIHRvIGJlIGludmVydGVkOiApCi8vICAgIGJ1ZlswXSA9IGtleWZyYW1lID8gMHgxMTogMHgxMDsKICAgIGJ1ZlswXSA9IGtleWZyYW1lID8gMHgxMDogMHgxMTsKICAgIEFWX1dCMjQoJmJ1ZlsxXSwgc3RyaXBfc2l6ZSArIFNUUklQX0hFQURFUl9TSVpFKTsKLy8gICAgQVZfV0IxNigmYnVmWzRdLCB5KTsgLyogdXNpbmcgYWJzb2x1dGUgeSB2YWx1ZXMgd29ya3MgLS0gcmwgKi8KICAgIEFWX1dCMTYoJmJ1Zls0XSwgMCk7IC8qIHVzaW5nIHJlbGF0aXZlIHZhbHVlcyB3b3JrcyBhcyB3ZWxsIC0tIHJsICovCiAgICBBVl9XQjE2KCZidWZbNl0sIDApOwovLyAgICBBVl9XQjE2KCZidWZbOF0sIHkraCk7IC8qIHVzaW5nIGFic29sdXRlIHkgdmFsdWVzIHdvcmtzIC0tIHJsICovCiAgICBBVl9XQjE2KCZidWZbOF0sIGgpOyAvKiB1c2luZyByZWxhdGl2ZSB2YWx1ZXMgd29ya3MgYXMgd2VsbCAtLSBybCAqLwogICAgQVZfV0IxNigmYnVmWzEwXSwgcy0+dyk7CiAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJ3cml0ZV9zdHJpcF9oZWFkZXIoKSAleCBrZXlmcmFtZT0lZFxuIiwgYnVmWzBdLCBrZXlmcmFtZSk7Cn0KCnN0YXRpYyBpbnQgcmRfc3RyaXAoQ2luZXBha0VuY0NvbnRleHQgKnMsIGludCB5LCBpbnQgaCwgaW50IGtleWZyYW1lLCBBVlBpY3R1cmUgKmxhc3RfcGljdCwgQVZQaWN0dXJlICpwaWN0LCBBVlBpY3R1cmUgKnNjcmF0Y2hfcGljdCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQ2NF90ICpiZXN0X3Njb3JlCiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiwgaW50NjRfdCAqYmVzdF9zZXJyCiNlbmRpZgopCnsKICAgIGludDY0X3Qgc2NvcmUgPSAwOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgaW50NjRfdCBzZXJyOwojZW5kaWYKICAgIGludCBiZXN0X3NpemUgPSAwOwogICAgc3RyaXBfaW5mbyBpbmZvOwovLyBmb3IgY29kZWJvb2sgb3B0aW1pemF0aW9uOgogICAgaW50IHYxZW5vdWdoLCB2MV9zaXplLCB2NGVub3VnaCwgdjRfc2l6ZTsKICAgIGludCBuZXdfdjFfc2l6ZSwgbmV3X3Y0X3NpemU7CiAgICBpbnQgdjFzaHJ1bmssIHY0c2hydW5rOwoKICAgIGlmKCFrZXlmcmFtZSkKICAgICAgICBjYWxjdWxhdGVfc2tpcF9lcnJvcnMocywgaCwgbGFzdF9waWN0LCBwaWN0LCAmaW5mbyk7CgogICAgLy90cnkgc29tZSBwb3dlcnMgb2YgNCBmb3IgdGhlIHNpemUgb2YgdGhlIGNvZGVib29rcwogICAgLy9jb25zdHJhaW50IHRoZSB2NCBjb2RlYm9vayB0byBiZSBubyBiaWdnZXIgdGhhbiB2MSBvbmUsCiAgICAvLyhhbmQgbm8gbGVzcyB0aGFuIHYxX3NpemUvNCkKICAgIC8vdGh1cyBtYWtpbmcgdjEgcHJlZmVyYWJsZSBhbmQgcG9zc2libHkgbG9zaW5nIHNtYWxsIGRldGFpbHM/IHNob3VsZCBiZSBvawojZGVmaW5lIFNNQUxMRVNUX0NPREVCT09LIDEKICAgIGZvcih2MWVub3VnaCA9IDAsIHYxX3NpemUgPSBTTUFMTEVTVF9DT0RFQk9PSzsgdjFfc2l6ZSA8PSBDT0RFQk9PS19NQVggJiYgIXYxZW5vdWdoOyB2MV9zaXplIDw8PSAyKSB7CiAgICAgICAgZm9yKHY0ZW5vdWdoID0gMCwgdjRfc2l6ZSA9IDA7IHY0X3NpemUgPD0gdjFfc2l6ZSAmJiAhdjRlbm91Z2g7IHY0X3NpemUgPSB2NF9zaXplID8gdjRfc2l6ZSA8PCAyIDogdjFfc2l6ZSA+PSBTTUFMTEVTVF9DT0RFQk9PSyA8PCAyID8gdjFfc2l6ZSA+PiAyIDogU01BTExFU1RfQ09ERUJPT0spIHsKICAgICAgICAgICAgLy90cnkgYWxsIG1vZGVzCiAgICAgICAgICAgIGZvcihDaW5lcGFrTW9kZSBtb2RlID0gMDsgbW9kZSA8IE1PREVfQ09VTlQ7IG1vZGUrKykgewogICAgICAgICAgICAgICAgLy9kb24ndCBhbGxvdyBNT0RFX01DIGluIGludHJhIGZyYW1lcwogICAgICAgICAgICAgICAgaWYoa2V5ZnJhbWUgJiYgbW9kZSA9PSBNT0RFX01DKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgIGlmKG1vZGUgPT0gTU9ERV9WMV9PTkxZKSB7CiAgICAgICAgICAgICAgICAgICAgaW5mby52MV9zaXplID0gdjFfc2l6ZTsKLy8gdGhlIHNpemUgbWF5IHNocmluayBldmVuIGJlZm9yZSBvcHRpbWl6YXRpb25zIGlmIHRoZSBpbnB1dCBpcyBzaG9ydDoKICAgICAgICAgICAgICAgICAgICBpbmZvLnYxX3NpemUgPSBxdWFudGl6ZShzLCBoLCBwaWN0LCAxLCAmaW5mbywgRU5DX1VOQ0VSVEFJTik7CiAgICAgICAgICAgICAgICAgICAgaWYoaW5mby52MV9zaXplIDwgdjFfc2l6ZSkKLy8gdG9vIGZldyBlbGlnaWJsZSBibG9ja3MsIG5vIHNlbnNlIGluIHRyeWluZyBiaWdnZXIgc2l6ZXMKICAgICAgICAgICAgICAgICAgICAgICAgdjFlbm91Z2ggPSAxOwoKICAgICAgICAgICAgICAgICAgICBpbmZvLnY0X3NpemUgPSAwOwogICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gbW9kZSAhPSBNT0RFX1YxX09OTFkKICAgICAgICAgICAgICAgICAgICAvLyBpZiB2NCBjb2RlYm9vayBpcyBlbXB0eSB0aGVuIG9ubHkgYWxsb3cgVjEtb25seSBtb2RlCiAgICAgICAgICAgICAgICAgICAgaWYoIXY0X3NpemUpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICBpZihtb2RlID09IE1PREVfVjFfVjQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gdjRfc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gcXVhbnRpemUocywgaCwgcGljdCwgMCwgJmluZm8sIEVOQ19VTkNFUlRBSU4pOwogICAgICAgICAgICAgICAgICAgICAgICBpZihpbmZvLnY0X3NpemUgPCB2NF9zaXplKQovLyB0b28gZmV3IGVsaWdpYmxlIGJsb2Nrcywgbm8gc2Vuc2UgaW4gdHJ5aW5nIGJpZ2dlciBzaXplcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdjRlbm91Z2ggPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpbmZvLm1vZGUgPSBtb2RlOwovLyBjaG9vc2UgdGhlIGJlc3QgZW5jb2RpbmcgcGVyIGJsb2NrLCBiYXNlZCBvbiBjdXJyZW50IGV4cGVyaWVuY2UKICAgICAgICAgICAgICAgIHNjb3JlID0gY2FsY3VsYXRlX21vZGVfc2NvcmUocywgaCwgJmluZm8sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2MXNocnVuaywgJnY0c2hydW5rCiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiwgJnNlcnIKI2VuZGlmCik7CgogICAgICAgICAgICAgICAgaWYobW9kZSAhPSBNT0RFX1YxX09OTFkpewogICAgICAgICAgICAgICAgICAgIGludCBleHRyYV9pdGVyYXRpb25zX2xpbWl0ID0gcy0+bWF4X2V4dHJhX2NiX2l0ZXJhdGlvbnM7Ci8vIHJlY29tcHV0ZSB0aGUgY29kZWJvb2tzLCBvbWl0dGluZyB0aGUgZXh0cmEgYmxvY2tzCi8vIHdlIGFzc3VtZSB3ZSBfbWF5XyBjb21lIGhlcmUgd2l0aCBtb3JlIGJsb2NrcyB0byBlbmNvZGUgdGhhbiBiZWZvcmUKICAgICAgICAgICAgICAgICAgICBpbmZvLnYxX3NpemUgPSB2MV9zaXplOwogICAgICAgICAgICAgICAgICAgIG5ld192MV9zaXplID0gcXVhbnRpemUocywgaCwgcGljdCwgMSwgJmluZm8sIEVOQ19WMSk7CiAgICAgICAgICAgICAgICAgICAgaWYobmV3X3YxX3NpemUgPCBpbmZvLnYxX3NpemUpewogICAgICAgICAgICAgICAgICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJtb2RlICVpLCAlM2ksICUzaTogY3V0IHYxIGNvZGVib29rIHRvICVpIGVudHJpZXNcbiIsIG1vZGUsIHYxX3NpemUsIHY0X3NpemUsIG5ld192MV9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52MV9zaXplID0gbmV3X3YxX3NpemU7CiAgICAgICAgICAgICAgICAgICAgfQovLyB3ZSBhc3N1bWUgd2UgX21heV8gY29tZSBoZXJlIHdpdGggbW9yZSBibG9ja3MgdG8gZW5jb2RlIHRoYW4gYmVmb3JlCiAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gdjRfc2l6ZTsKICAgICAgICAgICAgICAgICAgICBuZXdfdjRfc2l6ZSA9IHF1YW50aXplKHMsIGgsIHBpY3QsIDAsICZpbmZvLCBFTkNfVjQpOwogICAgICAgICAgICAgICAgICAgIGlmKG5ld192NF9zaXplIDwgaW5mby52NF9zaXplKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIm1vZGUgJWksICUzaSwgJTNpOiBjdXQgdjQgY29kZWJvb2sgdG8gJWkgZW50cmllcyBhdCBmaXJzdCBpdGVyYXRpb25cbiIsIG1vZGUsIHYxX3NpemUsIHY0X3NpemUsIG5ld192NF9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gbmV3X3Y0X3NpemU7CiAgICAgICAgICAgICAgICAgICAgfQovLyBjYWxjdWxhdGUgdGhlIHJlc3VsdGluZyBzY29yZQovLyAoZG8gbm90IG1vdmUgYmxvY2tzIHRvIGNvZGVib29rIGVuY29kaW5ncyBub3csIGFzIHNvbWUgYmxvY2tzIG1heSBoYXZlCi8vIGdvdCBiaWdnZXIgZXJyb3JzIGRlc3BpdGUgYSBzbWFsbGVyIHRyYWluaW5nIHNldCAtIGJ1dCB3ZSBkbyBub3QKLy8gZXZlciBncm93IHRoZSB0cmFpbmluZyBzZXRzIGJhY2spCiAgICAgICAgICAgICAgICAgICAgZm9yKDs7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlID0gY2FsY3VsYXRlX21vZGVfc2NvcmUocywgaCwgJmluZm8sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYxc2hydW5rLCAmdjRzaHJ1bmsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKLCAmc2VycgojZW5kaWYKKTsKLy8gZG8gd2UgaGF2ZSBhIHJlYXNvbiB0byByZWl0ZXJhdGU/IGlmIHNvLCBoYXZlIHdlIHJlYWNoZWQgdGhlIGxpbWl0PwogICAgICAgICAgICAgICAgICAgICAgICBpZigoIXYxc2hydW5rICYmICF2NHNocnVuaykgfHwgIWV4dHJhX2l0ZXJhdGlvbnNfbGltaXQtLSkgYnJlYWs7Ci8vIHJlY29tcHV0ZSB0aGUgY29kZWJvb2tzLCBvbWl0dGluZyB0aGUgZXh0cmEgYmxvY2tzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHYxc2hydW5rKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnYxX3NpemUgPSB2MV9zaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3YxX3NpemUgPSBxdWFudGl6ZShzLCBoLCBwaWN0LCAxLCAmaW5mbywgRU5DX1YxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5ld192MV9zaXplIDwgaW5mby52MV9zaXplKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJtb2RlICVpLCAlM2ksICUzaTogY3V0IHYxIGNvZGVib29rIHRvICVpIGVudHJpZXNcbiIsIG1vZGUsIHYxX3NpemUsIHY0X3NpemUsIG5ld192MV9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnYxX3NpemUgPSBuZXdfdjFfc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZih2NHNocnVuaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gdjRfc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld192NF9zaXplID0gcXVhbnRpemUocywgaCwgcGljdCwgMCwgJmluZm8sIEVOQ19WNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihuZXdfdjRfc2l6ZSA8IGluZm8udjRfc2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIm1vZGUgJWksICUzaSwgJTNpOiBjdXQgdjQgY29kZWJvb2sgdG8gJWkgZW50cmllc1xuIiwgbW9kZSwgdjFfc2l6ZSwgdjRfc2l6ZSwgbmV3X3Y0X3NpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8udjRfc2l6ZSA9IG5ld192NF9zaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIiUzaSAlM2kgc2NvcmUgPSAlbGxpXG4iLCB2MV9zaXplLCB2NF9zaXplLCAobG9uZyBsb25nIGludClzY29yZSk7CgogICAgICAgICAgICAgICAgaWYoYmVzdF9zaXplID09IDAgfHwgc2NvcmUgPCAqYmVzdF9zY29yZSkgewoKICAgICAgICAgICAgICAgICAgICAqYmVzdF9zY29yZSA9IHNjb3JlOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICAgICAgICAgICpiZXN0X3NlcnIgPSBzZXJyOwojZW5kaWYKICAgICAgICAgICAgICAgICAgICBiZXN0X3NpemUgPSBlbmNvZGVfbW9kZShzLCBoLCBzY3JhdGNoX3BpY3QsIGxhc3RfcGljdCwgJmluZm8sIHMtPnN0cmlwX2J1ZiArIFNUUklQX0hFQURFUl9TSVpFKTsKCiAgICAgICAgICAgICAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAibW9kZSAlaSwgJTNpLCAlM2k6ICUxOGxsaSAlaSBCIiwgbW9kZSwgaW5mby52MV9zaXplLCBpbmZvLnY0X3NpemUsIChsb25nIGxvbmcgaW50KXNjb3JlLCBiZXN0X3NpemUpOwogICAgICAgICAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIlxuIik7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIm1vZGUgJWksICUzaSwgJTNpOiAlMThsbGkgJWkgQlxuIiwgbW9kZSwgdjFfc2l6ZSwgdjRfc2l6ZSwgKGxvbmcgbG9uZyBpbnQpc2VyciwgYmVzdF9zaXplKTsKI2VuZGlmCgojaWZkZWYgQ0lORVBBS0VOQ19ERUJVRwogICAgICAgICAgICAgICAgICAgIC8vc2F2ZSBNQiBlbmNvZGluZyBjaG9pY2VzCiAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHMtPmJlc3RfbWIsIHMtPm1iLCBtYl9jb3VudCpzaXplb2YobWJfaW5mbykpOwojZW5kaWYKCiAgICAgICAgICAgICAgICAgICAgLy9tZW1jcHkoc3RyaXBfdGVtcCArIFNUUklQX0hFQURFUl9TSVpFLCBzdHJpcF90ZW1wLCBiZXN0X3NpemUpOwogICAgICAgICAgICAgICAgICAgIHdyaXRlX3N0cmlwX2hlYWRlcihzLCB5LCBoLCBrZXlmcmFtZSwgcy0+c3RyaXBfYnVmLCBiZXN0X3NpemUpOwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiNpZmRlZiBDSU5FUEFLRU5DX0RFQlVHCiAgICAvL2dhdGhlciBzdGF0cy4gdGhpcyB3aWxsIG9ubHkgd29yayBwcm9wZXJseSBvZiBNQVhfU1RSSVBTID09IDEKICAgIGlmKGJlc3RfaW5mby5tb2RlID09IE1PREVfVjFfT05MWSkgewogICAgICAgIHMtPm51bV92MV9tb2RlKys7CiAgICAgICAgcy0+bnVtX3YxX2VuY3MgKz0gcy0+dypoL01CX0FSRUE7CiAgICB9IGVsc2UgewogICAgICAgIGlmKGJlc3RfaW5mby5tb2RlID09IE1PREVfVjFfVjQpCiAgICAgICAgICAgIHMtPm51bV92NF9tb2RlKys7CiAgICAgICAgZWxzZQogICAgICAgICAgICBzLT5udW1fbWNfbW9kZSsrOwoKICAgICAgICBpbnQgeDsKICAgICAgICBmb3IoeCA9IDA7IHggPCBzLT53KmgvTUJfQVJFQTsgeCsrKQogICAgICAgICAgICBpZihzLT5iZXN0X21iW3hdLmJlc3RfZW5jb2RpbmcgPT0gRU5DX1YxKQogICAgICAgICAgICAgICAgcy0+bnVtX3YxX2VuY3MrKzsKICAgICAgICAgICAgZWxzZSBpZihzLT5iZXN0X21iW3hdLmJlc3RfZW5jb2RpbmcgPT0gRU5DX1Y0KQogICAgICAgICAgICAgICAgcy0+bnVtX3Y0X2VuY3MrKzsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcy0+bnVtX3NraXBzKys7CiAgICB9CiNlbmRpZgoKICAgIGJlc3Rfc2l6ZSArPSBTVFJJUF9IRUFERVJfU0laRTsKICAgIG1lbWNweShidWYsIHMtPnN0cmlwX2J1ZiwgYmVzdF9zaXplKTsKCiAgICByZXR1cm4gYmVzdF9zaXplOwp9CgpzdGF0aWMgaW50IHdyaXRlX2N2aWRfaGVhZGVyKENpbmVwYWtFbmNDb250ZXh0ICpzLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBudW1fc3RyaXBzLCBpbnQgZGF0YV9zaXplLCBpbnQgaXNha2V5ZnJhbWUpCnsKICAgIGJ1ZlswXSA9IGlzYWtleWZyYW1lID8gMCA6IDE7CiAgICBBVl9XQjI0KCZidWZbMV0sIGRhdGFfc2l6ZSArIENWSURfSEVBREVSX1NJWkUpOwogICAgQVZfV0IxNigmYnVmWzRdLCBzLT53KTsKICAgIEFWX1dCMTYoJmJ1Zls2XSwgcy0+aCk7CiAgICBBVl9XQjE2KCZidWZbOF0sIG51bV9zdHJpcHMpOwoKICAgIHJldHVybiBDVklEX0hFQURFUl9TSVpFOwp9CgpzdGF0aWMgaW50IHJkX2ZyYW1lKENpbmVwYWtFbmNDb250ZXh0ICpzLCBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50IGlzYWtleWZyYW1lLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBidWZfc2l6ZSkKewogICAgaW50IG51bV9zdHJpcHMsIHN0cmlwLCBpLCB5LCBuZXh0eSwgc2l6ZSwgdGVtcF9zaXplOwogICAgQVZQaWN0dXJlIGxhc3RfcGljdCwgcGljdCwgc2NyYXRjaF9waWN0OwogICAgaW50NjRfdCBiZXN0X3Njb3JlID0gMCwgc2NvcmUsIHNjb3JlX3RlbXA7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICBpbnQ2NF90IGJlc3Rfc2VyciA9IDAsIHNlcnIsIHNlcnJfdGVtcDsKI2VuZGlmCgogICAgaW50IGJlc3RfbnN0cmlwcyA9IC0xLCBiZXN0X3NpemUgPSAtMTsgLy8gbWFyayBhcyB1bmluaXRpYWx6ZWQKCiAgICBpZihzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpIHsKICAgICAgICBpbnQgeDsKLy8gYnVpbGQgYSBjb3B5IG9mIHRoZSBnaXZlbiBmcmFtZSBpbiB0aGUgY29ycmVjdCBjb2xvcnNwYWNlCiAgICAgICAgZm9yKHkgPSAwOyB5IDwgcy0+aDsgeSArPSAyKSB7CiAgICAgICAgICAgIGZvcih4ID0gMDsgeCA8IHMtPnc7IHggKz0gMikgewogICAgICAgICAgICAgICAgdWludDhfdCAqaXJbMl07IGludDMyX3QgciwgZywgYiwgcnIsIGdnLCBiYjsKICAgICAgICAgICAgICAgIGlyWzBdID0gKChBVlBpY3R1cmUqKWZyYW1lKS0+ZGF0YVswXSArIHgqMyArIHkqKChBVlBpY3R1cmUqKWZyYW1lKS0+bGluZXNpemVbMF07CiAgICAgICAgICAgICAgICBpclsxXSA9IGlyWzBdICsgKChBVlBpY3R1cmUqKWZyYW1lKS0+bGluZXNpemVbMF07CiAgICAgICAgICAgICAgICBnZXRfc3ViX3BpY3R1cmUocywgeCwgeSwgKEFWUGljdHVyZSopcy0+aW5wdXRfZnJhbWUsICZzY3JhdGNoX3BpY3QpOwogICAgICAgICAgICAgICAgciA9IGcgPSBiID0gMDsKICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8NDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgaW50IGkxLCBpMjsKICAgICAgICAgICAgICAgICAgICBpMSA9IChpJjEpOyBpMiA9IChpPj0yKTsKICAgICAgICAgICAgICAgICAgICByciA9IGlyW2kyXVtpMSozKzBdOwogICAgICAgICAgICAgICAgICAgIGdnID0gaXJbaTJdW2kxKjMrMV07CiAgICAgICAgICAgICAgICAgICAgYmIgPSBpcltpMl1baTEqMysyXTsKICAgICAgICAgICAgICAgICAgICByICs9IHJyOyBnICs9IGdnOyBiICs9IGJiOwovLyB1c2luZyBmaXhlZCBwb2ludCBhcml0aG1ldGljIGZvciBwb3J0YWJsZSByZXBlYXRhYmlsaXR5LCBzY2FsaW5nIGJ5IDJeMjMKLy8gIlkiCi8vICAgICAgICAgICAgICAgICAgICByciA9IDAuMjg1NypyciArIDAuNTcxNCpnZyArIDAuMTQyOSpiYjsKICAgICAgICAgICAgICAgICAgICByciA9ICgyMzk2NjI1KnJyICsgNDc5MzI1MSpnZyArIDExOTg3MzIqYmIpID4+IDIzOwogICAgICAgICAgICAgICAgICAgIGlmKCAgICAgIHJyIDwgICAwKSByciA9ICAgMDsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyciA+IDI1NSkgcnIgPSAyNTU7CiAgICAgICAgICAgICAgICAgICAgc2NyYXRjaF9waWN0LmRhdGFbMF1baTEgKyBpMipzY3JhdGNoX3BpY3QubGluZXNpemVbMF1dID0gcnI7CiAgICAgICAgICAgICAgICB9Ci8vIGxldCB1cyBzY2FsZSBkb3duIGFzIGxhdGUgYXMgcG9zc2libGUKLy8gICAgICAgICAgICAgICAgciAvPSA0OyBnIC89IDQ7IGIgLz0gNDsKLy8gIlUiCi8vICAgICAgICAgICAgICAgIHJyID0gLTAuMTQyOSpyIC0gMC4yODU3KmcgKyAwLjQyODYqYjsKICAgICAgICAgICAgICAgIHJyID0gKC0yOTk2ODMqciAtIDU5OTE1NipnICsgODk4ODM5KmIpID4+IDIzOwogICAgICAgICAgICAgICAgaWYoICAgICAgcnIgPCAtMTI4KSByciA9IC0xMjg7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChyciA+ICAxMjcpIHJyID0gIDEyNzsKICAgICAgICAgICAgICAgIHNjcmF0Y2hfcGljdC5kYXRhWzFdWzBdID0gcnIgKyAxMjg7IC8vIHF1YW50aXplIG5lZWRzIHVuc2lnbmVkCi8vICJWIgovLyAgICAgICAgICAgICAgICByciA9IDAuMzU3MSpyIC0gMC4yODU3KmcgLSAwLjA3MTQqYjsKICAgICAgICAgICAgICAgIHJyID0gKDc0ODg5MypyIC0gNTk5MTU2KmcgLSAxNDk3MzcqYikgPj4gMjM7CiAgICAgICAgICAgICAgICBpZiggICAgICByciA8IC0xMjgpIHJyID0gLTEyODsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJyID4gIDEyNykgcnIgPSAgMTI3OwogICAgICAgICAgICAgICAgc2NyYXRjaF9waWN0LmRhdGFbMl1bMF0gPSByciArIDEyODsgLy8gcXVhbnRpemUgbmVlZHMgdW5zaWduZWQKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvL3dvdWxkIGJlIG5pY2UgYnV0IHF1aXRlIGNlcnRhaW5seSBpbmNvbXBhdGlibGUgd2l0aCB2aW50YWdlIHBsYXllcnM6CiAgICAvLyBzdXBwb3J0IGVuY29kaW5nIHplcm8gc3RyaXBzIChtZWFuaW5nIHNraXAgdGhlIHdob2xlIGZyYW1lKQogICAgZm9yKG51bV9zdHJpcHMgPSBzLT5taW5fc3RyaXBzOyBudW1fc3RyaXBzIDw9IHMtPm1heF9zdHJpcHMgJiYgbnVtX3N0cmlwcyA8PSBzLT5oIC8gTUJfU0laRTsgbnVtX3N0cmlwcysrKSB7CiAgICAgICAgc2NvcmUgPSAwOwogICAgICAgIHNpemUgPSAwOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgIHNlcnIgPSAwOwojZW5kaWYKCiAgICAgICAgZm9yKHkgPSAwLCBzdHJpcCA9IDE7IHkgPCBzLT5oOyBzdHJpcCsrLCB5ID0gbmV4dHkpIHsKICAgICAgICAgICAgaW50IHN0cmlwX2hlaWdodDsKCiAgICAgICAgICAgIG5leHR5ID0gc3RyaXAgKiBzLT5oIC8gbnVtX3N0cmlwczsgLy8gPD0gcy0+aAogICAgICAgICAgICAvL21ha2UgbmV4dHkgdGhlIG5leHQgbXVsdGlwbGUgb2YgNCBpZiBub3QgYWxyZWFkeSB0aGVyZQogICAgICAgICAgICBpZihuZXh0eSAmIDMpCiAgICAgICAgICAgICAgICBuZXh0eSArPSA0IC0gKG5leHR5ICYgMyk7CgogICAgICAgICAgICBzdHJpcF9oZWlnaHQgPSBuZXh0eSAtIHk7CiAgICAgICAgICAgIGlmKHN0cmlwX2hlaWdodCA8PSAwKSB7IC8vIGNhbiB0aGlzIGV2ZXIgaGFwcGVuPwogICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgInNraXBwaW5nIHplcm8gaGVpZ2h0IHN0cmlwICVpIG9mICVpXG4iLCBzdHJpcCwgbnVtX3N0cmlwcyk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KQogICAgICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIDAsIHksIChBVlBpY3R1cmUqKXMtPmlucHV0X2ZyYW1lLCAgICAmcGljdCk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCAwLCB5LCAoQVZQaWN0dXJlKilmcmFtZSwgICAgICAgICAgICAgICZwaWN0KTsKICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIDAsIHksIChBVlBpY3R1cmUqKXMtPmxhc3RfZnJhbWUsICAgICZsYXN0X3BpY3QpOwogICAgICAgICAgICBnZXRfc3ViX3BpY3R1cmUocywgMCwgeSwgKEFWUGljdHVyZSopcy0+c2NyYXRjaF9mcmFtZSwgJnNjcmF0Y2hfcGljdCk7CgogICAgICAgICAgICBpZigodGVtcF9zaXplID0gcmRfc3RyaXAocywgeSwgc3RyaXBfaGVpZ2h0LCBpc2FrZXlmcmFtZSwgJmxhc3RfcGljdCwgJnBpY3QsICZzY3JhdGNoX3BpY3QsIHMtPmZyYW1lX2J1ZiArIHNpemUgKyBDVklEX0hFQURFUl9TSVpFLCAmc2NvcmVfdGVtcAojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgosICZzZXJyX3RlbXAKI2VuZGlmCikpIDwgMCkKICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wX3NpemU7CgogICAgICAgICAgICBzY29yZSArPSBzY29yZV90ZW1wOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICBzZXJyICs9IHNlcnJfdGVtcDsKI2VuZGlmCiAgICAgICAgICAgIHNpemUgKz0gdGVtcF9zaXplOwogICAgICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJzdHJpcCAlZCwgaXNha2V5ZnJhbWU9JWQiLCBzdHJpcCwgaXNha2V5ZnJhbWUpOwogICAgICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJcbiIpOwogICAgICAgIH0KCiAgICAgICAgaWYoYmVzdF9zY29yZSA9PSAwIHx8IHNjb3JlIDwgYmVzdF9zY29yZSkgewogICAgICAgICAgICBiZXN0X3Njb3JlID0gc2NvcmU7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgIGJlc3Rfc2VyciA9IHNlcnI7CiNlbmRpZgogICAgICAgICAgICBiZXN0X3NpemUgPSBzaXplICsgd3JpdGVfY3ZpZF9oZWFkZXIocywgcy0+ZnJhbWVfYnVmLCBudW1fc3RyaXBzLCBzaXplLCBpc2FrZXlmcmFtZSk7CiAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgImJlc3QgbnVtYmVyIG9mIHN0cmlwcyBzbyBmYXI6ICUyaSwgJTEybGxpLCAlaSBCXG4iLCBudW1fc3RyaXBzLCAobG9uZyBsb25nIGludClzY29yZSwgYmVzdF9zaXplKTsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgImJlc3QgbnVtYmVyIG9mIHN0cmlwcyBzbyBmYXI6ICUyaSwgJTEybGxpLCAlaSBCXG4iLCBudW1fc3RyaXBzLCAobG9uZyBsb25nIGludClzZXJyLCBiZXN0X3NpemUpOwojZW5kaWYKCiAgICAgICAgICAgIEZGU1dBUChBVkZyYW1lICosIHMtPmJlc3RfZnJhbWUsIHMtPnNjcmF0Y2hfZnJhbWUpOwogICAgICAgICAgICBtZW1jcHkoYnVmLCBzLT5mcmFtZV9idWYsIGJlc3Rfc2l6ZSk7CiAgICAgICAgICAgIGJlc3RfbnN0cmlwcyA9IG51bV9zdHJpcHM7CiAgICAgICAgfQovLyBhdm9pZCB0cnlpbmcgdG9vIG1hbnkgc3RyaXAgbnVtYmVycyB3aXRob3V0IGEgcmVhbCByZWFzb24KLy8gKHRoaXMgbWFrZXMgdGhlIHByb2Nlc3Npbmcgb2YgdGhlIHZlcnkgZmlyc3QgZnJhbWUgZmFzdGVyKQogICAgICAgIGlmKG51bV9zdHJpcHMgLSBiZXN0X25zdHJpcHMgPiA0KQogICAgICAgICAgICBicmVhazsKICAgIH0KCiAgICBhdl9hc3NlcnQwKGJlc3RfbnN0cmlwcyA+PSAwICYmIGJlc3Rfc2l6ZSA+PSAwKTsKCi8vIGxldCB0aGUgbnVtYmVyIG9mIHN0cmlwcyBzbG93bHkgYWRhcHQgdG8gdGhlIGNoYW5nZXMgaW4gdGhlIGNvbnRlbnRzLAovLyBjb21wYXJlZCB0byBmdWxsIGJydXRlZm9yY2luZyBldmVyeSB0aW1lIHRoaXMgd2lsbCBvY2Nhc2lvbmFsbHkgbGVhZAovLyB0byBzb21lIHIvZCBwZXJmb3JtYW5jZSBsb3NzIGJ1dCBtYWtlcyBlbmNvZGluZyB1cCB0byBzZXZlcmFsIHRpbWVzIGZhc3RlcgogICAgaWYoIXMtPnN0cmlwX251bWJlcl9kZWx0YV9yYW5nZSkgewogICAgICAgIGlmKGJlc3RfbnN0cmlwcyA9PSBzLT5tYXhfc3RyaXBzKSB7IC8vIGxldCB1cyB0cnkgdG8gc3RlcCB1cAogICAgICAgICAgICBzLT5tYXhfc3RyaXBzID0gYmVzdF9uc3RyaXBzICsgMTsKICAgICAgICAgICAgaWYocy0+bWF4X3N0cmlwcyA+PSBzLT5tYXhfbWF4X3N0cmlwcykKICAgICAgICAgICAgICAgIHMtPm1heF9zdHJpcHMgPSBzLT5tYXhfbWF4X3N0cmlwczsKICAgICAgICB9IGVsc2UgeyAvLyB0cnkgdG8gc3RlcCBkb3duCiAgICAgICAgICAgIHMtPm1heF9zdHJpcHMgPSBiZXN0X25zdHJpcHM7CiAgICAgICAgfQogICAgICAgIHMtPm1pbl9zdHJpcHMgPSBzLT5tYXhfc3RyaXBzIC0gMTsKICAgICAgICBpZihzLT5taW5fc3RyaXBzIDwgcy0+bWluX21pbl9zdHJpcHMpCiAgICAgICAgICAgIHMtPm1pbl9zdHJpcHMgPSBzLT5taW5fbWluX3N0cmlwczsKICAgIH0gZWxzZSB7CiAgICAgICAgcy0+bWF4X3N0cmlwcyA9IGJlc3RfbnN0cmlwcyArIHMtPnN0cmlwX251bWJlcl9kZWx0YV9yYW5nZTsKICAgICAgICBpZihzLT5tYXhfc3RyaXBzID49IHMtPm1heF9tYXhfc3RyaXBzKQogICAgICAgICAgICBzLT5tYXhfc3RyaXBzID0gcy0+bWF4X21heF9zdHJpcHM7CiAgICAgICAgcy0+bWluX3N0cmlwcyA9IGJlc3RfbnN0cmlwcyAtIHMtPnN0cmlwX251bWJlcl9kZWx0YV9yYW5nZTsKICAgICAgICBpZihzLT5taW5fc3RyaXBzIDwgcy0+bWluX21pbl9zdHJpcHMpCiAgICAgICAgICAgIHMtPm1pbl9zdHJpcHMgPSBzLT5taW5fbWluX3N0cmlwczsKICAgIH0KCiAgICByZXR1cm4gYmVzdF9zaXplOwp9CgpzdGF0aWMgaW50IGNpbmVwYWtfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0KQp7CiAgICBDaW5lcGFrRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICBpbnQgcmV0OwoKICAgIHMtPmxhbWJkYSA9IGZyYW1lLT5xdWFsaXR5ID8gZnJhbWUtPnF1YWxpdHkgLSAxIDogMiAqIEZGX0xBTUJEQV9TQ0FMRTsKCiAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgcy0+ZnJhbWVfYnVmX3NpemUpKSA8IDApCiAgICAgICAgcmV0dXJuIHJldDsKICAgIHJldCA9IHJkX2ZyYW1lKHMsIGZyYW1lLCAocy0+Y3VyZnJhbWUgPT0gMCksIHBrdC0+ZGF0YSwgcy0+ZnJhbWVfYnVmX3NpemUpOwogICAgcGt0LT5zaXplID0gcmV0OwogICAgaWYgKHMtPmN1cmZyYW1lID09IDApCiAgICAgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CiAgICAqZ290X3BhY2tldCA9IDE7CgogICAgRkZTV0FQKEFWRnJhbWUgKiwgcy0+bGFzdF9mcmFtZSwgcy0+YmVzdF9mcmFtZSk7CgogICAgaWYgKCsrcy0+Y3VyZnJhbWUgPj0gcy0+a2V5aW50KQogICAgICAgIHMtPmN1cmZyYW1lID0gMDsKCiAgICByZXR1cm4gMDsKfQoKc3RhdGljIGF2X2NvbGQgaW50IGNpbmVwYWtfZW5jb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCnsKICAgIENpbmVwYWtFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKICAgIGludCB4OwoKICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmxhc3RfZnJhbWUpOwogICAgYXZfZnJhbWVfZnJlZSgmcy0+YmVzdF9mcmFtZSk7CiAgICBhdl9mcmFtZV9mcmVlKCZzLT5zY3JhdGNoX2ZyYW1lKTsKICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KQogICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmlucHV0X2ZyYW1lKTsKICAgIGF2X2ZyZWVwKCZzLT5jb2RlYm9va19pbnB1dCk7CiAgICBhdl9mcmVlcCgmcy0+Y29kZWJvb2tfY2xvc2VzdCk7CiAgICBhdl9mcmVlcCgmcy0+c3RyaXBfYnVmKTsKICAgIGF2X2ZyZWVwKCZzLT5mcmFtZV9idWYpOwogICAgYXZfZnJlZXAoJnMtPm1iKTsKI2lmZGVmIENJTkVQQUtFTkNfREVCVUcKICAgIGF2X2ZyZWVwKCZzLT5iZXN0X21iKTsKI2VuZGlmCgogICAgZm9yKHggPSAwOyB4IDwgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA0IDogMyk7IHgrKykKICAgICAgICBhdl9mcmVlcCgmcy0+cGljdF9idWZzW3hdKTsKCiNpZmRlZiBDSU5FUEFLRU5DX0RFQlVHCiAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAic3RyaXAgY29kaW5nIHN0YXRzOiAlaSBWMSBtb2RlLCAlaSBWNCBtb2RlLCAlaSBNQyBtb2RlICglaSBWMSBlbmNzLCAlaSBWNCBlbmNzLCAlaSBza2lwcylcbiIsCiAgICAgICAgcy0+bnVtX3YxX21vZGUsIHMtPm51bV92NF9tb2RlLCBzLT5udW1fbWNfbW9kZSwgcy0+bnVtX3YxX2VuY3MsIHMtPm51bV92NF9lbmNzLCBzLT5udW1fc2tpcHMpOwojZW5kaWYKCiAgICByZXR1cm4gMDsKfQoKQVZDb2RlYyBmZl9jaW5lcGFrX2VuY29kZXIgPSB7CiAgICAubmFtZSAgICAgICAgICAgPSAiY2luZXBhayIsCiAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9DSU5FUEFLLAogICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENpbmVwYWtFbmNDb250ZXh0KSwKICAgIC5pbml0ICAgICAgICAgICA9IGNpbmVwYWtfZW5jb2RlX2luaXQsCiAgICAuZW5jb2RlMiAgICAgICAgPSBjaW5lcGFrX2VuY29kZV9mcmFtZSwKICAgIC5jbG9zZSAgICAgICAgICA9IGNpbmVwYWtfZW5jb2RlX2VuZCwKICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7QVZfUElYX0ZNVF9SR0IyNCwgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9OT05FfSwKICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDaW5lcGFrIC8gQ1ZJRCIpLAogICAgLnByaXZfY2xhc3MgICAgID0gJmNpbmVwYWtfY2xhc3MsCn07Cg==