LyogdmxjbGllbnQuaDogVm9sdW1lIExvY2F0aW9uIFNlcnZpY2UgY2xpZW50IGludGVyZmFjZQogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwoKI2lmbmRlZiBfTElOVVhfQUZTX1ZMQ0xJRU5UX0gKI2RlZmluZSBfTElOVVhfQUZTX1ZMQ0xJRU5UX0gKCiNpbmNsdWRlICJ0eXBlcy5oIgoKZW51bSBBRlNWTF9FcnJvcnMgewoJQUZTVkxfSURFWElTVCAJCT0gMzYzNTIwLAkvKiBWb2x1bWUgSWQgZW50cnkgZXhpc3RzIGluIHZsIGRhdGFiYXNlICovCglBRlNWTF9JTyAJCT0gMzYzNTIxLAkvKiBJL08gcmVsYXRlZCBlcnJvciAqLwoJQUZTVkxfTkFNRUVYSVNUIAk9IDM2MzUyMiwJLyogVm9sdW1lIG5hbWUgZW50cnkgZXhpc3RzIGluIHZsIGRhdGFiYXNlICovCglBRlNWTF9DUkVBVEVGQUlMIAk9IDM2MzUyMywJLyogSW50ZXJuYWwgY3JlYXRpb24gZmFpbHVyZSAqLwoJQUZTVkxfTk9FTlQgCQk9IDM2MzUyNCwJLyogTm8gc3VjaCBlbnRyeSAqLwoJQUZTVkxfRU1QVFkgCQk9IDM2MzUyNSwJLyogVmwgZGF0YWJhc2UgaXMgZW1wdHkgKi8KCUFGU1ZMX0VOVERFTEVURUQgCT0gMzYzNTI2LAkvKiBFbnRyeSBpcyBkZWxldGVkIChzb2Z0IGRlbGV0ZSkgKi8KCUFGU1ZMX0JBRE5BTUUgCQk9IDM2MzUyNywJLyogVm9sdW1lIG5hbWUgaXMgaWxsZWdhbCAqLwoJQUZTVkxfQkFESU5ERVggCQk9IDM2MzUyOCwJLyogSW5kZXggaXMgb3V0IG9mIHJhbmdlICovCglBRlNWTF9CQURWT0xUWVBFIAk9IDM2MzUyOSwJLyogQmFkIHZvbHVtZSB0eXBlICovCglBRlNWTF9CQURTRVJWRVIgCT0gMzYzNTMwLAkvKiBJbGxlZ2FsIHNlcnZlciBudW1iZXIgKG91dCBvZiByYW5nZSkgKi8KCUFGU1ZMX0JBRFBBUlRJVElPTiAJPSAzNjM1MzEsCS8qIEJhZCBwYXJ0aXRpb24gbnVtYmVyICovCglBRlNWTF9SRVBTRlVMTCAJCT0gMzYzNTMyLAkvKiBSdW4gb3V0IG9mIHNwYWNlIGZvciBSZXBsaWNhdGlvbiBzaXRlcyAqLwoJQUZTVkxfTk9SRVBTRVJWRVIgCT0gMzYzNTMzLAkvKiBObyBzdWNoIFJlcGxpY2F0aW9uIHNlcnZlciBzaXRlIGV4aXN0cyAqLwoJQUZTVkxfRFVQUkVQU0VSVkVSIAk9IDM2MzUzNCwJLyogUmVwbGljYXRpb24gc2l0ZSBhbHJlYWR5IGV4aXN0cyAqLwoJQUZTVkxfUldOT1RGT1VORCAJPSAzNjM1MzUsCS8qIFBhcmVudCBSL1cgZW50cnkgbm90IGZvdW5kICovCglBRlNWTF9CQURSRUZDT1VOVCAJPSAzNjM1MzYsCS8qIElsbGVnYWwgUmVmZXJlbmNlIENvdW50IG51bWJlciAqLwoJQUZTVkxfU0laRUVYQ0VFREVEIAk9IDM2MzUzNywJLyogVmwgc2l6ZSBmb3IgYXR0cmlidXRlcyBleGNlZWRlZCAqLwoJQUZTVkxfQkFERU5UUlkgCQk9IDM2MzUzOCwJLyogQmFkIGluY29taW5nIHZsIGVudHJ5ICovCglBRlNWTF9CQURWT0xJREJVTVAgCT0gMzYzNTM5LAkvKiBJbGxlZ2FsIG1heCB2b2xpZCBpbmNyZW1lbnQgKi8KCUFGU1ZMX0lEQUxSRUFEWUhBU0hFRCAJPSAzNjM1NDAsCS8qIFJPL0JBQ0sgaWQgYWxyZWFkeSBoYXNoZWQgKi8KCUFGU1ZMX0VOVFJZTE9DS0VEIAk9IDM2MzU0MSwJLyogVmwgZW50cnkgaXMgYWxyZWFkeSBsb2NrZWQgKi8KCUFGU1ZMX0JBRFZPTE9QRVIgCT0gMzYzNTQyLAkvKiBCYWQgdm9sdW1lIG9wZXJhdGlvbiBjb2RlICovCglBRlNWTF9CQURSRUxMT0NLVFlQRSAJPSAzNjM1NDMsCS8qIEJhZCByZWxlYXNlIGxvY2sgdHlwZSAqLwoJQUZTVkxfUkVSRUxFQVNFIAk9IDM2MzU0NCwJLyogU3RhdHVzIHJlcG9ydDogbGFzdCByZWxlYXNlIHdhcyBhYm9ydGVkICovCglBRlNWTF9CQURTRVJWRVJGTEFHIAk9IDM2MzU0NSwJLyogSW52YWxpZCByZXBsaWNhdGlvbiBzaXRlIHNlcnZlciCwYWcgKi8KCUFGU1ZMX1BFUk0gCQk9IDM2MzU0NiwJLyogTm8gcGVybWlzc2lvbiBhY2Nlc3MgKi8KCUFGU1ZMX05PTUVNIAkJPSAzNjM1NDcsCS8qIG1hbGxvYy9yZWFsbG9jIGZhaWxlZCB0byBhbGxvYyBlbm91Z2ggbWVtb3J5ICovCn07CgovKiBtYXBzIHRvICJzdHJ1Y3QgdmxkYmVudHJ5IiBpbiB2dmwtc3BlYy5wZGYgKi8Kc3RydWN0IGFmc192bGRiZW50cnkgewoJY2hhcgkJbmFtZVs2NV07CQkvKiBuYW1lIG9mIHZvbHVtZSAoaW5jbHVkaW5nIE5VTCBjaGFyKSAqLwoJYWZzX3ZvbHR5cGVfdAl0eXBlOwkJCS8qIHZvbHVtZSB0eXBlICovCgl1bnNpZ25lZAludW1fc2VydmVyczsJCS8qIG51bSBzZXJ2ZXJzIHRoYXQgaG9sZCBpbnN0YW5jZXMgb2YgdGhpcyB2b2wgKi8KCXVuc2lnbmVkCWNsb25lX2lkOwkJLyogY2xvbmluZyBJRCAqLwoKCXVuc2lnbmVkCWZsYWdzOwojZGVmaW5lIEFGU19WTEZfUldFWElTVFMJMHgxMDAwCQkvKiBSL1cgdm9sdW1lIGV4aXN0cyAqLwojZGVmaW5lIEFGU19WTEZfUk9FWElTVFMJMHgyMDAwCQkvKiBSL08gdm9sdW1lIGV4aXN0cyAqLwojZGVmaW5lIEFGU19WTEZfQkFDS0VYSVNUUwkweDQwMDAJCS8qIGJhY2t1cCB2b2x1bWUgZXhpc3RzICovCgoJYWZzX3ZvbGlkX3QJdm9sdW1lX2lkc1szXTsJCS8qIHZvbHVtZSBJRHMgKi8KCglzdHJ1Y3QgewoJCXN0cnVjdCBpbl9hZGRyCWFkZHI7CQkvKiBzZXJ2ZXIgYWRkcmVzcyAqLwoJCXVuc2lnbmVkCXBhcnRpdGlvbjsJLyogcGFydGl0aW9uIElEIG9uIHRoaXMgc2VydmVyICovCgkJdW5zaWduZWQJZmxhZ3M7CQkvKiBzZXJ2ZXIgc3BlY2lmaWMgZmxhZ3MgKi8KI2RlZmluZSBBRlNfVkxTRl9ORVdSRVBTSVRFCTB4MDAwMQkvKiB1bnVzZWQgKi8KI2RlZmluZSBBRlNfVkxTRl9ST1ZPTAkJMHgwMDAyCS8qIHRoaXMgc2VydmVyIGhvbGRzIGEgUi9PIGluc3RhbmNlIG9mIHRoZSB2b2x1bWUgKi8KI2RlZmluZSBBRlNfVkxTRl9SV1ZPTAkJMHgwMDA0CS8qIHRoaXMgc2VydmVyIGhvbGRzIGEgUi9XIGluc3RhbmNlIG9mIHRoZSB2b2x1bWUgKi8KI2RlZmluZSBBRlNfVkxTRl9CQUNLVk9MCTB4MDAwOAkvKiB0aGlzIHNlcnZlciBob2xkcyBhIGJhY2t1cCBpbnN0YW5jZSBvZiB0aGUgdm9sdW1lICovCgl9IHNlcnZlcnNbOF07Cgp9OwoKLyogbG9vayB1cCBhIHZvbHVtZSBsb2NhdGlvbiBkYXRhYmFzZSBlbnRyeSBieSBuYW1lICovCmV4dGVybiBpbnQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X25hbWUoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKCQkJCSAgICAgIGNvbnN0IGNoYXIgKnZvbG5hbWUsCgkJCQkgICAgICB1bnNpZ25lZCB2b2xuYW1lc3osCgkJCQkgICAgICBzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiAqZW50cnkpOwoKLyogbG9vayB1cCBhIHZvbHVtZSBsb2NhdGlvbiBkYXRhYmFzZSBlbnRyeSBieSBJRCAqLwpleHRlcm4gaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZChzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAoJCQkJICAgIGFmc192b2xpZF90CXZvbGlkLAoJCQkJICAgIGFmc192b2x0eXBlX3Qgdm9sdHlwZSwKCQkJCSAgICBzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiAqZW50cnkpOwoKZXh0ZXJuIGludCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWRfYXN5bmMoc3RydWN0IGFmc19hc3luY19vcCAqb3AsCgkJCQkJICBhZnNfdm9saWRfdCB2b2xpZCwKCQkJCQkgIGFmc192b2x0eXBlX3Qgdm9sdHlwZSk7CgpleHRlcm4gaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZF9hc3luYzIoc3RydWN0IGFmc19hc3luY19vcCAqb3AsCgkJCQkJICAgc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKmVudHJ5KTsKCiNlbmRpZiAvKiBfTElOVVhfQUZTX1ZMQ0xJRU5UX0ggKi8K